diff --git a/src/compiler/glsl/gl_nir_link_uniform_blocks.c b/src/compiler/glsl/gl_nir_link_uniform_blocks.c index a2b2e9dbecc..d62aae10861 100644 --- a/src/compiler/glsl/gl_nir_link_uniform_blocks.c +++ b/src/compiler/glsl/gl_nir_link_uniform_blocks.c @@ -134,8 +134,8 @@ link_blocks_are_compatible(const struct gl_uniform_block *a, /* We are explicitly ignoring the names, so it would be good to check that * this is happening. */ - assert(a->Name == NULL); - assert(b->Name == NULL); + assert(a->name.string == NULL); + assert(b->name.string == NULL); if (a->NumUniforms != b->NumUniforms) return false; @@ -468,7 +468,8 @@ fill_block(struct gl_uniform_block *block, { const struct glsl_type *type = glsl_without_array(var->type); - block->Name = NULL; /* ARB_gl_spirv: allowed to ignore names */ + block->name.string = NULL; /* ARB_gl_spirv: allowed to ignore names */ + resource_name_updated(&block->name); /* From ARB_gl_spirv spec: * "Vulkan uses only one binding point for a resource array, * while OpenGL still uses multiple binding points, so binding diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index 05b6e036e10..47d40d62f4e 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -677,12 +677,12 @@ add_parameter(struct gl_uniform_storage *uniform, if (glsl_type_is_16bit(glsl_without_array(type))) comps = DIV_ROUND_UP(comps, 2); - _mesa_add_parameter(params, PROGRAM_UNIFORM, uniform->name, comps, + _mesa_add_parameter(params, PROGRAM_UNIFORM, uniform->name.string, comps, glsl_get_gl_type(type), NULL, NULL, false); } } else { for (unsigned i = 0; i < num_params; i++) { - _mesa_add_parameter(params, PROGRAM_UNIFORM, uniform->name, 4, + _mesa_add_parameter(params, PROGRAM_UNIFORM, uniform->name.string, 4, glsl_get_gl_type(type), NULL, NULL, true); } } @@ -1313,8 +1313,9 @@ nir_link_uniform(struct gl_context *ctx, /* Initialize its members */ memset(uniform, 0x00, sizeof(struct gl_uniform_storage)); - uniform->name = + uniform->name.string = name ? ralloc_strdup(prog->data->UniformStorage, *name) : NULL; + resource_name_updated(&uniform->name); const struct glsl_type *type_no_array = glsl_without_array(type); if (glsl_type_is_array(type)) { @@ -1423,15 +1424,15 @@ nir_link_uniform(struct gl_context *ctx, if (is_interface_array) { unsigned l = strlen(ifc_name); for (unsigned i = 0; i < num_blocks; i++) { - if (strncmp(ifc_name, blocks[i].Name, l) == 0 && - blocks[i].Name[l] == '[') { + if (strncmp(ifc_name, blocks[i].name.string, l) == 0 && + blocks[i].name.string[l] == '[') { buffer_block_index = i; break; } } } else { for (unsigned i = 0; i < num_blocks; i++) { - if (strcmp(ifc_name, blocks[i].Name) == 0) { + if (strcmp(ifc_name, blocks[i].name.string) == 0) { buffer_block_index = i; break; } @@ -1462,7 +1463,7 @@ nir_link_uniform(struct gl_context *ctx, } uniform->block_index = buffer_block_index; - uniform->builtin = is_gl_identifier(uniform->name); + uniform->builtin = is_gl_identifier(uniform->name.string); uniform->atomic_buffer_index = -1; /* The following are not for features not supported by ARB_gl_spirv */ @@ -1486,7 +1487,7 @@ nir_link_uniform(struct gl_context *ctx, (prog->data->NumUniformStorage - 1)); } - if (!is_gl_identifier(uniform->name) && !uniform->is_shader_storage && + if (!is_gl_identifier(uniform->name.string) && !uniform->is_shader_storage && !state->var_is_in_block) state->num_values += values; @@ -1683,8 +1684,8 @@ gl_nir_link_uniforms(struct gl_context *ctx, * marked as referenced. */ for (unsigned i = 0; i < num_blocks; i++) { - if (strncmp(ifc_name, blocks[i].Name, l) == 0 && - blocks[i].Name[l] == '[') { + if (strncmp(ifc_name, blocks[i].name.string, l) == 0 && + blocks[i].name.string[l] == '[') { if (buffer_block_index == -1) buffer_block_index = i; @@ -1701,7 +1702,7 @@ gl_nir_link_uniforms(struct gl_context *ctx, } } else { for (unsigned i = 0; i < num_blocks; i++) { - if (strcmp(ifc_name, blocks[i].Name) == 0) { + if (strcmp(ifc_name, blocks[i].name.string) == 0) { buffer_block_index = i; struct hash_entry *entry = diff --git a/src/compiler/glsl/gl_nir_link_xfb.c b/src/compiler/glsl/gl_nir_link_xfb.c index 69d11559f58..09d3bba3e14 100644 --- a/src/compiler/glsl/gl_nir_link_xfb.c +++ b/src/compiler/glsl/gl_nir_link_xfb.c @@ -151,7 +151,8 @@ gl_nir_link_assign_xfb_resources(struct gl_context *ctx, linked_xfb->Varyings + i; /* ARB_gl_spirv: see above. */ - varying->Name = NULL; + varying->name.string = NULL; + resource_name_updated(&varying->name); varying->Type = glsl_get_gl_type(xfb_varying->type); varying->BufferIndex = buffer_index; varying->Size = glsl_type_is_array(xfb_varying->type) ? diff --git a/src/compiler/glsl/gl_nir_linker.c b/src/compiler/glsl/gl_nir_linker.c index 9815145189d..17165ef3651 100644 --- a/src/compiler/glsl/gl_nir_linker.c +++ b/src/compiler/glsl/gl_nir_linker.c @@ -113,24 +113,26 @@ create_shader_variable(struct gl_shader_program *shProg, */ if (in->data.mode == nir_var_system_value && in->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) { - out->name = ralloc_strdup(shProg, "gl_VertexID"); + out->name.string = ralloc_strdup(shProg, "gl_VertexID"); } else if ((in->data.mode == nir_var_shader_out && in->data.location == VARYING_SLOT_TESS_LEVEL_OUTER) || (in->data.mode == nir_var_system_value && in->data.location == SYSTEM_VALUE_TESS_LEVEL_OUTER)) { - out->name = ralloc_strdup(shProg, "gl_TessLevelOuter"); + out->name.string = ralloc_strdup(shProg, "gl_TessLevelOuter"); type = glsl_array_type(glsl_float_type(), 4, 0); } else if ((in->data.mode == nir_var_shader_out && in->data.location == VARYING_SLOT_TESS_LEVEL_INNER) || (in->data.mode == nir_var_system_value && in->data.location == SYSTEM_VALUE_TESS_LEVEL_INNER)) { - out->name = ralloc_strdup(shProg, "gl_TessLevelInner"); + out->name.string = ralloc_strdup(shProg, "gl_TessLevelInner"); type = glsl_array_type(glsl_float_type(), 2, 0); } else { - out->name = ralloc_strdup(shProg, name); + out->name.string = ralloc_strdup(shProg, name); } - if (!out->name) + resource_name_updated(&out->name); + + if (!out->name.string) return NULL; /* The ARB_program_interface_query spec says: @@ -350,7 +352,8 @@ add_vars_with_modes(const struct gl_context *ctx, * the linker needs to work without them. Returning them is optional. * For simplicity, we ignore names. */ - sh_var->name = NULL; + sh_var->name.string = NULL; + resource_name_updated(&sh_var->name); sh_var->type = var->type; sh_var->location = var->data.location - loc_bias; sh_var->index = var->data.index; diff --git a/src/compiler/glsl/gl_nir_lower_buffers.c b/src/compiler/glsl/gl_nir_lower_buffers.c index 06460ad6a54..603385c383e 100644 --- a/src/compiler/glsl/gl_nir_lower_buffers.c +++ b/src/compiler/glsl/gl_nir_lower_buffers.c @@ -97,7 +97,7 @@ get_block_array_index(nir_builder *b, nir_deref_instr *deref, for (unsigned i = 0; i < num_blocks; i++) { if (( use_bindings && binding == blocks[i]->Binding) || - (!use_bindings && strcmp(block_name, blocks[i]->Name) == 0)) { + (!use_bindings && strcmp(block_name, blocks[i]->name.string) == 0)) { deref->var->data.driver_location = i - const_array_offset; if (nonconst_index) return nir_iadd_imm(b, nonconst_index, i); @@ -144,7 +144,7 @@ get_block_index_offset(nir_variable *var, for (unsigned i = 0; i < num_blocks; i++) { const char *block_name = glsl_get_type_name(var->interface_type); if (( use_bindings && blocks[i]->Binding == var->data.binding) || - (!use_bindings && strcmp(block_name, blocks[i]->Name) == 0)) { + (!use_bindings && strcmp(block_name, blocks[i]->name.string) == 0)) { var->data.driver_location = i; *index = i; *offset = blocks[i]->Uniforms[var->data.location].Offset; diff --git a/src/compiler/glsl/ir_uniform.h b/src/compiler/glsl/ir_uniform.h index 9770790cb26..3322b97abdd 100644 --- a/src/compiler/glsl/ir_uniform.h +++ b/src/compiler/glsl/ir_uniform.h @@ -88,8 +88,14 @@ struct gl_opaque_uniform_index { bool active; }; +struct gl_resource_name +{ + char *string; +}; + struct gl_uniform_storage { - char *name; + struct gl_resource_name name; + /** Type of this uniform data stored. * * In the case of an array, it's the type of a single array element. @@ -214,6 +220,9 @@ struct gl_uniform_storage { bool is_bindless; }; +void +resource_name_updated(struct gl_resource_name *name); + #ifdef __cplusplus } #endif diff --git a/src/compiler/glsl/link_uniform_blocks.cpp b/src/compiler/glsl/link_uniform_blocks.cpp index 1603cbd59af..9d2de454262 100644 --- a/src/compiler/glsl/link_uniform_blocks.cpp +++ b/src/compiler/glsl/link_uniform_blocks.cpp @@ -275,7 +275,8 @@ process_block_array_leaf(const char *name, unsigned i = *block_index; const glsl_type *type = b->type->without_array(); - blocks[i].Name = ralloc_strdup(blocks, name); + blocks[i].name.string = ralloc_strdup(blocks, name); + resource_name_updated(&blocks[i].name); blocks[i].Uniforms = &variables[(*parcel).index]; /* The ARB_shading_language_420pack spec says: @@ -292,7 +293,7 @@ process_block_array_leaf(const char *name, blocks[i]._RowMajor = type->get_interface_row_major(); blocks[i].linearized_array_index = linearized_index; - parcel->process(type, b->has_instance_name ? blocks[i].Name : ""); + parcel->process(type, b->has_instance_name ? blocks[i].name.string : ""); blocks[i].UniformBufferSize = parcel->buffer_size; @@ -480,7 +481,7 @@ static bool link_uniform_blocks_are_compatible(const gl_uniform_block *a, const gl_uniform_block *b) { - assert(strcmp(a->Name, b->Name) == 0); + assert(strcmp(a->name.string, b->name.string) == 0); /* Page 35 (page 42 of the PDF) in section 4.3.7 of the GLSL 1.50 spec says: * @@ -534,7 +535,7 @@ link_cross_validate_uniform_block(void *mem_ctx, for (unsigned int i = 0; i < *num_linked_blocks; i++) { struct gl_uniform_block *old_block = &(*linked_blocks)[i]; - if (strcmp(old_block->Name, new_block->Name) == 0) + if (strcmp(old_block->name.string, new_block->name.string) == 0) return link_uniform_blocks_are_compatible(old_block, new_block) ? i : -1; } @@ -554,7 +555,8 @@ link_cross_validate_uniform_block(void *mem_ctx, new_block->Uniforms, sizeof(*linked_block->Uniforms) * linked_block->NumUniforms); - linked_block->Name = ralloc_strdup(*linked_blocks, linked_block->Name); + linked_block->name.string = ralloc_strdup(*linked_blocks, linked_block->name.string); + resource_name_updated(&linked_block->name); for (unsigned int i = 0; i < linked_block->NumUniforms; i++) { struct gl_uniform_buffer_variable *ubo_var = diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index cb1655a97e0..5432f605bf2 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -139,7 +139,7 @@ get_array_size(struct gl_uniform_storage *uni, const glsl_struct_field *field, * member is an array with no declared size, the value zero is written * to ." */ - if (is_top_level_shader_storage_block_member(uni->name, + if (is_top_level_shader_storage_block_member(uni->name.string, interface_name, var_name)) return 1; @@ -171,7 +171,7 @@ get_array_stride(struct gl_uniform_storage *uni, const glsl_type *iface, bool row_major = matrix_layout == GLSL_MATRIX_LAYOUT_ROW_MAJOR; const glsl_type *array_type = field->type->fields.array; - if (is_top_level_shader_storage_block_member(uni->name, + if (is_top_level_shader_storage_block_member(uni->name.string, interface_name, var_name)) return 0; @@ -200,15 +200,15 @@ calculate_array_size_and_stride(struct gl_shader_program *shProg, int block_index = uni->block_index; int array_size = -1; int array_stride = -1; - char *var_name = get_top_level_name(uni->name); + char *var_name = get_top_level_name(uni->name.string); char *interface_name = get_top_level_name(uni->is_shader_storage ? - shProg->data->ShaderStorageBlocks[block_index].Name : - shProg->data->UniformBlocks[block_index].Name); + shProg->data->ShaderStorageBlocks[block_index].name.string : + shProg->data->UniformBlocks[block_index].name.string); if (strcmp(var_name, interface_name) == 0) { /* Deal with instanced array of SSBOs */ - char *temp_name = get_var_name(uni->name); + char *temp_name = get_var_name(uni->name.string); if (!temp_name) { linker_error(shProg, "Out of memory during linking.\n"); goto write_top_level_array_size_and_stride; @@ -758,15 +758,15 @@ public: unsigned l = strlen(var->get_interface_type()->name); for (unsigned i = 0; i < num_blks; i++) { - if (strncmp(var->get_interface_type()->name, blks[i].Name, l) - == 0 && blks[i].Name[l] == '[') { + if (strncmp(var->get_interface_type()->name, blks[i].name.string, l) + == 0 && blks[i].name.string[l] == '[') { buffer_block_index = i; break; } } } else { for (unsigned i = 0; i < num_blks; i++) { - if (strcmp(var->get_interface_type()->name, blks[i].Name) == 0) { + if (strcmp(var->get_interface_type()->name, blks[i].name.string) == 0) { buffer_block_index = i; break; } @@ -1114,7 +1114,8 @@ private: this->uniforms[id].remap_location = UNMAPPED_UNIFORM_LOC; } - this->uniforms[id].name = ralloc_strdup(this->uniforms, name); + this->uniforms[id].name.string = ralloc_strdup(this->uniforms, name); + resource_name_updated(&this->uniforms[id].name); this->uniforms[id].type = base_type; this->uniforms[id].num_driver_storage = 0; this->uniforms[id].driver_storage = NULL; @@ -1335,7 +1336,7 @@ link_update_uniform_buffer_variables(struct gl_linked_shader *shader, const ptrdiff_t len = strlen(var->get_interface_type()->name); for (unsigned i = 0; i < num_blocks; i++) { - const char *const begin = blks[i]->Name; + const char *const begin = blks[i]->name.string; const char *const end = strchr(begin, sentinel); if (end == NULL) diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index abae4377e83..30f83b21d32 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -1424,8 +1424,9 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog, } store_varying: - info->Varyings[info->NumVarying].Name = ralloc_strdup(prog, - this->orig_name); + info->Varyings[info->NumVarying].name.string = ralloc_strdup(prog, + this->orig_name); + resource_name_updated(&info->Varyings[info->NumVarying].name); info->Varyings[info->NumVarying].Type = this->type; info->Varyings[info->NumVarying].Size = size; info->Varyings[info->NumVarying].BufferIndex = buffer_index; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index a1be0e5011c..0b4633a0d59 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1287,7 +1287,7 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, if (index == -1) { linker_error(prog, "buffer block `%s' has mismatching " - "definitions\n", sh_blks[j]->Name); + "definitions\n", sh_blks[j]->name.string); for (unsigned k = 0; k <= i; k++) { free(ifc_blk_stage_idx[k]); @@ -3744,24 +3744,26 @@ create_shader_variable(struct gl_shader_program *shProg, */ if (in->data.mode == ir_var_system_value && in->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) { - out->name = ralloc_strdup(shProg, "gl_VertexID"); + out->name.string = ralloc_strdup(shProg, "gl_VertexID"); } else if ((in->data.mode == ir_var_shader_out && in->data.location == VARYING_SLOT_TESS_LEVEL_OUTER) || (in->data.mode == ir_var_system_value && in->data.location == SYSTEM_VALUE_TESS_LEVEL_OUTER)) { - out->name = ralloc_strdup(shProg, "gl_TessLevelOuter"); + out->name.string = ralloc_strdup(shProg, "gl_TessLevelOuter"); type = glsl_type::get_array_instance(glsl_type::float_type, 4); } else if ((in->data.mode == ir_var_shader_out && in->data.location == VARYING_SLOT_TESS_LEVEL_INNER) || (in->data.mode == ir_var_system_value && in->data.location == SYSTEM_VALUE_TESS_LEVEL_INNER)) { - out->name = ralloc_strdup(shProg, "gl_TessLevelInner"); + out->name.string = ralloc_strdup(shProg, "gl_TessLevelInner"); type = glsl_type::get_array_instance(glsl_type::float_type, 2); } else { - out->name = ralloc_strdup(shProg, name); + out->name.string = ralloc_strdup(shProg, name); } - if (!out->name) + resource_name_updated(&out->name); + + if (!out->name.string) return NULL; /* The ARB_program_interface_query spec says: @@ -4351,7 +4353,8 @@ link_assign_subroutine_types(struct gl_shader_program *prog) p->sh.SubroutineFunctions = reralloc(p, p->sh.SubroutineFunctions, struct gl_subroutine_function, p->sh.NumSubroutineFunctions + 1); - p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name = ralloc_strdup(p, fn->name); + p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name.string = ralloc_strdup(p, fn->name); + resource_name_updated(&p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].name); p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].num_compat_types = fn->num_subroutine_types; p->sh.SubroutineFunctions[p->sh.NumSubroutineFunctions].types = ralloc_array(p, const struct glsl_type *, @@ -4402,7 +4405,7 @@ verify_subroutine_associated_funcs(struct gl_shader_program *prog) */ for (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) { unsigned definitions = 0; - char *name = p->sh.SubroutineFunctions[j].name; + char *name = p->sh.SubroutineFunctions[j].name.string; ir_function *fn = symbols->get_function(name); /* Calculate number of function definitions with the same name */ @@ -5034,3 +5037,8 @@ done: ralloc_free(mem_ctx); } + +void +resource_name_updated(struct gl_resource_name *name) +{ +} diff --git a/src/compiler/glsl/linker_util.cpp b/src/compiler/glsl/linker_util.cpp index a790de3ca39..9b0cdef4032 100644 --- a/src/compiler/glsl/linker_util.cpp +++ b/src/compiler/glsl/linker_util.cpp @@ -235,7 +235,7 @@ link_util_check_uniform_resources(struct gl_context *ctx, if (prog->data->UniformBlocks[i].UniformBufferSize > ctx->Const.MaxUniformBlockSize) { linker_error(prog, "Uniform block %s too big (%d/%d)\n", - prog->data->UniformBlocks[i].Name, + prog->data->UniformBlocks[i].name.string, prog->data->UniformBlocks[i].UniformBufferSize, ctx->Const.MaxUniformBlockSize); } @@ -245,7 +245,7 @@ link_util_check_uniform_resources(struct gl_context *ctx, if (prog->data->ShaderStorageBlocks[i].UniformBufferSize > ctx->Const.MaxShaderStorageBlockSize) { linker_error(prog, "Shader storage block %s too big (%d/%d)\n", - prog->data->ShaderStorageBlocks[i].Name, + prog->data->ShaderStorageBlocks[i].name.string, prog->data->ShaderStorageBlocks[i].UniformBufferSize, ctx->Const.MaxShaderStorageBlockSize); } diff --git a/src/compiler/glsl/lower_ubo_reference.cpp b/src/compiler/glsl/lower_ubo_reference.cpp index 71dbd490023..360ea24b317 100644 --- a/src/compiler/glsl/lower_ubo_reference.cpp +++ b/src/compiler/glsl/lower_ubo_reference.cpp @@ -303,7 +303,7 @@ lower_ubo_reference_visitor::setup_for_load_or_store(void *mem_ctx, } this->uniform_block = NULL; for (unsigned i = 0; i < num_blocks; i++) { - if (strcmp(field_name, blocks[i]->Name) == 0) { + if (strcmp(field_name, blocks[i]->name.string) == 0) { ir_constant *index = new(mem_ctx) ir_constant(i); diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index 3356123ab75..dbc0ab7c11b 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -55,7 +55,7 @@ write_subroutines(struct blob *metadata, struct gl_shader_program *prog) for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) { int num_types = glprog->sh.SubroutineFunctions[j].num_compat_types; - blob_write_string(metadata, glprog->sh.SubroutineFunctions[j].name); + blob_write_string(metadata, glprog->sh.SubroutineFunctions[j].name.string); blob_write_uint32(metadata, glprog->sh.SubroutineFunctions[j].index); blob_write_uint32(metadata, num_types); @@ -88,7 +88,8 @@ read_subroutines(struct blob_reader *metadata, struct gl_shader_program *prog) glprog->sh.SubroutineFunctions = subs; for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) { - subs[j].name = ralloc_strdup(prog, blob_read_string (metadata)); + subs[j].name.string = ralloc_strdup(prog, blob_read_string (metadata)); + resource_name_updated(&subs[j].name); subs[j].index = (int) blob_read_uint32(metadata); subs[j].num_compat_types = (int) blob_read_uint32(metadata); @@ -104,7 +105,7 @@ read_subroutines(struct blob_reader *metadata, struct gl_shader_program *prog) static void write_buffer_block(struct blob *metadata, struct gl_uniform_block *b) { - blob_write_string(metadata, b->Name); + blob_write_string(metadata, b->name.string); blob_write_uint32(metadata, b->NumUniforms); blob_write_uint32(metadata, b->Binding); blob_write_uint32(metadata, b->UniformBufferSize); @@ -160,7 +161,8 @@ static void read_buffer_block(struct blob_reader *metadata, struct gl_uniform_block *b, struct gl_shader_program *prog) { - b->Name = ralloc_strdup(prog->data, blob_read_string (metadata)); + b->name.string = ralloc_strdup(prog->data, blob_read_string (metadata)); + resource_name_updated(&b->name); b->NumUniforms = blob_read_uint32(metadata); b->Binding = blob_read_uint32(metadata); b->UniformBufferSize = blob_read_uint32(metadata); @@ -340,7 +342,7 @@ write_xfb(struct blob *metadata, struct gl_shader_program *shProg) ltf->NumOutputs); for (int i = 0; i < ltf->NumVarying; i++) { - blob_write_string(metadata, ltf->Varyings[i].Name); + blob_write_string(metadata, ltf->Varyings[i].name.string); blob_write_uint32(metadata, ltf->Varyings[i].Type); blob_write_uint32(metadata, ltf->Varyings[i].BufferIndex); blob_write_uint32(metadata, ltf->Varyings[i].Size); @@ -402,7 +404,8 @@ read_xfb(struct blob_reader *metadata, struct gl_shader_program *shProg) ltf->NumVarying); for (int i = 0; i < ltf->NumVarying; i++) { - ltf->Varyings[i].Name = ralloc_strdup(prog, blob_read_string(metadata)); + ltf->Varyings[i].name.string = ralloc_strdup(prog, blob_read_string(metadata)); + resource_name_updated(<f->Varyings[i].name); ltf->Varyings[i].Type = blob_read_uint32(metadata); ltf->Varyings[i].BufferIndex = blob_read_uint32(metadata); ltf->Varyings[i].Size = blob_read_uint32(metadata); @@ -435,8 +438,8 @@ write_uniforms(struct blob *metadata, struct gl_shader_program *prog) for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { encode_type_to_blob(metadata, prog->data->UniformStorage[i].type); blob_write_uint32(metadata, prog->data->UniformStorage[i].array_elements); - if (prog->data->UniformStorage[i].name) { - blob_write_string(metadata, prog->data->UniformStorage[i].name); + if (prog->data->UniformStorage[i].name.string) { + blob_write_string(metadata, prog->data->UniformStorage[i].name.string); } else { blob_write_string(metadata, ""); } @@ -514,7 +517,8 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog) for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { uniforms[i].type = decode_type_from_blob(metadata); uniforms[i].array_elements = blob_read_uint32(metadata); - uniforms[i].name = ralloc_strdup(prog, blob_read_string (metadata)); + uniforms[i].name.string = ralloc_strdup(prog, blob_read_string (metadata)); + resource_name_updated(&uniforms[i].name); uniforms[i].builtin = blob_read_uint32(metadata); uniforms[i].remap_location = blob_read_uint32(metadata); uniforms[i].block_index = blob_read_uint32(metadata); @@ -530,7 +534,7 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog) uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata); uniforms[i].top_level_array_size = blob_read_uint32(metadata); uniforms[i].top_level_array_stride = blob_read_uint32(metadata); - prog->UniformHash->put(i, uniforms[i].name); + prog->UniformHash->put(i, uniforms[i].name.string); if (has_uniform_storage(prog, i)) { uniforms[i].storage = data + blob_read_uint32(metadata); @@ -767,8 +771,8 @@ write_shader_subroutine_index(struct blob *metadata, assert(sh); for (unsigned j = 0; j < sh->Program->sh.NumSubroutineFunctions; j++) { - if (strcmp(((gl_subroutine_function *)res->Data)->name, - sh->Program->sh.SubroutineFunctions[j].name) == 0) { + if (strcmp(((gl_subroutine_function *)res->Data)->name.string, + sh->Program->sh.SubroutineFunctions[j].name.string) == 0) { blob_write_uint32(metadata, j); break; } @@ -809,8 +813,8 @@ write_program_resource_data(struct blob *metadata, encode_type_to_blob(metadata, var->interface_type); encode_type_to_blob(metadata, var->outermost_struct_type); - if (var->name) { - blob_write_string(metadata, var->name); + if (var->name.string) { + blob_write_string(metadata, var->name.string); } else { blob_write_string(metadata, ""); } @@ -825,8 +829,8 @@ write_program_resource_data(struct blob *metadata, } case GL_UNIFORM_BLOCK: for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) { - if (strcmp(((gl_uniform_block *)res->Data)->Name, - prog->data->UniformBlocks[i].Name) == 0) { + if (strcmp(((gl_uniform_block *)res->Data)->name.string, + prog->data->UniformBlocks[i].name.string) == 0) { blob_write_uint32(metadata, i); break; } @@ -834,8 +838,8 @@ write_program_resource_data(struct blob *metadata, break; case GL_SHADER_STORAGE_BLOCK: for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) { - if (strcmp(((gl_uniform_block *)res->Data)->Name, - prog->data->ShaderStorageBlocks[i].Name) == 0) { + if (strcmp(((gl_uniform_block *)res->Data)->name.string, + prog->data->ShaderStorageBlocks[i].name.string) == 0) { blob_write_uint32(metadata, i); break; } @@ -853,8 +857,8 @@ write_program_resource_data(struct blob *metadata, res->Type != GL_UNIFORM) { blob_write_uint32(metadata, uniform_not_remapped); for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { - if (strcmp(((gl_uniform_storage *)res->Data)->name, - prog->data->UniformStorage[i].name) == 0) { + if (strcmp(((gl_uniform_storage *)res->Data)->name.string, + prog->data->UniformStorage[i].name.string) == 0) { blob_write_uint32(metadata, i); break; } @@ -884,8 +888,8 @@ write_program_resource_data(struct blob *metadata, break; case GL_TRANSFORM_FEEDBACK_VARYING: for (int i = 0; i < prog->last_vert_prog->sh.LinkedTransformFeedback->NumVarying; i++) { - if (strcmp(((gl_transform_feedback_varying_info *)res->Data)->Name, - prog->last_vert_prog->sh.LinkedTransformFeedback->Varyings[i].Name) == 0) { + if (strcmp(((gl_transform_feedback_varying_info *)res->Data)->name.string, + prog->last_vert_prog->sh.LinkedTransformFeedback->Varyings[i].name.string) == 0) { blob_write_uint32(metadata, i); break; } @@ -922,7 +926,8 @@ read_program_resource_data(struct blob_reader *metadata, var->interface_type = decode_type_from_blob(metadata); var->outermost_struct_type = decode_type_from_blob(metadata); - var->name = ralloc_strdup(prog, blob_read_string(metadata)); + var->name.string = ralloc_strdup(prog, blob_read_string(metadata)); + resource_name_updated(&var->name); size_t s_var_size, s_var_ptrs; get_shader_var_and_pointer_sizes(&s_var_size, &s_var_ptrs, var); diff --git a/src/compiler/glsl/tests/set_uniform_initializer_tests.cpp b/src/compiler/glsl/tests/set_uniform_initializer_tests.cpp index 282c9b4dd4e..56e41057300 100644 --- a/src/compiler/glsl/tests/set_uniform_initializer_tests.cpp +++ b/src/compiler/glsl/tests/set_uniform_initializer_tests.cpp @@ -122,7 +122,7 @@ establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage, num_storage); prog->data->NumUniformStorage = num_storage; - prog->data->UniformStorage[index_to_set].name = (char *) name; + prog->data->UniformStorage[index_to_set].name.string = (char *) name; prog->data->UniformStorage[index_to_set].type = type; prog->data->UniformStorage[index_to_set].array_elements = array_size; for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { @@ -139,13 +139,13 @@ establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage, red_zone_components); prog->UniformHash->put(index_to_set, - prog->data->UniformStorage[index_to_set].name); + prog->data->UniformStorage[index_to_set].name.string); for (unsigned i = 0; i < num_storage; i++) { if (i == index_to_set) continue; - prog->data->UniformStorage[i].name = (char *) "invalid slot"; + prog->data->UniformStorage[i].name.string = (char *) "invalid slot"; prog->data->UniformStorage[i].type = glsl_type::void_type; prog->data->UniformStorage[i].array_elements = 0; for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index eb49d6a0da3..77dbcbda1c1 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -48,6 +48,7 @@ #include "compiler/shader_info.h" #include "main/formats.h" /* MESA_FORMAT_COUNT */ #include "compiler/glsl/list.h" +#include "compiler/glsl/ir_uniform.h" #include "util/u_idalloc.h" #include "util/simple_mtx.h" #include "util/u_dynarray.h" @@ -1808,7 +1809,7 @@ struct gl_evaluators struct gl_transform_feedback_varying_info { - char *Name; + struct gl_resource_name name; GLenum16 Type; GLint BufferIndex; GLint Size; @@ -2497,7 +2498,7 @@ struct gl_ati_fragment_shader_state */ struct gl_subroutine_function { - char *name; + struct gl_resource_name name; int index; int num_compat_types; const struct glsl_type **types; @@ -2767,7 +2768,7 @@ struct gl_uniform_buffer_variable struct gl_uniform_block { /** Declared name of the uniform block */ - char *Name; + struct gl_resource_name name; /** Array of supplemental information about UBO ir_variables. */ struct gl_uniform_buffer_variable *Uniforms; @@ -2858,7 +2859,7 @@ struct gl_shader_variable /** * Declared name of the variable */ - char *name; + struct gl_resource_name name; /** * Storage location of the base of this variable diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index 8b2fe7d2aea..0680ef05778 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -195,7 +195,7 @@ _mesa_GetActiveAttrib(GLuint program, GLuint desired_index, const gl_shader_variable *const var = RESOURCE_VAR(res); - const char *var_name = var->name; + const char *var_name = var->name.string; _mesa_copy_string(name, maxLength, length, var_name); @@ -286,8 +286,8 @@ _mesa_longest_attribute_name_length(struct gl_shader_program *shProg) * returned. If no active attributes exist, zero is returned. If * no name reflection information is available, one is returned." */ - const size_t length = RESOURCE_VAR(res)->name != NULL ? - strlen(RESOURCE_VAR(res)->name) : 0; + const size_t length = RESOURCE_VAR(res)->name.string != NULL ? + strlen(RESOURCE_VAR(res)->name.string) : 0; if (length >= longest) longest = length + 1; @@ -460,29 +460,29 @@ _mesa_program_resource_name(struct gl_program_resource *res) switch (res->Type) { case GL_UNIFORM_BLOCK: case GL_SHADER_STORAGE_BLOCK: - return RESOURCE_UBO(res)->Name; + return RESOURCE_UBO(res)->name.string; case GL_TRANSFORM_FEEDBACK_VARYING: - return RESOURCE_XFV(res)->Name; + return RESOURCE_XFV(res)->name.string; case GL_PROGRAM_INPUT: case GL_PROGRAM_OUTPUT: - return RESOURCE_VAR(res)->name; + return RESOURCE_VAR(res)->name.string; case GL_UNIFORM: case GL_BUFFER_VARIABLE: - return RESOURCE_UNI(res)->name; + return RESOURCE_UNI(res)->name.string; case GL_VERTEX_SUBROUTINE_UNIFORM: case GL_GEOMETRY_SUBROUTINE_UNIFORM: case GL_FRAGMENT_SUBROUTINE_UNIFORM: case GL_COMPUTE_SUBROUTINE_UNIFORM: case GL_TESS_CONTROL_SUBROUTINE_UNIFORM: case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: - return RESOURCE_UNI(res)->name + MESA_SUBROUTINE_PREFIX_LEN; + return RESOURCE_UNI(res)->name.string + MESA_SUBROUTINE_PREFIX_LEN; case GL_VERTEX_SUBROUTINE: case GL_GEOMETRY_SUBROUTINE: case GL_FRAGMENT_SUBROUTINE: case GL_COMPUTE_SUBROUTINE: case GL_TESS_CONTROL_SUBROUTINE: case GL_TESS_EVALUATION_SUBROUTINE: - return RESOURCE_SUB(res)->name; + return RESOURCE_SUB(res)->name.string; default: break; } @@ -1718,7 +1718,7 @@ validate_io(struct gl_program *producer, struct gl_program *consumer) * * Built-in inputs or outputs do not affect interface matching. */ - if (is_gl_identifier(var->name)) + if (is_gl_identifier(var->name.string)) continue; outputs[num_outputs++] = var; @@ -1735,7 +1735,7 @@ validate_io(struct gl_program *producer, struct gl_program *consumer) gl_shader_variable const *const consumer_var = RESOURCE_VAR(res); gl_shader_variable const *producer_var = NULL; - if (is_gl_identifier(consumer_var->name)) + if (is_gl_identifier(consumer_var->name.string)) continue; /* Inputs with explicit locations match other outputs with explicit @@ -1757,7 +1757,7 @@ validate_io(struct gl_program *producer, struct gl_program *consumer) const gl_shader_variable *const var = outputs[j]; if (!var->explicit_location && - strcmp(consumer_var->name, var->name) == 0) { + strcmp(consumer_var->name.string, var->name.string) == 0) { producer_var = var; match_index = j; break; diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 1dda13d9f1f..f1498fb44d3 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -796,7 +796,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, * We are setting 0 here, as below it will add 1 for the NUL character. */ const GLint base_len = - strlen_or_zero(shProg->data->UniformStorage[i].name); + strlen_or_zero(shProg->data->UniformStorage[i].name.string); /* Add one for the terminating NUL character for a non-array, and * 4 for the "[0]" and the NUL for an array. @@ -848,7 +848,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, for (i = 0; i < num_varying; i++) { const char *name = in_shader_varyings ? - shProg->last_vert_prog->sh.LinkedTransformFeedback->Varyings[i].Name + shProg->last_vert_prog->sh.LinkedTransformFeedback->Varyings[i].name.string : shProg->TransformFeedback.VaryingNames[i]; /* Add one for the terminating NUL character. We have to use @@ -920,7 +920,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, * available, one is returned." */ const GLint len = - strlen_or_zero(shProg->data->UniformBlocks[i].Name) + 1; + strlen_or_zero(shProg->data->UniformBlocks[i].name.string) + 1; if (len > max_len) max_len = len; diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index b3413f5f676..b2a79f01321 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -271,7 +271,7 @@ validate_uniform_parameters(GLint location, GLsizei count, if (count > 1) { _mesa_error(ctx, GL_INVALID_OPERATION, "%s(count = %u for non-array \"%s\"@%d)", - caller, count, uni->name, location); + caller, count, uni->name.string, location); return NULL; } @@ -741,7 +741,7 @@ log_uniform(const void *values, enum glsl_base_type basicType, printf("Mesa: set program %u %s \"%s\" (loc %d, type \"%s\", " "transpose = %s) to: ", - shProg->Name, extra, uni->name, location, uni->type->name, + shProg->Name, extra, uni->name.string, location, uni->type->name, transpose ? "true" : "false"); for (unsigned i = 0; i < elems; i++) { if (i != 0 && ((i % rows) == 0)) @@ -981,7 +981,7 @@ validate_uniform(GLint location, GLsizei count, const GLvoid *values, /* Can't set matrix uniforms (like mat4) with glUniform */ _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform%u(uniform \"%s\"@%d is matrix)", - src_components, uni->name, location); + src_components, uni->name.string, location); return NULL; } @@ -992,7 +992,7 @@ validate_uniform(GLint location, GLsizei count, const GLvoid *values, /* glUniformN() must match float/vecN type */ _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform%u(\"%s\"@%u has %u components, not %u)", - src_components, uni->name, location, + src_components, uni->name.string, location, components, src_components); return NULL; } @@ -1019,7 +1019,7 @@ validate_uniform(GLint location, GLsizei count, const GLvoid *values, if (!match) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform%u(\"%s\"@%d is %s, not %s)", - src_components, uni->name, location, + src_components, uni->name.string, location, glsl_type_name(uni->type->base_type), glsl_type_name(basicType)); return NULL; @@ -1731,7 +1731,7 @@ _mesa_uniform_matrix(GLint location, GLsizei count, basicType == GLSL_TYPE_FLOAT)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix%ux%u(\"%s\"@%d is %s, not %s)", - cols, rows, uni->name, location, + cols, rows, uni->name.string, location, glsl_type_name(uni->type->base_type), glsl_type_name(basicType)); return;