broadcom/vc5: Handle sparsely populated SO target array.
authorEric Anholt <eric@anholt.net>
Tue, 20 Mar 2018 18:09:02 +0000 (11:09 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 21 Mar 2018 17:04:21 +0000 (10:04 -0700)
Fixes
GTF-GLES3.gtf.GL3Tests.transform_feedback.transform_feedback_state_variables

src/gallium/drivers/vc5/vc5_emit.c

index ae47fda81ffc85c2390c255d5f31b98460414d0c..e5a9e0e03a243f54be25a23441e9b7c70e1fe680 100644 (file)
@@ -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 {