diff options
author | Karol Herbst <kherbst@redhat.com> | 2020-07-14 22:34:34 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-05-30 13:34:31 +0000 |
commit | f14ed4f077e08a8d254821c935116ffc0d0d487c (patch) | |
tree | 8a2cd0cb76ff6f47c38b7e0b949c32f7e9cdf442 | |
parent | f4c6c89dec6d2297022fc511db627ce3ed74a5e0 (diff) |
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@redhat.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11061>
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; } |