aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2016-04-27 15:41:19 +1000
committerTimothy Arceri <[email protected]>2017-02-17 11:18:43 +1100
commit794f7326bcc3ffb7ab473d2c10a8c81ff4958167 (patch)
tree1efd2f1eaae2fe03ee0d6ae05db83cb69e06224b
parent0e9991f957e296f46cfff40a94ffba0adf2a58e1 (diff)
glsl: don't lose uniform values when falling back to full compile
Here we skip the recreation of uniform storage if we are relinking after a cache miss. This is improtant because uniform values may have already been set by the application and we don't want to reset them. Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/compiler/glsl/link_uniforms.cpp31
-rw-r--r--src/mesa/main/shaderobj.c4
2 files changed, 25 insertions, 10 deletions
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp
index 2b277930f36..c29fbed7435 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -1213,11 +1213,17 @@ link_assign_uniform_storage(struct gl_context *ctx,
unsigned int boolean_true = ctx->Const.UniformBooleanTrue;
- prog->data->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage,
- prog->data->NumUniformStorage);
- union gl_constant_value *data = rzalloc_array(prog->data->UniformStorage,
- union gl_constant_value,
- num_data_slots);
+ union gl_constant_value *data;
+ if (prog->data->UniformStorage == NULL) {
+ prog->data->UniformStorage = rzalloc_array(prog,
+ struct gl_uniform_storage,
+ prog->data->NumUniformStorage);
+ data = rzalloc_array(prog->data->UniformStorage,
+ union gl_constant_value, num_data_slots);
+ } else {
+ data = prog->data->UniformDataSlots;
+ }
+
#ifndef NDEBUG
union gl_constant_value *data_end = &data[num_data_slots];
#endif
@@ -1252,6 +1258,13 @@ link_assign_uniform_storage(struct gl_context *ctx,
sizeof(prog->_LinkedShaders[i]->Program->sh.SamplerTargets));
}
+ /* If this is a fallback compile for a cache miss we already have the
+ * correct uniform mappings and we don't want to reinitialise uniforms so
+ * just return now.
+ */
+ if (prog->data->cache_fallback)
+ return;
+
#ifndef NDEBUG
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
assert(prog->data->UniformStorage[i].storage != NULL ||
@@ -1276,9 +1289,11 @@ void
link_assign_uniform_locations(struct gl_shader_program *prog,
struct gl_context *ctx)
{
- ralloc_free(prog->data->UniformStorage);
- prog->data->UniformStorage = NULL;
- prog->data->NumUniformStorage = 0;
+ if (!prog->data->cache_fallback) {
+ ralloc_free(prog->data->UniformStorage);
+ prog->data->UniformStorage = NULL;
+ prog->data->NumUniformStorage = 0;
+ }
if (prog->UniformHash != NULL) {
prog->UniformHash->clear();
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 2ca65442726..8cc90736801 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -327,7 +327,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
shProg->data->linked_stages = 0;
- if (shProg->data->UniformStorage) {
+ if (shProg->data->UniformStorage && !shProg->data->cache_fallback) {
for (unsigned i = 0; i < shProg->data->NumUniformStorage; ++i)
_mesa_uniform_detach_all_driver_storage(&shProg->data->
UniformStorage[i]);
@@ -336,7 +336,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
shProg->data->UniformStorage = NULL;
}
- if (shProg->UniformRemapTable) {
+ if (shProg->UniformRemapTable && !shProg->data->cache_fallback) {
ralloc_free(shProg->UniformRemapTable);
shProg->NumUniformRemapTable = 0;
shProg->UniformRemapTable = NULL;