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 <nicolai.haehnle@amd.com>
This commit is contained in:

committed by
Timothy Arceri

parent
0e9991f957
commit
794f7326bc
@@ -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();
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user