ac: Handle invalid GFX10 format correctly in ac_get_tbuffer_format.
authorTimur Kristóf <timur.kristof@gmail.com>
Wed, 6 Nov 2019 12:29:26 +0000 (13:29 +0100)
committerTimur Kristóf <timur.kristof@gmail.com>
Fri, 8 Nov 2019 12:30:30 +0000 (13:30 +0100)
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>
src/amd/common/ac_shader_util.c
src/amd/compiler/aco_assembler.cpp

index 78b5006e0a1abc3b97540f1c32acc6513040d60d..eb6b88bd570f5f9e0fb9d2d0f52e80b910a59af0 100644 (file)
@@ -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) {
index 08debb25ad6b2851ac6f5cb7de5d5b0606467595..ee575e882c982d500e9bd8c5cd5c4899d57361bd 100644 (file)
@@ -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;