summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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