diff options
author | Eric Anholt <[email protected]> | 2018-03-30 16:43:51 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-04-12 11:20:50 -0700 |
commit | b946218c4894bd30d8e31b27afff4ea592d0812b (patch) | |
tree | 4bc7533f99f18ce3ac821815b446734070fc5824 /src/gallium/drivers/vc5 | |
parent | ec60559f97dc13d85fb197e2dd99827e12fff371 (diff) |
broadcom/vc5: Refactor the implicit coords/stores_pending logic.
Since I just fixed a bug due to forgetting to do these right, do it once
in the helper func.
Diffstat (limited to 'src/gallium/drivers/vc5')
-rw-r--r-- | src/gallium/drivers/vc5/vc5_rcl.c | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/src/gallium/drivers/vc5/vc5_rcl.c b/src/gallium/drivers/vc5/vc5_rcl.c index 5ffdfd9ca39..0f9f7fb1b18 100644 --- a/src/gallium/drivers/vc5/vc5_rcl.c +++ b/src/gallium/drivers/vc5/vc5_rcl.c @@ -83,7 +83,7 @@ load_general(struct vc5_cl *cl, struct pipe_surface *psurf, int buffer) static void store_general(struct vc5_job *job, struct vc5_cl *cl, struct pipe_surface *psurf, int buffer, - int pipe_bit, bool last_store, bool general_color_clear) + int pipe_bit, uint32_t *stores_pending, bool general_color_clear) { struct vc5_surface *surf = vc5_surface(psurf); bool separate_stencil = surf->separate_stencil && buffer == STENCIL; @@ -92,6 +92,9 @@ store_general(struct vc5_job *job, surf = vc5_surface(psurf); } + *stores_pending &= ~pipe_bit; + bool last_store = !(*stores_pending); + struct vc5_resource *rsc = vc5_resource(psurf->texture); rsc->writes++; @@ -146,6 +149,11 @@ store_general(struct vc5_job *job, surf->padded_height_of_output_image_in_uif_blocks; #endif /* V3D_VERSION < 40 */ } + + /* There must be a TILE_COORDINATES_IMPLICIT between each store. */ + if (V3D_VERSION < 40 && !last_store) { + cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords); + } } static int @@ -282,11 +290,8 @@ vc5_rcl_emit_stores(struct vc5_job *job, struct vc5_cl *cl) continue; } - stores_pending &= ~bit; store_general(job, cl, psurf, RENDER_TARGET_0 + i, bit, - !stores_pending, general_color_clear); - if (V3D_VERSION < 40 && stores_pending) - cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords); + &stores_pending, general_color_clear); } if (job->resolve & PIPE_CLEAR_DEPTHSTENCIL && job->zsbuf && @@ -294,38 +299,23 @@ vc5_rcl_emit_stores(struct vc5_job *job, struct vc5_cl *cl) struct vc5_resource *rsc = vc5_resource(job->zsbuf->texture); if (rsc->separate_stencil) { if (job->resolve & PIPE_CLEAR_DEPTH) { - stores_pending &= ~PIPE_CLEAR_DEPTH; store_general(job, cl, job->zsbuf, Z, PIPE_CLEAR_DEPTH, - !stores_pending, + &stores_pending, general_color_clear); - if (V3D_VERSION < 40 && stores_pending) { - cl_emit(cl, TILE_COORDINATES_IMPLICIT, - coords); - } } if (job->resolve & PIPE_CLEAR_STENCIL) { - stores_pending &= ~PIPE_CLEAR_STENCIL; store_general(job, cl, job->zsbuf, STENCIL, PIPE_CLEAR_STENCIL, - !stores_pending, + &stores_pending, general_color_clear); - if (V3D_VERSION < 40 && stores_pending) { - cl_emit(cl, TILE_COORDINATES_IMPLICIT, - coords); - } } } else { - stores_pending &= ~PIPE_CLEAR_DEPTHSTENCIL; store_general(job, cl, job->zsbuf, zs_buffer_from_pipe_bits(job->resolve), job->resolve & PIPE_CLEAR_DEPTHSTENCIL, - !stores_pending, general_color_clear); - if (V3D_VERSION < 40 && stores_pending) { - cl_emit(cl, TILE_COORDINATES_IMPLICIT, - coords); - } + &stores_pending, general_color_clear); } } |