Mesa (main): nv50/ir: add barrier and thread_state files

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun May 30 13:40:31 UTC 2021


Module: Mesa
Branch: main
Commit: f14ed4f077e08a8d254821c935116ffc0d0d487c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f14ed4f077e08a8d254821c935116ffc0d0d487c

Author: Karol Herbst <kherbst at redhat.com>
Date:   Tue Jul 14 22:34:34 2020 +0200

nv50/ir: add barrier and thread_state files

Those are required on Turing+ to handle cross thread synchronization and
other goodies as the c/r stack is gone.

Signed-off-by: Karol Herbst <kherbst at redhat.com>
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11061>

---

 src/gallium/drivers/nouveau/codegen/nv50_ir.h      | 28 ++++++++++++++++++++-
 .../drivers/nouveau/codegen/nv50_ir_build_util.cpp | 10 ++++++++
 .../drivers/nouveau/codegen/nv50_ir_build_util.h   |  1 +
 .../drivers/nouveau/codegen/nv50_ir_print.cpp      | 29 ++++++++++++++++++++++
 .../nouveau/codegen/nv50_ir_target_nv50.cpp        |  1 +
 .../nouveau/codegen/nv50_ir_target_nvc0.cpp        |  6 ++++-
 6 files changed, 73 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
index 645f81a23c2..b67cb244b5e 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
@@ -385,7 +385,8 @@ enum DataFile
    FILE_PREDICATE,       // boolean predicate
    FILE_FLAGS,           // zero/sign/carry/overflow bits
    FILE_ADDRESS,
-   LAST_REGISTER_FILE = FILE_ADDRESS,
+   FILE_BARRIER,
+   LAST_REGISTER_FILE = FILE_BARRIER,
    FILE_IMMEDIATE,
    FILE_MEMORY_CONST,
    FILE_SHADER_INPUT,
@@ -395,6 +396,7 @@ enum DataFile
    FILE_MEMORY_SHARED,
    FILE_MEMORY_LOCAL,
    FILE_SYSTEM_VALUE,
+   FILE_THREAD_STATE,           // "special" barrier registers
    DATA_FILE_COUNT
 };
 
@@ -532,6 +534,29 @@ enum SVSemantic
    SV_LAST
 };
 
+enum TSSemantic
+{
+   // 0-15 are fixed ones on Volta/Turing
+   TS_THREAD_STATE_ENUM0 = 0,
+   TS_THREAD_STATE_ENUM1 = 1,
+   TS_THREAD_STATE_ENUM2 = 2,
+   TS_THREAD_STATE_ENUM3 = 3,
+   TS_THREAD_STATE_ENUM4 = 4,
+   TS_TRAP_RETURN_PC_LO  = 5,
+   TS_TRAP_RETURN_PC_HI  = 6,
+   TS_TRAP_RETURN_MASK   = 7,
+   TS_MEXITED            = 8,
+   TS_MKILL              = 9,
+   TS_MACTIVE            = 10,
+   TS_MATEXIT            = 11,
+   TS_OPT_STACK          = 12,
+   TS_API_CALL_DEPTH     = 13,
+   TS_ATEXIT_PC_LO       = 14,
+   TS_ATEXIT_PC_HI       = 15,
+   // special ones to make our life easier
+   TS_PQUAD_MACTIVE,
+};
+
 class Program;
 class Function;
 class BasicBlock;
@@ -571,6 +596,7 @@ struct Storage
          SVSemantic sv;
          int index;
       } sv;
+      TSSemantic ts;
    } data;
 };
 
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
index 2fb02bb9c29..feafbd147b6 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
@@ -486,6 +486,16 @@ BuildUtil::mkSysVal(SVSemantic svName, uint32_t svIndex)
    return sym;
 }
 
+Symbol *
+BuildUtil::mkTSVal(TSSemantic tsName)
+{
+   Symbol *sym = new_Symbol(prog, FILE_THREAD_STATE, 0);
+   sym->reg.type = TYPE_U32;
+   sym->reg.size = typeSizeof(sym->reg.type);
+   sym->reg.data.ts = tsName;
+   return sym;
+}
+
 void
 BuildUtil::DataArray::setup(unsigned array, unsigned arrayIdx,
                             uint32_t base, int len, int vecDim, int eltSize,
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h
index a9928ea26bb..6fe77211a89 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h
@@ -178,6 +178,7 @@ public:
                     DataType ty, uint32_t baseAddress);
 
    Symbol *mkSysVal(SVSemantic svName, uint32_t svIndex);
+   Symbol *mkTSVal(TSSemantic tsName);
 
 private:
    void init(Program *);
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp
index 0efa1e86449..e0d52840a53 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp
@@ -348,6 +348,27 @@ static const char *SemanticStr[] =
    "(INVALID)"
 };
 
