freedreno/a6xx: move VS driverparams to it's own stateobj
authorRob Clark <robdclark@chromium.org>
Wed, 7 Aug 2019 18:34:03 +0000 (11:34 -0700)
committerRob Clark <robdclark@chromium.org>
Tue, 13 Aug 2019 15:11:26 +0000 (08:11 -0700)
If driver-params are required, we really should emit it on every draw
for correctness.  And if not required, we should emit a DISABLE so that
un-applied state updates from previous draws don't corrupt the const
state.

Signed-off-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_emit.c
src/gallium/drivers/freedreno/a6xx/fd6_emit.h

index 59e0a9780e078463f2c28b15fa8dfdd0d9c2f64c..49b653bdf8f0398618fbd6e38683ea0cc9ba67e1 100644 (file)
@@ -934,9 +934,6 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                ir3_emit_image_dims(ctx->screen, vp, vsconstobj,
                                &ctx->shaderimg[PIPE_SHADER_VERTEX]);
 
-               if (ir3_needs_vs_driver_params(vp))
-                       ir3_emit_vs_driver_params(vp, vsconstobj, ctx, emit->info);
-
                fd6_emit_take_group(emit, vsconstobj, FD6_GROUP_VS_CONST, 0x7);
        }
 
@@ -956,6 +953,16 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                fd6_emit_take_group(emit, fsconstobj, FD6_GROUP_FS_CONST, 0x6);
        }
 
+       /* if driver-params are needed, emit each time: */
+       if (ir3_needs_vs_driver_params(vp)) {
+               struct fd_ringbuffer *dpconstobj = fd_submit_new_ringbuffer(
+                               ctx->batch->submit, IR3_DP_VS_COUNT * 4, FD_RINGBUFFER_STREAMING);
+               ir3_emit_vs_driver_params(vp, dpconstobj, ctx, emit->info);
+               fd6_emit_take_group(emit, dpconstobj, FD6_GROUP_VS_DRIVER_PARAMS, 0x7);
+       } else {
+               fd6_emit_take_group(emit, NULL, FD6_GROUP_VS_DRIVER_PARAMS, 0x7);
+       }
+
        struct ir3_stream_output_info *info = &vp->shader->stream_output;
        if (info->num_outputs)
                fd6_emit_streamout(ring, emit, info);
@@ -1054,7 +1061,8 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                OUT_PKT7(ring, CP_SET_DRAW_STATE, 3 * emit->num_groups);
                for (unsigned i = 0; i < emit->num_groups; i++) {
                        struct fd6_state_group *g = &emit->groups[i];
-                       unsigned n = fd_ringbuffer_size(g->stateobj) / 4;
+                       unsigned n = g->stateobj ?
+                               fd_ringbuffer_size(g->stateobj) / 4 : 0;
 
                        if (n == 0) {
                                OUT_RING(ring, CP_SET_DRAW_STATE__0_COUNT(0) |
@@ -1070,7 +1078,8 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                                OUT_RB(ring, g->stateobj);
                        }
 
-                       fd_ringbuffer_del(g->stateobj);
+                       if (g->stateobj)
+                               fd_ringbuffer_del(g->stateobj);
                }
                emit->num_groups = 0;
        }
index bc66884fb5a2398434b636f0c06dfaba29ebef50..490cffb95b52bc30009054e5d567e290f8607483 100644 (file)
@@ -51,6 +51,7 @@ enum fd6_state_id {
        FD6_GROUP_VBO,
        FD6_GROUP_VS_CONST,
        FD6_GROUP_FS_CONST,
+       FD6_GROUP_VS_DRIVER_PARAMS,
        FD6_GROUP_VS_TEX,
        FD6_GROUP_FS_TEX,
        FD6_GROUP_IBO,