Mesa (main): v3d: enable early Z/S clears
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 4 08:05:21 UTC 2022
Module: Mesa
Branch: main
Commit: 07cfa2bd96e58e059a35ac2a4e03f7e093144bf4
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=07cfa2bd96e58e059a35ac2a4e03f7e093144bf4
Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date: Tue Apr 19 16:52:44 2022 +0200
v3d: enable early Z/S clears
This performance optimization can be enabled if we are clearing Z/S
buffer, and not storing or loading it.
v2:
- Add assertion on depth/stencil job loads (Iago)
Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16166>
---
src/gallium/drivers/v3d/v3d_context.h | 5 +++++
src/gallium/drivers/v3d/v3dx_rcl.c | 14 ++++++++++----
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h
index d8c2191074e..5bfe53ee6fc 100644
--- a/src/gallium/drivers/v3d/v3d_context.h
+++ b/src/gallium/drivers/v3d/v3d_context.h
@@ -470,6 +470,11 @@ struct v3d_job {
*/
enum v3d_ez_state first_ez_state;
+ /**
+ * If this job has been configured to use early Z/S clear.
+ */
+ bool early_zs_clear;
+
/**
* Number of draw calls (not counting full buffer clears) queued in
* the current job.
diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c
index 088d454e95a..7c85525bc60 100644
--- a/src/gallium/drivers/v3d/v3dx_rcl.c
+++ b/src/gallium/drivers/v3d/v3dx_rcl.c
@@ -245,6 +245,7 @@ v3d_rcl_emit_loads(struct v3d_job *job, struct v3d_cl *cl, int layer)
if ((loads_pending & PIPE_CLEAR_DEPTHSTENCIL) &&
(V3D_VERSION >= 40 ||
(job->zsbuf && job->zsbuf->texture->nr_samples > 1))) {
+ assert(!job->early_zs_clear);
struct pipe_surface *src = job->bbuf ? job->bbuf : job->zsbuf;
struct v3d_resource *rsc = v3d_resource(src->texture);
@@ -345,6 +346,7 @@ v3d_rcl_emit_stores(struct v3d_job *job, struct v3d_cl *cl, int layer)
if (job->store & PIPE_CLEAR_DEPTHSTENCIL && job->zsbuf &&
!(V3D_VERSION < 40 && job->zsbuf->texture->nr_samples <= 1)) {
+ assert(!job->early_zs_clear);
struct v3d_resource *rsc = v3d_resource(job->zsbuf->texture);
if (rsc->separate_stencil) {
if (job->store & PIPE_CLEAR_DEPTH) {
@@ -418,7 +420,7 @@ v3d_rcl_emit_stores(struct v3d_job *job, struct v3d_cl *cl, int layer)
*/
if (job->clear) {
cl_emit(cl, CLEAR_TILE_BUFFERS, clear) {
- clear.clear_z_stencil_buffer = true;
+ clear.clear_z_stencil_buffer = !job->early_zs_clear;
clear.clear_all_render_targets = true;
}
}
@@ -657,7 +659,7 @@ emit_render_layer(struct v3d_job *job, uint32_t layer)
}
if (i == 0 || do_double_initial_tile_clear(job)) {
cl_emit(&job->rcl, CLEAR_TILE_BUFFERS, clear) {
- clear.clear_z_stencil_buffer = true;
+ clear.clear_z_stencil_buffer = !job->early_zs_clear;
clear.clear_all_render_targets = true;
}
}
@@ -724,9 +726,13 @@ v3dX(emit_rcl)(struct v3d_job *job)
struct v3d_surface *surf = v3d_surface(job->zsbuf);
config.internal_depth_type = surf->internal_type;
}
-#endif /* V3D_VERSION >= 40 */
- /* XXX: Early D/S clear */
+ job->early_zs_clear = (job->clear & PIPE_CLEAR_DEPTHSTENCIL) &&
+ !(job->load & PIPE_CLEAR_DEPTHSTENCIL) &&
+ !(job->store & PIPE_CLEAR_DEPTHSTENCIL);
+
+ config.early_depth_stencil_clear = job->early_zs_clear;
+#endif /* V3D_VERSION >= 40 */
switch (job->first_ez_state) {
case V3D_EZ_UNDECIDED:
More information about the mesa-commit
mailing list