mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
glsl/serialize: optimize for equal offsets in uniform remap tables
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1416 This decreases the shader cache size in the ticket from 1.6 MB to 40 KB. Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
parent
e90269d90a
commit
88e9042b6c
1 changed files with 28 additions and 2 deletions
|
|
@ -568,7 +568,8 @@ enum uniform_remap_type
|
|||
{
|
||||
remap_type_inactive_explicit_location,
|
||||
remap_type_null_ptr,
|
||||
remap_type_uniform_offset
|
||||
remap_type_uniform_offset,
|
||||
remap_type_uniform_offsets_equal,
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
@ -581,15 +582,32 @@ write_uniform_remap_table(struct blob *metadata,
|
|||
|
||||
for (unsigned i = 0; i < num_entries; i++) {
|
||||
gl_uniform_storage *entry = remap_table[i];
|
||||
uint32_t offset = entry - uniform_storage;
|
||||
|
||||
if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) {
|
||||
blob_write_uint32(metadata, remap_type_inactive_explicit_location);
|
||||
} else if (entry == NULL) {
|
||||
blob_write_uint32(metadata, remap_type_null_ptr);
|
||||
} else if (i+1 < num_entries && entry == remap_table[i+1]) {
|
||||
blob_write_uint32(metadata, remap_type_uniform_offsets_equal);
|
||||
|
||||
/* If many offsets are equal, write only one offset and the number
|
||||
* of consecutive entries being equal.
|
||||
*/
|
||||
unsigned count = 1;
|
||||
for (unsigned j = i + 1; j < num_entries; j++) {
|
||||
if (entry != remap_table[j])
|
||||
break;
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
blob_write_uint32(metadata, offset);
|
||||
blob_write_uint32(metadata, count);
|
||||
i += count - 1;
|
||||
} else {
|
||||
blob_write_uint32(metadata, remap_type_uniform_offset);
|
||||
|
||||
uint32_t offset = entry - uniform_storage;
|
||||
blob_write_uint32(metadata, offset);
|
||||
}
|
||||
}
|
||||
|
|
@ -634,6 +652,14 @@ read_uniform_remap_table(struct blob_reader *metadata,
|
|||
remap_table[i] = INACTIVE_UNIFORM_EXPLICIT_LOCATION;
|
||||
} else if (type == remap_type_null_ptr) {
|
||||
remap_table[i] = NULL;
|
||||
} else if (type == remap_type_uniform_offsets_equal) {
|
||||
uint32_t uni_offset = blob_read_uint32(metadata);
|
||||
uint32_t count = blob_read_uint32(metadata);
|
||||
struct gl_uniform_storage *entry = uniform_storage + uni_offset;
|
||||
|
||||
for (unsigned j = 0; j < count; j++)
|
||||
remap_table[i+j] = entry;
|
||||
i += count - 1;
|
||||
} else {
|
||||
uint32_t uni_offset = blob_read_uint32(metadata);
|
||||
remap_table[i] = uniform_storage + uni_offset;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue