summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-03-20 11:09:02 -0700
committerEric Anholt <[email protected]>2018-03-21 10:04:21 -0700
commit024e814dee20a58f1d11129ffb2b4497beeacca7 (patch)
treef1fc9f3136e684ce8214c29fb9dbb0c675e56983
parentf735ac6b1ce181015db3dde698c31580b92d4725 (diff)
broadcom/vc5: Handle sparsely populated SO target array.
Fixes GTF-GLES3.gtf.GL3Tests.transform_feedback.transform_feedback_state_variables
-rw-r--r--src/gallium/drivers/vc5/vc5_emit.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/gallium/drivers/vc5/vc5_emit.c b/src/gallium/drivers/vc5/vc5_emit.c
index ae47fda81ff..e5a9e0e03a2 100644
--- a/src/gallium/drivers/vc5/vc5_emit.c
+++ b/src/gallium/drivers/vc5/vc5_emit.c
@@ -597,10 +597,13 @@ v3dX(emit_state)(struct pipe_context *pctx)
for (int i = 0; i < so->num_targets; i++) {
const struct pipe_stream_output_target *target =
so->targets[i];
- struct vc5_resource *rsc =
- vc5_resource(target->buffer);
+ struct vc5_resource *rsc = target ?
+ vc5_resource(target->buffer) : NULL;
#if V3D_VERSION >= 40
+ if (!target)
+ continue;
+
cl_emit(&job->bcl, TRANSFORM_FEEDBACK_BUFFER, output) {
output.buffer_address =
cl_address(rsc->bo,
@@ -611,13 +614,17 @@ v3dX(emit_state)(struct pipe_context *pctx)
}
#else /* V3D_VERSION < 40 */
cl_emit(&job->bcl, TRANSFORM_FEEDBACK_OUTPUT_ADDRESS, output) {
- output.address =
- cl_address(rsc->bo,
- target->buffer_offset);
+ if (target) {
+ output.address =
+ cl_address(rsc->bo,
+ target->buffer_offset);
+ }
};
#endif /* V3D_VERSION < 40 */
- vc5_job_add_write_resource(vc5->job,
- target->buffer);
+ if (target) {
+ vc5_job_add_write_resource(vc5->job,
+ target->buffer);
+ }
/* XXX: buffer_size? */
}
} else {