+static const char *TSStr[17] =
+{
+   "THREAD_STATE_ENUM0",
+   "THREAD_STATE_ENUM1",
+   "THREAD_STATE_ENUM2",
+   "THREAD_STATE_ENUM3",
+   "THREAD_STATE_ENUM4",
+   "TRAP_RETURN_PC_LO",
+   "TRAP_RETURN_PC_HI",
+   "TRAP_RETURN_MASK",
+   "MEXITED",
+   "MKILL",
+   "MACTIVE",
+   "MATEXIT",
+   "OPT_STACK",
+   "API_CALL_DEPTH",
+   "ATEXIT_PC_LO",
+   "ATEXIT_PC_HI",
+   "PQUAD_MACTIVE",
+};
+
 static const char *interpStr[16] =
 {
    "pass",
@@ -476,6 +497,9 @@ int LValue::print(char *buf, size_t size, DataType ty) const
    case FILE_ADDRESS:
       r = 'a'; col = TXT_REGISTER;
       break;
+   case FILE_BARRIER:
+      r = 'b'; col = TXT_REGISTER;
+      break;
    default:
       assert(!"invalid file for lvalue");
       r = '?';
@@ -537,6 +561,10 @@ int Symbol::print(char *buf, size_t size,
       }
       PRINT("%s]", colour[TXT_MEM]);
       return pos;
+   } else if (reg.file == FILE_THREAD_STATE) {
+      PRINT("%sts[%s%s%s]", colour[TXT_MEM], colour[TXT_REGISTER],
+            TSStr[reg.data.ts], colour[TXT_MEM]);
+      return pos;
    }
 
    switch (reg.file) {
@@ -547,6 +575,7 @@ int Symbol::print(char *buf, size_t size,
    case FILE_MEMORY_GLOBAL: c = 'g'; break;
    case FILE_MEMORY_SHARED: c = 's'; break;
    case FILE_MEMORY_LOCAL:  c = 'l'; break;
+   case FILE_BARRIER:       c = 'b'; break;
    default:
       assert(!"invalid file");
       c = '?';
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
index bd04dad5afb..b9c3746adcf 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
@@ -207,6 +207,7 @@ TargetNV50::getFileSize(DataFile file) const
    case FILE_PREDICATE:     return 0;
    case FILE_FLAGS:         return 4;
    case FILE_ADDRESS:       return 4;
+   case FILE_BARRIER:       return 0;
    case FILE_IMMEDIATE:     return 0;
    case FILE_MEMORY_CONST:  return 65536;
    case FILE_SHADER_INPUT:  return 0x200;
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
index 744a011cdde..cc2657d88a2 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
@@ -267,12 +267,14 @@ TargetNVC0::getFileSize(DataFile file) const
 {
    const unsigned int gprs = (chipset >= NVISA_GK20A_CHIPSET) ? 255 : 63;
    const unsigned int smregs = (chipset >= NVISA_GK104_CHIPSET) ? 65536 : 32768;
+   const unsigned int bs = (chipset >= NVISA_GV100_CHIPSET) ? 16 : 0;
    switch (file) {
    case FILE_NULL:          return 0;
    case FILE_GPR:           return MIN2(gprs, smregs / threads);
    case FILE_PREDICATE:     return 7;
    case FILE_FLAGS:         return 1;
    case FILE_ADDRESS:       return 0;
+   case FILE_BARRIER:       return bs;
    case FILE_IMMEDIATE:     return 0;
    case FILE_MEMORY_CONST:  return 65536;
    case FILE_SHADER_INPUT:  return 0x400;
@@ -282,6 +284,7 @@ TargetNVC0::getFileSize(DataFile file) const
    case FILE_MEMORY_SHARED: return 16 << 10;
    case FILE_MEMORY_LOCAL:  return 48 << 10;
    case FILE_SYSTEM_VALUE:  return 32;
+   case FILE_THREAD_STATE:  return bs;
    default:
       assert(!"invalid file");
       return 0;
@@ -291,7 +294,8 @@ TargetNVC0::getFileSize(DataFile file) const
 unsigned int
 TargetNVC0::getFileUnit(DataFile file) const
 {
-   if (file == FILE_GPR || file == FILE_ADDRESS || file == FILE_SYSTEM_VALUE)
+   if (file == FILE_GPR || file == FILE_ADDRESS || file == FILE_SYSTEM_VALUE ||
+       file == FILE_BARRIER || file == FILE_THREAD_STATE)
       return 2;
    return 0;
 }



More information about the mesa-commit mailing list