mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
glsl: set image access qualifiers for AoA
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
parent
7b3684877c
commit
103de0225b
1 changed files with 49 additions and 28 deletions
|
|
@ -1010,38 +1010,37 @@ link_update_uniform_buffer_variables(struct gl_shader *shader)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan the program for image uniforms and store image unit access
|
||||
* information into the gl_shader data structure.
|
||||
*/
|
||||
static void
|
||||
link_set_image_access_qualifiers(struct gl_shader_program *prog)
|
||||
link_set_image_access_qualifiers(struct gl_shader_program *prog,
|
||||
gl_shader *sh, unsigned shader_stage,
|
||||
ir_variable *var, const glsl_type *type,
|
||||
char **name, size_t name_length)
|
||||
{
|
||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
gl_shader *sh = prog->_LinkedShaders[i];
|
||||
/* Handle arrays of arrays */
|
||||
if (type->is_array() && type->fields.array->is_array()) {
|
||||
for (unsigned i = 0; i < type->length; i++) {
|
||||
size_t new_length = name_length;
|
||||
|
||||
if (sh == NULL)
|
||||
continue;
|
||||
/* Append the subscript to the current variable name */
|
||||
ralloc_asprintf_rewrite_tail(name, &new_length, "[%u]", i);
|
||||
|
||||
foreach_in_list(ir_instruction, node, sh->ir) {
|
||||
ir_variable *var = node->as_variable();
|
||||
|
||||
if (var && var->data.mode == ir_var_uniform &&
|
||||
var->type->contains_image()) {
|
||||
unsigned id = 0;
|
||||
bool found = prog->UniformHash->get(id, var->name);
|
||||
assert(found);
|
||||
(void) found;
|
||||
const gl_uniform_storage *storage = &prog->UniformStorage[id];
|
||||
const unsigned index = storage->opaque[i].index;
|
||||
const GLenum access = (var->data.image_read_only ? GL_READ_ONLY :
|
||||
var->data.image_write_only ? GL_WRITE_ONLY :
|
||||
GL_READ_WRITE);
|
||||
|
||||
for (unsigned j = 0; j < MAX2(1, storage->array_elements); ++j)
|
||||
sh->ImageAccess[index + j] = access;
|
||||
}
|
||||
link_set_image_access_qualifiers(prog, sh, shader_stage, var,
|
||||
type->fields.array, name,
|
||||
new_length);
|
||||
}
|
||||
} else {
|
||||
unsigned id = 0;
|
||||
bool found = prog->UniformHash->get(id, *name);
|
||||
assert(found);
|
||||
(void) found;
|
||||
const gl_uniform_storage *storage = &prog->UniformStorage[id];
|
||||
const unsigned index = storage->opaque[shader_stage].index;
|
||||
const GLenum access = (var->data.image_read_only ? GL_READ_ONLY :
|
||||
var->data.image_write_only ? GL_WRITE_ONLY :
|
||||
GL_READ_WRITE);
|
||||
|
||||
for (unsigned j = 0; j < MAX2(1, storage->array_elements); ++j)
|
||||
sh->ImageAccess[index + j] = access;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1305,7 +1304,29 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
|
|||
prog->NumHiddenUniforms = hidden_uniforms;
|
||||
prog->UniformStorage = uniforms;
|
||||
|
||||
link_set_image_access_qualifiers(prog);
|
||||
/**
|
||||
* Scan the program for image uniforms and store image unit access
|
||||
* information into the gl_shader data structure.
|
||||
*/
|
||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||
gl_shader *sh = prog->_LinkedShaders[i];
|
||||
|
||||
if (sh == NULL)
|
||||
continue;
|
||||
|
||||
foreach_in_list(ir_instruction, node, sh->ir) {
|
||||
ir_variable *var = node->as_variable();
|
||||
|
||||
if (var && var->data.mode == ir_var_uniform &&
|
||||
var->type->contains_image()) {
|
||||
char *name_copy = ralloc_strdup(NULL, var->name);
|
||||
link_set_image_access_qualifiers(prog, sh, i, var, var->type,
|
||||
&name_copy, strlen(var->name));
|
||||
ralloc_free(name_copy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
link_set_uniform_initializers(prog, boolean_true);
|
||||
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue