diff options
-rw-r--r-- | src/glsl/link_uniforms.cpp | 87 | ||||
-rw-r--r-- | src/glsl/linker.cpp | 19 | ||||
-rw-r--r-- | src/glsl/linker.h | 3 |
3 files changed, 24 insertions, 85 deletions
diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp index 76ee70dd400..33b2d4c8646 100644 --- a/src/glsl/link_uniforms.cpp +++ b/src/glsl/link_uniforms.cpp @@ -1057,40 +1057,9 @@ assign_hidden_uniform_slot_id(const char *name, unsigned hidden_id, uniform_size->map->put(hidden_uniform_start + hidden_id, name); } -/** - * Search UniformRemapTable for empty block big enough to hold given uniform. - * TODO Optimize this algorithm later if it turns out to be a major bottleneck. - */ -static int -find_empty_block(struct gl_shader_program *prog, - struct gl_uniform_storage *uniform) -{ - const unsigned entries = MAX2(1, uniform->array_elements); - for (unsigned i = 0, j; i < prog->NumUniformRemapTable; i++) { - /* We found empty space in UniformRemapTable. */ - if (prog->UniformRemapTable[i] == NULL) { - for (j = i; j < entries && j < prog->NumUniformRemapTable; j++) { - if (prog->UniformRemapTable[j] != NULL) { - /* Entries do not fit in this space, continue searching - * after this location. - */ - i = j + 1; - break; - } - } - /* Entries fit, we can return this location. */ - if (i != j + 1) { - return i; - } - } - } - return -1; -} - void link_assign_uniform_locations(struct gl_shader_program *prog, - unsigned int boolean_true, - unsigned int max_locations) + unsigned int boolean_true) { ralloc_free(prog->UniformStorage); prog->UniformStorage = NULL; @@ -1181,20 +1150,6 @@ link_assign_uniform_locations(struct gl_shader_program *prog, parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data); - unsigned total_entries = 0; - - /* Calculate amount of 'holes' left after explicit locations were - * reserved from UniformRemapTable. - */ - unsigned empty_locs = 0; - for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) - if (prog->UniformRemapTable[i] == NULL) - empty_locs++; - - /* Add all the reserved explicit locations - empty locations in remap table. */ - if (prog->NumUniformRemapTable) - total_entries = (prog->NumUniformRemapTable - 1) - empty_locs; - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { if (prog->_LinkedShaders[i] == NULL) continue; @@ -1258,43 +1213,21 @@ link_assign_uniform_locations(struct gl_shader_program *prog, /* how many new entries for this uniform? */ const unsigned entries = MAX2(1, uniforms[i].array_elements); - /* Find UniformRemapTable for empty blocks where we can fit this uniform. */ - int chosen_location = -1; - - if (empty_locs) - chosen_location = find_empty_block(prog, &uniforms[i]); - - if (chosen_location != -1) { - empty_locs -= entries; - } else { - chosen_location = prog->NumUniformRemapTable; - - /* Add new entries to the total amount of entries. */ - total_entries += entries; - - /* resize remap table to fit new entries */ - prog->UniformRemapTable = - reralloc(prog, - prog->UniformRemapTable, - gl_uniform_storage *, - prog->NumUniformRemapTable + entries); - prog->NumUniformRemapTable += entries; - } + /* resize remap table to fit new entries */ + prog->UniformRemapTable = + reralloc(prog, + prog->UniformRemapTable, + gl_uniform_storage *, + prog->NumUniformRemapTable + entries); /* set pointers for this uniform */ for (unsigned j = 0; j < entries; j++) - prog->UniformRemapTable[chosen_location + j] = &uniforms[i]; + prog->UniformRemapTable[prog->NumUniformRemapTable+j] = &uniforms[i]; /* set the base location in remap table for the uniform */ - uniforms[i].remap_location = chosen_location; - } + uniforms[i].remap_location = prog->NumUniformRemapTable; - /* Verify that total amount of entries for explicit and implicit locations - * is less than MAX_UNIFORM_LOCATIONS. - */ - if (total_entries >= max_locations) { - linker_error(prog, "count of uniform locations >= MAX_UNIFORM_LOCATIONS" - "(%u >= %u)", total_entries, max_locations); + prog->NumUniformRemapTable += entries; } /* Reserve all the explicit locations of the active subroutine uniforms. */ diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 5be8d9fc48f..6657777d74c 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -3146,6 +3146,7 @@ check_explicit_uniform_locations(struct gl_context *ctx, return; } + unsigned entries_total = 0; for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { struct gl_shader *sh = prog->_LinkedShaders[i]; @@ -3157,6 +3158,8 @@ check_explicit_uniform_locations(struct gl_context *ctx, if (!var || var->data.mode != ir_var_uniform) continue; + entries_total += var->type->uniform_locations(); + if (var->data.explicit_location) { bool ret; if (var->type->without_array()->is_subroutine()) @@ -3170,6 +3173,15 @@ check_explicit_uniform_locations(struct gl_context *ctx, } } } + + /* Verify that total amount of entries for explicit and implicit locations + * is less than MAX_UNIFORM_LOCATIONS. + */ + if (entries_total >= ctx->Const.MaxUserAssignableUniformLocations) { + linker_error(prog, "count of uniform locations >= MAX_UNIFORM_LOCATIONS" + "(%u >= %u)", entries_total, + ctx->Const.MaxUserAssignableUniformLocations); + } delete uniform_map; } @@ -4544,12 +4556,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) goto done; update_array_sizes(prog); - link_assign_uniform_locations(prog, ctx->Const.UniformBooleanTrue, - ctx->Const.MaxUserAssignableUniformLocations); - - if (!prog->LinkStatus) - goto done; - + link_assign_uniform_locations(prog, ctx->Const.UniformBooleanTrue); link_assign_atomic_counter_resources(ctx, prog); store_fragdepth_layout(prog); diff --git a/src/glsl/linker.h b/src/glsl/linker.h index 76f95c04704..c80be1c7e22 100644 --- a/src/glsl/linker.h +++ b/src/glsl/linker.h @@ -35,8 +35,7 @@ link_invalidate_variable_locations(exec_list *ir); extern void link_assign_uniform_locations(struct gl_shader_program *prog, - unsigned int boolean_true, - unsigned int max_locations); + unsigned int boolean_true); extern void link_set_uniform_initializers(struct gl_shader_program *prog, |