aco: use MUBUF to load subdword SSBO
authorDaniel Schürmann <daniel@schuermann.dev>
Thu, 27 Feb 2020 16:52:21 +0000 (17:52 +0100)
committerDaniel Schürmann <daniel@schuermann.dev>
Fri, 3 Apr 2020 22:13:15 +0000 (23:13 +0100)
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4002>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4002>

src/amd/compiler/aco_instruction_selection.cpp

index 777072437f0905e2b62557989c39634c0b6c904c..2d9b78792f357765dcf4f327404d009abf1f1cd7 100644 (file)
@@ -4481,7 +4481,7 @@ void load_buffer(isel_context *ctx, unsigned num_components, unsigned component_
    unsigned num_bytes = num_components * component_size;
 
    aco_opcode op;
-   if (dst.type() == RegType::vgpr || (ctx->options->chip_class < GFX8 && !readonly)) {
+   if (dst.type() == RegType::vgpr || ((ctx->options->chip_class < GFX8 || component_size < 4) && !readonly)) {
       Operand vaddr = offset.type() == RegType::vgpr ? Operand(offset) : Operand(v1);
       Operand soffset = offset.type() == RegType::sgpr ? Operand(offset) : Operand((uint32_t) 0);
       unsigned const_offset = 0;
@@ -4558,7 +4558,7 @@ void load_buffer(isel_context *ctx, unsigned num_components, unsigned component_
       mubuf->offset = const_offset;
       aco_ptr<Instruction> instr = std::move(mubuf);
 
-      if (dst.regClass().is_subdword()) {
+      if (component_size < 4) {
          Temp vec = num_bytes <= 4 ? bld.tmp(v1) : num_bytes <= 8 ? bld.tmp(v2) : bld.tmp(v3);
          instr->definitions[0] = Definition(vec);
          bld.insert(std::move(instr));