From: Timothy Arceri Date: Wed, 27 Apr 2016 05:41:19 +0000 (+1000) Subject: glsl: don't lose uniform values when falling back to full compile X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=794f7326bcc3ffb7ab473d2c10a8c81ff4958167;p=mesa.git 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 --- 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;