summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/vc5
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-03-30 16:43:51 -0700
committerEric Anholt <[email protected]>2018-04-12 11:20:50 -0700
commitb946218c4894bd30d8e31b27afff4ea592d0812b (patch)
tree4bc7533f99f18ce3ac821815b446734070fc5824 /src/gallium/drivers/vc5
parentec60559f97dc13d85fb197e2dd99827e12fff371 (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.c36
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);
}
}