Mesa (main): zink: handle bogus xfb draws
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jan 26 04:12:37 UTC 2022
Module: Mesa
Branch: main
Commit: e4218e5c4d6a47e4db5be8bed5eeb9f6d38f814a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=e4218e5c4d6a47e4db5be8bed5eeb9f6d38f814a
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Jan 18 17:39:05 2022 -0500
zink: handle bogus xfb draws
drawing unpopulated xfb data is legal(?) and tested in cts, and the correct
operation is to just drop the draw, so do that here
fixes (nvidia):
GTF-GL46.gtf40.GL3Tests.transform_feedback2.transform_feedback2_api
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14694>
---
src/gallium/drivers/zink/zink_draw.cpp | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp
index c3f5ab16134..2aafffeafc1 100644
--- a/src/gallium/drivers/zink/zink_draw.cpp
+++ b/src/gallium/drivers/zink/zink_draw.cpp
@@ -840,13 +840,19 @@ zink_draw(struct pipe_context *pctx,
}
} else {
if (so_target && screen->info.tf_props.transformFeedbackDraw) {
- if (needs_drawid)
- update_drawid(ctx, drawid_offset);
- zink_batch_reference_resource_rw(batch, zink_resource(so_target->base.buffer), false);
- zink_batch_reference_resource_rw(batch, zink_resource(so_target->counter_buffer), true);
- VKCTX(CmdDrawIndirectByteCountEXT)(batch->state->cmdbuf, dinfo->instance_count, dinfo->start_instance,
- zink_resource(so_target->counter_buffer)->obj->buffer, so_target->counter_buffer_offset, 0,
- MIN2(so_target->stride, screen->info.tf_props.maxTransformFeedbackBufferDataStride));
+ /* GTF-GL46.gtf40.GL3Tests.transform_feedback2.transform_feedback2_api attempts a bogus xfb
+ * draw using a streamout target that has no data
+ * to avoid hanging the gpu, reject any such draws
+ */
+ if (so_target->counter_buffer_valid) {
+ if (needs_drawid)
+ update_drawid(ctx, drawid_offset);
+ zink_batch_reference_resource_rw(batch, zink_resource(so_target->base.buffer), false);
+ zink_batch_reference_resource_rw(batch, zink_resource(so_target->counter_buffer), true);
+ VKCTX(CmdDrawIndirectByteCountEXT)(batch->state->cmdbuf, dinfo->instance_count, dinfo->start_instance,
+ zink_resource(so_target->counter_buffer)->obj->buffer, so_target->counter_buffer_offset, 0,
+ MIN2(so_target->stride, screen->info.tf_props.maxTransformFeedbackBufferDataStride));
+ }
} else if (dindirect && dindirect->buffer) {
assert(num_draws == 1);
if (needs_drawid)
More information about the mesa-commit
mailing list