summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/nir/nir.h2
-rw-r--r--src/compiler/nir/nir_lower_samplers.c29
2 files changed, 19 insertions, 12 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 703d5d2dd18..8bf517c3335 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -2405,7 +2405,7 @@ bool nir_lower_load_const_to_scalar(nir_shader *shader);
bool nir_lower_phis_to_scalar(nir_shader *shader);
void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask);
-void nir_lower_samplers(nir_shader *shader,
+bool nir_lower_samplers(nir_shader *shader,
const struct gl_shader_program *shader_program);
bool nir_lower_system_values(nir_shader *shader);
diff --git a/src/compiler/nir/nir_lower_samplers.c b/src/compiler/nir/nir_lower_samplers.c
index 9debfb2eaf9..0c4e91b000f 100644
--- a/src/compiler/nir/nir_lower_samplers.c
+++ b/src/compiler/nir/nir_lower_samplers.c
@@ -86,12 +86,12 @@ calc_sampler_offsets(nir_deref *tail, nir_tex_instr *instr,
}
}
-static void
+static bool
lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_program,
gl_shader_stage stage, nir_builder *b)
{
if (instr->texture == NULL)
- return;
+ return false;
/* In GLSL, we only fill out the texture field. The sampler is inferred */
assert(instr->sampler == NULL);
@@ -140,11 +140,8 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
instr->texture_array_size = array_elements;
}
- if (location > shader_program->data->NumUniformStorage - 1 ||
- !shader_program->data->UniformStorage[location].opaque[stage].active) {
- assert(!"cannot return a sampler");
- return;
- }
+ assert(location < shader_program->data->NumUniformStorage &&
+ shader_program->data->UniformStorage[location].opaque[stage].active);
instr->texture_index +=
shader_program->data->UniformStorage[location].opaque[stage].index;
@@ -152,29 +149,39 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
instr->sampler_index = instr->texture_index;
instr->texture = NULL;
+
+ return true;
}
-static void
+static bool
lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_program,
gl_shader_stage stage)
{
nir_builder b;
nir_builder_init(&b, impl);
+ bool progress = false;
nir_foreach_block(block, impl) {
nir_foreach_instr(instr, block) {
if (instr->type == nir_instr_type_tex)
- lower_sampler(nir_instr_as_tex(instr), shader_program, stage, &b);
+ progress |= lower_sampler(nir_instr_as_tex(instr),
+ shader_program, stage, &b);
}
}
+
+ return progress;
}
-void
+bool
nir_lower_samplers(nir_shader *shader,
const struct gl_shader_program *shader_program)
{
+ bool progress = false;
+
nir_foreach_function(function, shader) {
if (function->impl)
- lower_impl(function->impl, shader_program, shader->stage);
+ progress |= lower_impl(function->impl, shader_program, shader->stage);
}
+
+ return progress;
}