diff options
-rw-r--r-- | src/compiler/glsl/link_uniforms.cpp | 19 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 27 | ||||
-rw-r--r-- | src/compiler/glsl/linker.h | 3 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 5 |
4 files changed, 25 insertions, 29 deletions
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index 86711e22822..a450aa03a8c 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -1042,12 +1042,10 @@ find_empty_block(struct gl_shader_program *prog, static void link_setup_uniform_remap_tables(struct gl_context *ctx, - struct gl_shader_program *prog, - unsigned num_explicit_uniform_locs) + struct gl_shader_program *prog) { - unsigned total_entries = num_explicit_uniform_locs; - unsigned empty_locs = - prog->NumUniformRemapTable - num_explicit_uniform_locs; + unsigned total_entries = prog->NumExplicitUniformLocations; + unsigned empty_locs = prog->NumUniformRemapTable - total_entries; /* Reserve all the explicit locations of the active uniforms. */ for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) { @@ -1206,8 +1204,7 @@ link_setup_uniform_remap_tables(struct gl_context *ctx, static void link_assign_uniform_storage(struct gl_context *ctx, struct gl_shader_program *prog, - const unsigned num_data_slots, - unsigned num_explicit_uniform_locs) + const unsigned num_data_slots) { /* On the outside chance that there were no uniforms, bail out. */ @@ -1266,15 +1263,14 @@ link_assign_uniform_storage(struct gl_context *ctx, assert(parcel.values == data_end); #endif - link_setup_uniform_remap_tables(ctx, prog, num_explicit_uniform_locs); + link_setup_uniform_remap_tables(ctx, prog); link_set_uniform_initializers(prog, boolean_true); } void link_assign_uniform_locations(struct gl_shader_program *prog, - struct gl_context *ctx, - unsigned int num_explicit_uniform_locs) + struct gl_context *ctx) { ralloc_free(prog->data->UniformStorage); prog->data->UniformStorage = NULL; @@ -1335,6 +1331,5 @@ link_assign_uniform_locations(struct gl_shader_program *prog, hiddenUniforms->iterate(assign_hidden_uniform_slot_id, &uniform_size); delete hiddenUniforms; - link_assign_uniform_storage(ctx, prog, uniform_size.num_values, - num_explicit_uniform_locs); + link_assign_uniform_storage(ctx, prog, uniform_size.num_values); } diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 4db3ad1dea4..5f6b27c887b 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -3378,12 +3378,14 @@ reserve_subroutine_explicit_locations(struct gl_shader_program *prog, * any optimizations happen to handle also inactive uniforms and * inactive array elements that may get trimmed away. */ -static unsigned +static void check_explicit_uniform_locations(struct gl_context *ctx, struct gl_shader_program *prog) { + prog->NumExplicitUniformLocations = 0; + if (!ctx->Extensions.ARB_explicit_uniform_location) - return 0; + return; /* This map is used to detect if overlapping explicit locations * occur with the same uniform (from different stage) or a different one. @@ -3392,7 +3394,7 @@ check_explicit_uniform_locations(struct gl_context *ctx, if (!uniform_map) { linker_error(prog, "Out of memory during linking.\n"); - return 0; + return; } unsigned entries_total = 0; @@ -3420,7 +3422,7 @@ check_explicit_uniform_locations(struct gl_context *ctx, } if (!ret) { delete uniform_map; - return 0; + return; } } } @@ -3445,7 +3447,7 @@ check_explicit_uniform_locations(struct gl_context *ctx, } delete uniform_map; - return entries_total; + prog->NumExplicitUniformLocations = entries_total; } static bool @@ -4533,11 +4535,10 @@ disable_varying_optimizations_for_sso(struct gl_shader_program *prog) static void link_and_validate_uniforms(struct gl_context *ctx, - struct gl_shader_program *prog, - unsigned num_explicit_uniform_locs) + struct gl_shader_program *prog) { update_array_sizes(prog); - link_assign_uniform_locations(prog, ctx, num_explicit_uniform_locs); + link_assign_uniform_locations(prog, ctx); link_assign_atomic_counter_resources(ctx, prog); link_calculate_subroutine_compat(prog); @@ -4549,7 +4550,6 @@ link_and_validate_uniforms(struct gl_context *ctx, static bool link_varyings_and_uniforms(unsigned first, unsigned last, - unsigned num_explicit_uniform_locs, struct gl_context *ctx, struct gl_shader_program *prog, void *mem_ctx) { @@ -4595,7 +4595,7 @@ link_varyings_and_uniforms(unsigned first, unsigned last, if (!link_varyings(prog, first, last, ctx, mem_ctx)) return false; - link_and_validate_uniforms(ctx, prog, num_explicit_uniform_locs); + link_and_validate_uniforms(ctx, prog); if (!prog->data->LinkStatus) return false; @@ -4647,8 +4647,6 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) return; } - unsigned int num_explicit_uniform_locs = 0; - void *mem_ctx = ralloc_context(NULL); // temporary linker context prog->ARB_fragment_coord_conventions_enable = false; @@ -4828,7 +4826,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) last = i; } - num_explicit_uniform_locs = check_explicit_uniform_locations(ctx, prog); + check_explicit_uniform_locations(ctx, prog); link_assign_subroutine_types(prog); if (!prog->data->LinkStatus) @@ -4944,8 +4942,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) store_fragdepth_layout(prog); - if(!link_varyings_and_uniforms(first, last, num_explicit_uniform_locs, ctx, - prog, mem_ctx)) + if(!link_varyings_and_uniforms(first, last, ctx, prog, mem_ctx)) goto done; /* OpenGL ES < 3.1 requires that a vertex shader and a fragment shader both diff --git a/src/compiler/glsl/linker.h b/src/compiler/glsl/linker.h index 8363d549428..9841ef019e5 100644 --- a/src/compiler/glsl/linker.h +++ b/src/compiler/glsl/linker.h @@ -35,8 +35,7 @@ link_invalidate_variable_locations(exec_list *ir); extern void link_assign_uniform_locations(struct gl_shader_program *prog, - struct gl_context *ctx, - unsigned int num_explicit_uniform_locs); + struct gl_context *ctx); extern void link_set_uniform_initializers(struct gl_shader_program *prog, diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 793a527cb45..13a75734f99 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2835,6 +2835,11 @@ struct gl_shader_program unsigned LastCullDistanceArraySize; /** + * Total number of explicit uniform location including inactive uniforms. + */ + unsigned NumExplicitUniformLocations; + + /** * Map of active uniform names to locations * * Maps any active uniform that is not an array element to a location. |