From d34e434989ec8e8ca780421f6909cfd796573520 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 5 Feb 2019 19:08:04 -0800 Subject: [PATCH] glsl: Allow gl_nir_lower_samplers*() without a gl_shader_program I would like to be able to run gl_nir_lower_samplers() to turn texture and sampler variable dereferences into indexes and offsets, even for ARB programs, and built-in shaders. This would make sampler handling more consistent across the various types of shaders. For GLSL programs, the gl_nir_lower_samplers_as_deref() pass looks up the variable bindings in the shader program's uniform storage. But ARB programs and built-in shaders don't have a gl_shader_program, and uniform storage doesn't exist. In this case, we simply skip that lookup, and trust var->data.binding to be set correctly by whoever created the shader. Reviewed-by: Eric Anholt --- src/compiler/glsl/gl_nir_lower_samplers_as_deref.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c index 719968a6671..cd7e8e39fc9 100644 --- a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c +++ b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c @@ -147,10 +147,18 @@ lower_deref(nir_builder *b, struct lower_samplers_as_deref_state *state, remove_struct_derefs_prep(path.path, &name, &location, &type); - assert(location < state->shader_program->data->NumUniformStorage && - state->shader_program->data->UniformStorage[location].opaque[stage].active); + if (state->shader_program) { + /* For GLSL programs, look up the bindings in the uniform storage. */ + assert(location < state->shader_program->data->NumUniformStorage && + state->shader_program->data->UniformStorage[location].opaque[stage].active); - binding = state->shader_program->data->UniformStorage[location].opaque[stage].index; + binding = state->shader_program->data->UniformStorage[location].opaque[stage].index; + } else { + /* For ARB programs or built-in shaders, assume that whoever created + * the shader set the bindings correctly already. + */ + binding = var->data.binding; + } if (var->type == type) { /* Fast path: We did not encounter any struct derefs. */ -- 2.30.2