summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimur Kristóf <timur.kristof@gmail.com>2019-11-06 13:29:26 +0100
committerDylan Baker <dylan@pnwbakers.com>2019-11-11 11:44:26 -0800
commit2f66f619c8e7c0cd2c6fa06321c53636a515f130 (patch)
treeea17b4a68ab1d457ba3ae54e89a628c16efce472
parent2bd7416823eed96e6ad30683653381d8a0061e64 (diff)
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@gmail.com> Cc: 19.3 <mesa-stable@lists.freedesktop.org> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> (cherry picked from commit 911a8261419f48dcd756f78832fa5a5f4c5b8d93)
-rw-r--r--src/amd/common/ac_shader_util.c5
-rw-r--r--src/amd/compiler/aco_assembler.cpp1
2 files changed, 6 insertions, 0 deletions
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;