Mesa (master): freedreno/a6xx: add support for ARB_shader_stencil_export

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 27 17:43:17 UTC 2020


Module: Mesa
Branch: master
Commit: 160a0f255194953b9c6cd3d305a4432645c0b60b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=160a0f255194953b9c6cd3d305a4432645c0b60b

Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date:   Thu Nov 26 19:57:26 2020 +0200

freedreno/a6xx: add support for ARB_shader_stencil_export

Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7810>

---

 src/gallium/drivers/freedreno/a6xx/fd6_emit.c    | 5 ++++-
 src/gallium/drivers/freedreno/a6xx/fd6_program.c | 6 ++++--
 src/gallium/drivers/freedreno/freedreno_screen.c | 2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c
index ca21d292da2..f04c84f2038 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c
@@ -589,7 +589,8 @@ compute_ztest_mode(struct fd6_emit *emit, bool lrz_valid)
 	if (fs->shader->nir->info.fs.early_fragment_tests)
 		return A6XX_EARLY_Z;
 
-	if (fs->no_earlyz || fs->writes_pos || !zsa->base.depth.enabled) {
+	if (fs->no_earlyz || fs->writes_pos || !zsa->base.depth.enabled ||
+			fs->writes_stencilref) {
 		return A6XX_LATE_Z;
 	} else if ((fs->has_kill || zsa->alpha_test) &&
 			(zsa->base.depth.writemask || !pfb->zsbuf)) {
@@ -974,6 +975,8 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
 		OUT_RING(ring, COND(fs->writes_pos, A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_Z) |
 				COND(fs->writes_smask && pfb->samples > 1,
 						A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_SAMPMASK) |
+				COND(fs->writes_stencilref,
+						A6XX_RB_FS_OUTPUT_CNTL0_FRAG_WRITES_STENCILREF) |
 				COND(blend->use_dual_src_blend,
 						A6XX_RB_FS_OUTPUT_CNTL0_DUAL_COLOR_IN_ENABLE));
 		OUT_RING(ring, A6XX_RB_FS_OUTPUT_CNTL1_MRT(nr));
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c
index 512a016a98d..f372123224a 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c
@@ -351,6 +351,7 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx,
 	uint32_t clip0_regid, clip1_regid;
 	uint32_t face_regid, coord_regid, zwcoord_regid, samp_id_regid;
 	uint32_t smask_in_regid, smask_regid;
+	uint32_t stencilref_regid;
 	uint32_t vertex_regid, instance_regid, layer_regid, primitive_regid;
 	uint32_t hs_invocation_regid;
 	uint32_t tess_coord_x_regid, tess_coord_y_regid, hs_patch_regid, ds_patch_regid;
@@ -440,6 +441,7 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx,
 	zwcoord_regid   = next_regid(coord_regid, 2);
 	posz_regid      = ir3_find_output_regid(fs, FRAG_RESULT_DEPTH);
 	smask_regid     = ir3_find_output_regid(fs, FRAG_RESULT_SAMPLE_MASK);
+	stencilref_regid = ir3_find_output_regid(fs, FRAG_RESULT_STENCIL);
 	for (unsigned i = 0; i < ARRAY_SIZE(ij_regid); i++)
 		ij_regid[i] = ir3_find_sysval_regid(fs, SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL + i);
 
@@ -489,9 +491,9 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx,
 	OUT_PKT4(ring, REG_A6XX_SP_FS_OUTPUT_CNTL0, 1);
 	OUT_RING(ring, A6XX_SP_FS_OUTPUT_CNTL0_DEPTH_REGID(posz_regid) |
 			 A6XX_SP_FS_OUTPUT_CNTL0_SAMPMASK_REGID(smask_regid) |
+			 A6XX_SP_FS_OUTPUT_CNTL0_STENCILREF_REGID(stencilref_regid) |
 			 COND(fs_has_dual_src_color,
-					A6XX_SP_FS_OUTPUT_CNTL0_DUAL_COLOR_IN_ENABLE) |
-			 0xfc000000);
+					A6XX_SP_FS_OUTPUT_CNTL0_DUAL_COLOR_IN_ENABLE));
 
 	enum a3xx_threadsize vssz;
 	if (ds || hs) {
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index b437f0fb853..2389e17fd0f 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -466,6 +466,8 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 		return screen->has_syncobj;
 	case PIPE_CAP_CULL_DISTANCE:
 		return is_a6xx(screen);
+	case PIPE_CAP_SHADER_STENCIL_EXPORT:
+		return is_a6xx(screen);
 	default:
 		return u_pipe_screen_get_param_defaults(pscreen, param);
 	}



More information about the mesa-commit mailing list