Browse Source

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 <eric@anholt.net>
tags/19.1-branchpoint
Kenneth Graunke 6 years ago
parent
commit
d34e434989
1 changed files with 11 additions and 3 deletions
  1. 11
    3
      src/compiler/glsl/gl_nir_lower_samplers_as_deref.c

+ 11
- 3
src/compiler/glsl/gl_nir_lower_samplers_as_deref.c View File

@@ -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. */

Loading…
Cancel
Save