freedreno/a6xx: fix corrupted uniforms
authorRob Clark <robdclark@gmail.com>
Fri, 14 Dec 2018 19:35:54 +0000 (14:35 -0500)
committerRob Clark <robdclark@gmail.com>
Fri, 14 Dec 2018 20:01:30 +0000 (15:01 -0500)
For older gen's fd_wfi() is used to conditionally insert a WFI if there
hasn't already been one since last draw.  But this doesn't work out well
with stateobj since the order the stateobj is evaluated might not be
what you expect.  (Ie. stateobj might not be evaluated until a later
draw if there is no geometry from the current draw in a given tile.)

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

index c4d43c22f992027596a779ba6d2c2d878a254c00..245353ee16279feca77e8a815e5222b8e43cd704 100644 (file)
@@ -741,7 +741,6 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                OUT_PKT4(ring, REG_A6XX_VFD_UNKNOWN_A008, 1);
                OUT_RING(ring, 0);
 
-
                OUT_PKT4(ring, REG_A6XX_PC_PRIMITIVE_CNTL_0, 1);
                OUT_RING(ring, rasterizer->pc_primitive_cntl |
                                 COND(emit->info->primitive_restart && emit->info->index_size,
@@ -769,6 +768,7 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                struct fd_ringbuffer *vsconstobj = fd_submit_new_ringbuffer(
                                ctx->batch->submit, 0x1000, FD_RINGBUFFER_STREAMING);
 
+               OUT_WFI5(vsconstobj);
                ir3_emit_vs_consts(vp, vsconstobj, ctx, emit->info);
                fd6_emit_add_group(emit, vsconstobj, FD6_GROUP_VS_CONST, 0x7);
                fd_ringbuffer_del(vsconstobj);
@@ -778,6 +778,7 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
                struct fd_ringbuffer *fsconstobj = fd_submit_new_ringbuffer(
                                ctx->batch->submit, 0x1000, FD_RINGBUFFER_STREAMING);
 
+               OUT_WFI5(fsconstobj);
                ir3_emit_fs_consts(fp, fsconstobj, ctx);
                fd6_emit_add_group(emit, fsconstobj, FD6_GROUP_FS_CONST, 0x6);
                fd_ringbuffer_del(fsconstobj);