From fa6bd3c639a95d4fae7811def2f4be1c82f48633 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Thu, 31 Jan 2019 12:24:44 +0100 Subject: [PATCH] nv50/ir/nir: parse system values first and stop for compute shaders required by OpenCL Signed-off-by: Karol Herbst Reviewed-by: Pierre Moreau --- .../nouveau/codegen/nv50_ir_from_nir.cpp | 61 ++++++++++--------- 1 file 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(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(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; -- 2.30.2