summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Herbst <git@karolherbst.de>2023-08-02 15:32:37 +0200
committerKarol Herbst <git@karolherbst.de>2023-08-05 00:35:57 +0200
commitf5c41c4b78f330d6dde690f7443408d5453781a3 (patch)
tree082d1d902cc18f009aba4c2702bf27494de35b07
parent8c62b3938a89a60baf56ebdbfb6b85157993ab2a (diff)
nv50/ir: use own info struct for sys vals
This makes it more obvious what's actually needed by the driver and allows us to drop some code in the nir to nvir step. Signed-off-by: Karol Herbst <git@karolherbst.de> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24447>
-rw-r--r--src/nouveau/codegen/nv50_ir_driver.h8
-rw-r--r--src/nouveau/codegen/nv50_ir_from_nir.cpp8
-rw-r--r--src/nouveau/codegen/nv50_ir_print.cpp4
-rw-r--r--src/nouveau/codegen/nv50_ir_target_nv50.cpp21
4 files changed, 29 insertions, 12 deletions
diff --git a/src/nouveau/codegen/nv50_ir_driver.h b/src/nouveau/codegen/nv50_ir_driver.h
index 8a3f637b98e..34b73a36a2d 100644
--- a/src/nouveau/codegen/nv50_ir_driver.h
+++ b/src/nouveau/codegen/nv50_ir_driver.h
@@ -55,6 +55,12 @@ struct nv50_ir_varying
uint8_t si; /* TGSI semantic index */
};
+struct nv50_ir_sysval
+{
+ uint8_t sn; /* TGSI semantic name */
+ uint8_t slot[4]; /* for nv50: native slots for xyzw (addresses in 32-bit words) */
+};
+
#ifndef NDEBUG
# define NV50_IR_DEBUG_BASIC (1 << 0)
# define NV50_IR_DEBUG_VERBOSE (2 << 0)
@@ -150,7 +156,7 @@ struct nv50_ir_prog_info_out
void *fixupData;
} bin;
- struct nv50_ir_varying sv[NV50_CODEGEN_MAX_VARYINGS];
+ struct nv50_ir_sysval sv[NV50_CODEGEN_MAX_VARYINGS];
struct nv50_ir_varying in[NV50_CODEGEN_MAX_VARYINGS];
struct nv50_ir_varying out[NV50_CODEGEN_MAX_VARYINGS];
uint8_t numInputs;
diff --git a/src/nouveau/codegen/nv50_ir_from_nir.cpp b/src/nouveau/codegen/nv50_ir_from_nir.cpp
index b51784f2896..ca021f40103 100644
--- a/src/nouveau/codegen/nv50_ir_from_nir.cpp
+++ b/src/nouveau/codegen/nv50_ir_from_nir.cpp
@@ -915,24 +915,16 @@ bool Converter::assignSlots() {
continue;
default:
info_out->sv[info_out->numSysVals].sn = tgsi_get_sysval_semantic(i);
- info_out->sv[info_out->numSysVals].si = 0;
- info_out->sv[info_out->numSysVals].input = 0;
break;
}
switch (i) {
case SYSTEM_VALUE_VERTEX_ID:
- info_out->sv[info_out->numSysVals].input = 1;
info_out->io.vertexId = info_out->numSysVals;
break;
case SYSTEM_VALUE_INSTANCE_ID:
- info_out->sv[info_out->numSysVals].input = 1;
info_out->io.instanceId = info_out->numSysVals;
break;
- case SYSTEM_VALUE_TESS_LEVEL_INNER:
- case SYSTEM_VALUE_TESS_LEVEL_OUTER:
- info_out->sv[info_out->numSysVals].patch = 1;
- break;
default:
break;
}
diff --git a/src/nouveau/codegen/nv50_ir_print.cpp b/src/nouveau/codegen/nv50_ir_print.cpp
index aab61f301cc..a86872947aa 100644
--- a/src/nouveau/codegen/nv50_ir_print.cpp
+++ b/src/nouveau/codegen/nv50_ir_print.cpp
@@ -955,8 +955,8 @@ nv50_ir_prog_info_out_print(struct nv50_ir_prog_info_out *info_out)
if (info_out->numSysVals) {
INFO(" \"sv\":[\n");
for (i = 0; i < info_out->numSysVals; i++) {
- INFO(" {\"id\":\"%d\", \"sn\":\"%d\", \"si\":\"%d\"}\n",
- info_out->sv[i].id, info_out->sv[i].sn, info_out->sv[i].si);
+ INFO(" {\"sn\":\"%d\"}\n",
+ info_out->sv[i].sn);
}
INFO("\n ],\n");
}
diff --git a/src/nouveau/codegen/nv50_ir_target_nv50.cpp b/src/nouveau/codegen/nv50_ir_target_nv50.cpp
index cfb7c4932fe..7cb89d38d3c 100644
--- a/src/nouveau/codegen/nv50_ir_target_nv50.cpp
+++ b/src/nouveau/codegen/nv50_ir_target_nv50.cpp
@@ -594,6 +594,25 @@ recordLocation(uint16_t *locs, uint8_t *masks,
masks[0] = var->mask;
}
+static void
+recordLocationSysVal(uint16_t *locs, uint8_t *masks,
+ const struct nv50_ir_sysval *var)
+{
+ uint16_t addr = var->slot[0] * 4;
+
+ switch (var->sn) {
+ case TGSI_SEMANTIC_POSITION: locs[SV_POSITION] = addr; break;
+ case TGSI_SEMANTIC_INSTANCEID: locs[SV_INSTANCE_ID] = addr; break;
+ case TGSI_SEMANTIC_VERTEXID: locs[SV_VERTEX_ID] = addr; break;
+ case TGSI_SEMANTIC_PRIMID: locs[SV_PRIMITIVE_ID] = addr; break;
+ default:
+ break;
+ }
+ // TODO is this even hit?
+ if (var->sn == TGSI_SEMANTIC_POSITION && masks)
+ masks[0] = 0;
+}
+
void
TargetNV50::parseDriverInfo(const struct nv50_ir_prog_info *info,
const struct nv50_ir_prog_info_out *info_out)
@@ -604,7 +623,7 @@ TargetNV50::parseDriverInfo(const struct nv50_ir_prog_info *info,
for (i = 0; i < info_out->numInputs; ++i)
recordLocation(sysvalLocation, &wposMask, &info_out->in[i]);
for (i = 0; i < info_out->numSysVals; ++i)
- recordLocation(sysvalLocation, NULL, &info_out->sv[i]);
+ recordLocationSysVal(sysvalLocation, NULL, &info_out->sv[i]);
if (sysvalLocation[SV_POSITION] >= 0x200) {
// not assigned by driver, but we need it internally