freedreno: Fix OUT_REG() on address regs without a .bo supplied.
authorEric Anholt <eric@anholt.net>
Fri, 17 Jan 2020 22:28:13 +0000 (14:28 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 22:46:09 +0000 (22:46 +0000)
Sometimes you want to zero out an address by supplying a NULL BO, but
without this we would end up only emitting one dword.  Increases size of
fd6_gmem.o by .8%, though it's not clear to me why (no obvious terrible
codegen happening)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3455>

src/freedreno/registers/gen_header.py
src/gallium/drivers/freedreno/a6xx/fd6_pack.h

index f11724d707a764accd6feeb3022be19fcb691c07..887656fd5d8034416f9aa796df117c385cb255ea 100644 (file)
@@ -179,6 +179,7 @@ class Bitset(object):
                print("            fields.unknown | fields.dword,")
 
                if address:
+                       print("        .is_address = true,")
                        print("        .bo = fields.bo,")
                        if f.type == "waddress":
                                print("        .bo_write = true,")
index f5f8e2ca5f7b663077c7f8041e402ca403bb6cb5..b3b9bf9244dfdbff1dedecbdcc0799be511deba2 100644 (file)
@@ -30,6 +30,7 @@ struct fd_reg_pair {
        uint32_t reg;
        uint64_t value;
        struct fd_bo *bo;
+       bool is_address;
        bool bo_write;
        uint32_t bo_offset;
        uint32_t bo_shift;
@@ -68,6 +69,8 @@ struct fd_reg_pair {
                                fd_ringbuffer_reloc(ring, &reloc);                                      \
                        } else {                                                                                                \
                                *p++ = regs[i].value;                                                           \
+                               if (regs[i].is_address)                                                         \
+                                       *p++ = regs[i].value >> 32;                                             \
                        }                                                                                                               \
                }                                                                                                                       \
        } while (0)