summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/glsl/link_uniforms.cpp19
-rw-r--r--src/compiler/glsl/linker.cpp27
-rw-r--r--src/compiler/glsl/linker.h3
-rw-r--r--src/mesa/main/mtypes.h5
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.