main, glsl: Add UniformDataDefaults which stores uniform defaults

The ARB_get_program_binary extension requires that uniform values in a
program be restored to their initial value just after linking.

This patch saves off the initial values just after linking. When the
program is restored by glProgramBinary, we can use this to copy the
initial value of uniforms into UniformDataSlots.

V2 (Timothy Arceri):
 - Store UniformDataDefaults only when serializing GLSL as this
   is what we want for both disk cache and ARB_get_program_binary.
   This saves us having to come back later and reset the Uniforms
   on program binary restores.

Signed-off-by: Timothy Arceri <tarceri@itsqueeze.com>
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> (v1)
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
Jordan Justen
2017-10-30 11:16:48 -07:00
committed by Timothy Arceri
parent ebd9e789c4
commit 7cf1037d5a
4 changed files with 30 additions and 2 deletions

View File

@@ -357,5 +357,7 @@ link_set_uniform_initializers(struct gl_shader_program *prog,
}
}
memcpy(prog->data->UniformDataDefaults, prog->data->UniformDataSlots,
sizeof(union gl_constant_value) * prog->data->NumUniformDataSlots);
ralloc_free(mem_ctx);
}

View File

@@ -1365,6 +1365,9 @@ link_assign_uniform_storage(struct gl_context *ctx,
prog->data->NumUniformStorage);
data = rzalloc_array(prog->data->UniformStorage,
union gl_constant_value, num_data_slots);
prog->data->UniformDataDefaults =
rzalloc_array(prog->data->UniformStorage,
union gl_constant_value, num_data_slots);
} else {
data = prog->data->UniformDataSlots;
}

View File

@@ -449,7 +449,10 @@ write_uniforms(struct blob *metadata, struct gl_shader_program *prog)
unsigned vec_size =
prog->data->UniformStorage[i].type->component_slots() *
MAX2(prog->data->UniformStorage[i].array_elements, 1);
blob_write_bytes(metadata, prog->data->UniformStorage[i].storage,
unsigned slot =
prog->data->UniformStorage[i].storage -
prog->data->UniformDataSlots;
blob_write_bytes(metadata, &prog->data->UniformDataDefaults[slot],
sizeof(union gl_constant_value) * vec_size);
}
}
@@ -472,6 +475,9 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
data = rzalloc_array(uniforms, union gl_constant_value,
prog->data->NumUniformDataSlots);
prog->data->UniformDataSlots = data;
prog->data->UniformDataDefaults =
rzalloc_array(uniforms, union gl_constant_value,
prog->data->NumUniformDataSlots);
prog->UniformHash = new string_to_uint_map;
@@ -512,14 +518,20 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
unsigned vec_size =
prog->data->UniformStorage[i].type->component_slots() *
MAX2(prog->data->UniformStorage[i].array_elements, 1);
unsigned slot =
prog->data->UniformStorage[i].storage -
prog->data->UniformDataSlots;
blob_copy_bytes(metadata,
(uint8_t *) prog->data->UniformStorage[i].storage,
(uint8_t *) &prog->data->UniformDataSlots[slot],
sizeof(union gl_constant_value) * vec_size);
assert(vec_size + prog->data->UniformStorage[i].storage <=
data + prog->data->NumUniformDataSlots);
}
}
memcpy(prog->data->UniformDataDefaults, prog->data->UniformDataSlots,
sizeof(union gl_constant_value) * prog->data->NumUniformDataSlots);
}
enum uniform_remap_type