Mesa (master): radv: set the predication boolean as 32-bit if necessary

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Dec 7 09:45:49 UTC 2020


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Thu Dec  3 12:42:12 2020 +0100

radv: set the predication boolean as 32-bit if necessary

CTS is missing tests.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7897>

---

 src/amd/common/sid.h                  | 1 +
 src/amd/vulkan/radv_cmd_buffer.c      | 8 ++++++--
 src/amd/vulkan/radv_meta_fast_clear.c | 3 ++-
 src/amd/vulkan/radv_private.h         | 4 +++-
 src/amd/vulkan/si_cmd_buffer.c        | 7 +++++--
 5 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/amd/common/sid.h b/src/amd/common/sid.h
index a55598ce9c9..be11c712cce 100644
--- a/src/amd/common/sid.h
+++ b/src/amd/common/sid.h
@@ -81,6 +81,7 @@
 #define PREDICATION_OP_ZPASS     0x1
 #define PREDICATION_OP_PRIMCOUNT 0x2
 #define PREDICATION_OP_BOOL64    0x3
+#define PREDICATION_OP_BOOL32    0x4
 
 #define PRED_OP(x) ((x) << 16)
 
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 4ccb86b8178..cf6652d918f 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -6527,6 +6527,7 @@ void radv_CmdBeginConditionalRenderingEXT(
 	RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
 	RADV_FROM_HANDLE(radv_buffer, buffer, pConditionalRenderingBegin->buffer);
 	struct radeon_cmdbuf *cs = cmd_buffer->cs;
+	unsigned pred_op = PREDICATION_OP_BOOL32;
 	bool draw_visible = true;
 	uint64_t va;
 
@@ -6592,14 +6593,16 @@ void radv_CmdBeginConditionalRenderingEXT(
 		radeon_emit(cs, 0);
 
 		va = pred_va;
+		pred_op = PREDICATION_OP_BOOL64;
 	}
 
 	/* Enable predication for this command buffer. */
-	si_emit_set_predication_state(cmd_buffer, draw_visible, va);
+	si_emit_set_predication_state(cmd_buffer, draw_visible, pred_op, va);
 	cmd_buffer->state.predicating = true;
 
 	/* Store conditional rendering user info. */
 	cmd_buffer->state.predication_type = draw_visible;
+	cmd_buffer->state.predication_op = pred_op;
 	cmd_buffer->state.predication_va = va;
 }
 
@@ -6609,11 +6612,12 @@ void radv_CmdEndConditionalRenderingEXT(
 	RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
 
 	/* Disable predication for this command buffer. */
-	si_emit_set_predication_state(cmd_buffer, false, 0);
+	si_emit_set_predication_state(cmd_buffer, false, 0, 0);
 	cmd_buffer->state.predicating = false;
 
 	/* Reset conditional rendering user info. */
 	cmd_buffer->state.predication_type = -1;
+	cmd_buffer->state.predication_op = 0;
 	cmd_buffer->state.predication_va = 0;
 }
 
diff --git a/src/amd/vulkan/radv_meta_fast_clear.c b/src/amd/vulkan/radv_meta_fast_clear.c
index 1403e35b4f9..e20d561c5d7 100644
--- a/src/amd/vulkan/radv_meta_fast_clear.c
+++ b/src/amd/vulkan/radv_meta_fast_clear.c
@@ -572,7 +572,7 @@ radv_emit_set_predication_state_from_image(struct radv_cmd_buffer *cmd_buffer,
 		va += pred_offset;
 	}
 
-	si_emit_set_predication_state(cmd_buffer, true, va);
+	si_emit_set_predication_state(cmd_buffer, true, PREDICATION_OP_BOOL64, va);
 }
 
 static void
@@ -771,6 +771,7 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,
 			/* Restore previous conditional rendering user state. */
 			si_emit_set_predication_state(cmd_buffer,
 						      cmd_buffer->state.predication_type,
+						      cmd_buffer->state.predication_op,
 						      cmd_buffer->state.predication_va);
 		}
 	}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 80f8f04d809..82cddae8b29 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1376,6 +1376,7 @@ struct radv_cmd_state {
 	bool dma_is_busy;
 
 	/* Conditional rendering info. */
+	uint8_t predication_op; /* 32-bit or 64-bit predicate value */
 	int predication_type; /* -1: disabled, 0: normal, 1: inverted */
 	uint64_t predication_va;
 
@@ -1513,7 +1514,8 @@ void si_cs_emit_cache_flush(struct radeon_cmdbuf *cs,
 			    uint64_t gfx9_eop_bug_va);
 void si_emit_cache_flush(struct radv_cmd_buffer *cmd_buffer);
 void si_emit_set_predication_state(struct radv_cmd_buffer *cmd_buffer,
-				   bool inverted, uint64_t va);
+				   bool draw_visible, unsigned pred_op,
+				   uint64_t va);
 void si_cp_dma_buffer_copy(struct radv_cmd_buffer *cmd_buffer,
 			   uint64_t src_va, uint64_t dest_va,
 			   uint64_t size);
diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c
index c20a39a01bb..0d83ca2d8cd 100644
--- a/src/amd/vulkan/si_cmd_buffer.c
+++ b/src/amd/vulkan/si_cmd_buffer.c
@@ -1532,12 +1532,15 @@ si_emit_cache_flush(struct radv_cmd_buffer *cmd_buffer)
 /* sets the CP predication state using a boolean stored at va */
 void
 si_emit_set_predication_state(struct radv_cmd_buffer *cmd_buffer,
-			      bool draw_visible, uint64_t va)
+			      bool draw_visible, unsigned pred_op, uint64_t va)
 {
 	uint32_t op = 0;
 
 	if (va) {
-		op = PRED_OP(PREDICATION_OP_BOOL64);
+		assert(pred_op == PREDICATION_OP_BOOL32 ||
+		       pred_op == PREDICATION_OP_BOOL64);
+
+		op = PRED_OP(pred_op);
 
 		/* PREDICATION_DRAW_VISIBLE means that if the 32-bit value is
 		 * zero, all rendering commands are discarded. Otherwise, they



More information about the mesa-commit mailing list