summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Herbst <kherbst@redhat.com>2020-07-14 22:34:34 +0200
committerMarge Bot <eric+marge@anholt.net>2021-05-30 13:34:31 +0000
commitf14ed4f077e08a8d254821c935116ffc0d0d487c (patch)
tree8a2cd0cb76ff6f47c38b7e0b949c32f7e9cdf442
parentf4c6c89dec6d2297022fc511db627ce3ed74a5e0 (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>
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir.h28
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp10
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h1
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp29
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp1
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp6
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;
}