[Mesa-dev] [RFCv2 03/13] nir: allow pre-resolved sampler uniform locations
Rob Clark
robdclark at gmail.com
Sun Nov 8 12:12:24 PST 2015
From: Rob Clark <robclark at freedesktop.org>
With TGSI, the ir_variable::data.location gets fixed up to be a stage
local location (rather than program global). In this case we need to
skip the UniformStorage[location] lookup.
---
src/glsl/nir/nir_lower_samplers.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/src/glsl/nir/nir_lower_samplers.c b/src/glsl/nir/nir_lower_samplers.c
index 5df79a6..d99ba4c 100644
--- a/src/glsl/nir/nir_lower_samplers.c
+++ b/src/glsl/nir/nir_lower_samplers.c
@@ -130,14 +130,18 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
instr->sampler_array_size = array_elements;
}
- if (location > shader_program->NumUniformStorage - 1 ||
- !shader_program->UniformStorage[location].opaque[stage].active) {
- assert(!"cannot return a sampler");
- return;
- }
+ if (!shader_program) {
+ instr->sampler_index = location;
+ } else {
+ if (location > shader_program->NumUniformStorage - 1 ||
+ !shader_program->UniformStorage[location].opaque[stage].active) {
+ assert(!"cannot return a sampler");
+ return;
+ }
- instr->sampler_index +=
- shader_program->UniformStorage[location].opaque[stage].index;
+ instr->sampler_index =
+ shader_program->UniformStorage[location].opaque[stage].index;
+ }
instr->sampler = NULL;
}
@@ -177,6 +181,11 @@ lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_progr
nir_foreach_block(impl, lower_block_cb, &state);
}
+/* Call with a null 'shader_program' if uniform locations are
+ * already local to the shader, ie. skipping the
+ * shader_program->UniformStorage[location].opaque[stage].index
+ * lookup
+ */
void
nir_lower_samplers(nir_shader *shader,
const struct gl_shader_program *shader_program)
--
2.5.0
More information about the mesa-dev
mailing list