diff options
author | Karol Herbst <[email protected]> | 2019-01-31 12:24:44 +0100 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2019-07-10 13:20:13 +0200 |
commit | fa6bd3c639a95d4fae7811def2f4be1c82f48633 (patch) | |
tree | a98f3fbcc623a7ea0d742967b6c145e81ce22547 /src/gallium/drivers | |
parent | 133273aa22d09cbb2d53b7bf6a8e1da6302c4f15 (diff) |
nv50/ir/nir: parse system values first and stop for compute shaders
required by OpenCL
Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Pierre Moreau <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp index 13990567987..c5ccbe1d8ee 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp @@ -1165,6 +1165,7 @@ bool Converter::assignSlots() { info->io.viewportId = -1; info->numInputs = 0; + info->numOutputs = 0; // we have to fixup the uniform locations for arrays unsigned numImages = 0; @@ -1176,6 +1177,37 @@ bool Converter::assignSlots() { numImages += type->is_array() ? type->arrays_of_arrays_size() : 1; } + info->numSysVals = 0; + for (uint8_t i = 0; i < SYSTEM_VALUE_MAX; ++i) { + if (!(nir->info.system_values_read & 1ull << i)) + continue; + + system_val_to_tgsi_semantic(i, &name, &index); + info->sv[info->numSysVals].sn = name; + info->sv[info->numSysVals].si = index; + info->sv[info->numSysVals].input = 0; // TODO inferSysValDirection(sn); + + switch (i) { + case SYSTEM_VALUE_INSTANCE_ID: + info->io.instanceId = info->numSysVals; + break; + case SYSTEM_VALUE_TESS_LEVEL_INNER: + case SYSTEM_VALUE_TESS_LEVEL_OUTER: + info->sv[info->numSysVals].patch = 1; + break; + case SYSTEM_VALUE_VERTEX_ID: + info->io.vertexId = info->numSysVals; + break; + default: + break; + } + + info->numSysVals += 1; + } + + if (prog->getType() == Program::TYPE_COMPUTE) + return true; + nir_foreach_variable(var, &nir->inputs) { const glsl_type *type = var->type; int slot = var->data.location; @@ -1240,7 +1272,6 @@ bool Converter::assignSlots() { info->numInputs = std::max<uint8_t>(info->numInputs, vary); } - info->numOutputs = 0; nir_foreach_variable(var, &nir->outputs) { const glsl_type *type = var->type; int slot = var->data.location; @@ -1332,34 +1363,6 @@ bool Converter::assignSlots() { info->numOutputs = std::max<uint8_t>(info->numOutputs, vary); } - info->numSysVals = 0; - for (uint8_t i = 0; i < SYSTEM_VALUE_MAX; ++i) { - if (!(nir->info.system_values_read & 1ull << i)) - continue; - - system_val_to_tgsi_semantic(i, &name, &index); - info->sv[info->numSysVals].sn = name; - info->sv[info->numSysVals].si = index; - info->sv[info->numSysVals].input = 0; // TODO inferSysValDirection(sn); - - switch (i) { - case SYSTEM_VALUE_INSTANCE_ID: - info->io.instanceId = info->numSysVals; - break; - case SYSTEM_VALUE_TESS_LEVEL_INNER: - case SYSTEM_VALUE_TESS_LEVEL_OUTER: - info->sv[info->numSysVals].patch = 1; - break; - case SYSTEM_VALUE_VERTEX_ID: - info->io.vertexId = info->numSysVals; - break; - default: - break; - } - - info->numSysVals += 1; - } - if (info->io.genUserClip > 0) { info->io.clipDistances = info->io.genUserClip; |