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@igalia.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16166>
This commit is contained in:

committed by
Marge Bot

parent
4dec4ba87d
commit
07cfa2bd96
@@ -470,6 +470,11 @@ struct v3d_job {
|
|||||||
*/
|
*/
|
||||||
enum v3d_ez_state first_ez_state;
|
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
|
* Number of draw calls (not counting full buffer clears) queued in
|
||||||
* the current job.
|
* the current job.
|
||||||
|
@@ -245,6 +245,7 @@ v3d_rcl_emit_loads(struct v3d_job *job, struct v3d_cl *cl, int layer)
|
|||||||
if ((loads_pending & PIPE_CLEAR_DEPTHSTENCIL) &&
|
if ((loads_pending & PIPE_CLEAR_DEPTHSTENCIL) &&
|
||||||
(V3D_VERSION >= 40 ||
|
(V3D_VERSION >= 40 ||
|
||||||
(job->zsbuf && job->zsbuf->texture->nr_samples > 1))) {
|
(job->zsbuf && job->zsbuf->texture->nr_samples > 1))) {
|
||||||
|
assert(!job->early_zs_clear);
|
||||||
struct pipe_surface *src = job->bbuf ? job->bbuf : job->zsbuf;
|
struct pipe_surface *src = job->bbuf ? job->bbuf : job->zsbuf;
|
||||||
struct v3d_resource *rsc = v3d_resource(src->texture);
|
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 &&
|
if (job->store & PIPE_CLEAR_DEPTHSTENCIL && job->zsbuf &&
|
||||||
!(V3D_VERSION < 40 && job->zsbuf->texture->nr_samples <= 1)) {
|
!(V3D_VERSION < 40 && job->zsbuf->texture->nr_samples <= 1)) {
|
||||||
|
assert(!job->early_zs_clear);
|
||||||
struct v3d_resource *rsc = v3d_resource(job->zsbuf->texture);
|
struct v3d_resource *rsc = v3d_resource(job->zsbuf->texture);
|
||||||
if (rsc->separate_stencil) {
|
if (rsc->separate_stencil) {
|
||||||
if (job->store & PIPE_CLEAR_DEPTH) {
|
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) {
|
if (job->clear) {
|
||||||
cl_emit(cl, CLEAR_TILE_BUFFERS, 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;
|
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)) {
|
if (i == 0 || do_double_initial_tile_clear(job)) {
|
||||||
cl_emit(&job->rcl, CLEAR_TILE_BUFFERS, clear) {
|
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;
|
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);
|
struct v3d_surface *surf = v3d_surface(job->zsbuf);
|
||||||
config.internal_depth_type = surf->internal_type;
|
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) {
|
switch (job->first_ez_state) {
|
||||||
case V3D_EZ_UNDECIDED:
|
case V3D_EZ_UNDECIDED:
|
||||||
|
Reference in New Issue
Block a user