Mesa (staging/19.3): ac: Handle invalid GFX10 format correctly in ac_get_tbuffer_format.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 11 19:45:57 UTC 2019


Module: Mesa
Branch: staging/19.3
Commit: 2f66f619c8e7c0cd2c6fa06321c53636a515f130
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2f66f619c8e7c0cd2c6fa06321c53636a515f130

Author: Timur Kristóf <timur.kristof at gmail.com>
Date:   Wed Nov  6 13:29:26 2019 +0100

ac: Handle invalid GFX10 format correctly in ac_get_tbuffer_format.

It happens that some games try to access a vertex buffer without
a valid format. This case was incorrectly handled by
ac_get_tbuffer_format which made ACO emit an invalid instruction.

Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Cc: 19.3 <mesa-stable at lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
(cherry picked from commit 911a8261419f48dcd756f78832fa5a5f4c5b8d93)

---

 src/amd/common/ac_shader_util.c    | 5 +++++
 src/amd/compiler/aco_assembler.cpp | 1 +
 2 files changed, 6 insertions(+)

diff --git a/src/amd/common/ac_shader_util.c b/src/amd/common/ac_shader_util.c
index 78b5006e0a1..eb6b88bd570 100644
--- a/src/amd/common/ac_shader_util.c
+++ b/src/amd/common/ac_shader_util.c
@@ -114,6 +114,11 @@ unsigned
 ac_get_tbuffer_format(enum chip_class chip_class,
 		      unsigned dfmt, unsigned nfmt)
 {
+	// Some games try to access vertex buffers without a valid format.
+	// This is a game bug, but we should still handle it gracefully.
+	if (dfmt == V_008F0C_IMG_FORMAT_INVALID)
+		return V_008F0C_IMG_FORMAT_INVALID;
+
 	if (chip_class >= GFX10) {
 		unsigned format;
 		switch (dfmt) {
diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp
index 08debb25ad6..ee575e882c9 100644
--- a/src/amd/compiler/aco_assembler.cpp
+++ b/src/amd/compiler/aco_assembler.cpp
@@ -317,6 +317,7 @@ void emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction*
 
       uint32_t img_format = ac_get_tbuffer_format(ctx.chip_class, mtbuf->dfmt, mtbuf->nfmt);
       uint32_t encoding = (0b111010 << 26);
+      assert(img_format <= 0x7F);
       assert(!mtbuf->dlc || ctx.chip_class >= GFX10);
       encoding |= (mtbuf->dlc ? 1 : 0) << 15; /* DLC bit replaces one bit of the OPCODE on GFX10 */
       encoding |= (mtbuf->glc ? 1 : 0) << 14;




More information about the mesa-commit mailing list