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>
This commit is contained in:
@@ -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);
|
remove_struct_derefs_prep(path.path, &name, &location, &type);
|
||||||
|
|
||||||
|
if (state->shader_program) {
|
||||||
|
/* For GLSL programs, look up the bindings in the uniform storage. */
|
||||||
assert(location < state->shader_program->data->NumUniformStorage &&
|
assert(location < state->shader_program->data->NumUniformStorage &&
|
||||||
state->shader_program->data->UniformStorage[location].opaque[stage].active);
|
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) {
|
if (var->type == type) {
|
||||||
/* Fast path: We did not encounter any struct derefs. */
|
/* Fast path: We did not encounter any struct derefs. */
|
||||||
|
Reference in New Issue
Block a user