freedreno/a3xx: add back a few stalls
authorRob Clark <robdclark@gmail.com>
Sun, 20 Jul 2014 15:26:56 +0000 (11:26 -0400)
committerRob Clark <robclark@freedesktop.org>
Wed, 23 Jul 2014 13:03:09 +0000 (09:03 -0400)
Technically we should not need these.  CP_LOAD_STATE can be pipelined.
But removing them broke a few piglit tests, like fbo-depth-
GL_DEPTH_COMPONENT24-readpixels.  I expect these are just masking a
problem elsewhere, or perhaps they are only needed under some more
specific circumstances.  But until that is understood properly, give
back a bit of the perf boost we got from c63450e8.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c

index f77c7226b5b20a11e2d22ca3b27f85baf1a6645e..6bbd9bf63309bd92eb0a6964cab4dd33778085a7 100644 (file)
@@ -486,9 +486,15 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                fd3_program_emit(ring, prog, key);
        }
 
+       /* TODO we should not need this or fd_wfi() before emit_constants():
+        */
+       OUT_PKT3(ring, CP_EVENT_WRITE, 1);
+       OUT_RING(ring, HLSQ_FLUSH);
+
        if ((dirty & (FD_DIRTY_PROG | FD_DIRTY_CONSTBUF)) &&
                        /* evil hack to deal sanely with clear path: */
                        (prog == &ctx->prog)) {
+               fd_wfi(ctx, ring);
                emit_constants(ring,  SB_VERT_SHADER,
                                &ctx->constbuf[PIPE_SHADER_VERTEX],
                                (prog->dirty & FD_SHADER_DIRTY_VP) ? vp : NULL);
@@ -525,6 +531,8 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                                A3XX_RB_BLEND_ALPHA_FLOAT(bcolor->color[3]));
        }
 
+       if (dirty & (FD_DIRTY_VERTTEX | FD_DIRTY_FRAGTEX))
+               fd_wfi(ctx, ring);
 
        if (dirty & FD_DIRTY_VERTTEX) {
                if (vp->has_samp)