[Mesa-dev] [RFCv3 04/11] nir: allow pre-resolved sampler uniform locations

Rob Clark robdclark at gmail.com
Sun Jan 31 12:16:12 PST 2016


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.

Signed-off-by: Rob Clark <robclark at freedesktop.org>
---
 src/compiler/nir/nir_lower_samplers.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/compiler/nir/nir_lower_samplers.c b/src/compiler/nir/nir_lower_samplers.c
index 96e8291..c95a474 100644
--- a/src/compiler/nir/nir_lower_samplers.c
+++ b/src/compiler/nir/nir_lower_samplers.c
@@ -129,14 +129,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;
 }
@@ -176,6 +180,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