mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 07:10:15 +01:00
glsl: Simplify the built-in function linking code.
Previously, we stored an array of up to 16 additional shaders to link, as well as a count of how many each shader actually needed. Since the built-in functions rewrite, all the built-ins are stored in a single shader. So all we need is a boolean indicating whether a shader needs to link against built-ins or not. During linking, we can avoid creating the temporary array if none of the shaders being linked need built-ins. Otherwise, it's simply a copy of the array that has one additional element. This is much simpler. This patch saves approximately 128 bytes of memory per gl_shader object. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
1b557b1606
commit
5b331f6fcb
7 changed files with 33 additions and 38 deletions
|
|
@ -458,8 +458,8 @@ no_matching_function_error(const char *name,
|
|||
|
||||
print_function_prototypes(state, loc, state->symbols->get_function(name));
|
||||
|
||||
if (state->num_builtins_to_link) {
|
||||
gl_shader *sh = state->builtins_to_link[0];
|
||||
if (state->uses_builtin_functions) {
|
||||
gl_shader *sh = _mesa_glsl_get_builtin_function_shader();
|
||||
print_function_prototypes(state, loc, sh->symbols->get_function(name));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -609,8 +609,7 @@ builtin_builder::find(_mesa_glsl_parse_state *state,
|
|||
* that the "no matching signature" error will list potential candidates
|
||||
* from the available built-ins.
|
||||
*/
|
||||
state->builtins_to_link[0] = shader;
|
||||
state->num_builtins_to_link = 1;
|
||||
state->uses_builtin_functions = true;
|
||||
|
||||
ir_function *f = shader->symbols->get_function(name);
|
||||
if (f == NULL)
|
||||
|
|
|
|||
|
|
@ -76,7 +76,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
|
|||
this->loop_nesting_ast = NULL;
|
||||
|
||||
this->struct_specifier_depth = 0;
|
||||
this->num_builtins_to_link = 0;
|
||||
|
||||
this->uses_builtin_functions = false;
|
||||
|
||||
/* Set default language version and extensions */
|
||||
this->language_version = ctx->Const.ForceGLSLVersion ?
|
||||
|
|
@ -1532,10 +1533,7 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
|
|||
shader->InfoLog = state->info_log;
|
||||
shader->Version = state->language_version;
|
||||
shader->IsES = state->es_shader;
|
||||
|
||||
memcpy(shader->builtins_to_link, state->builtins_to_link,
|
||||
sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link);
|
||||
shader->num_builtins_to_link = state->num_builtins_to_link;
|
||||
shader->uses_builtin_functions = state->uses_builtin_functions;
|
||||
|
||||
if (shader->UniformBlocks)
|
||||
ralloc_free(shader->UniformBlocks);
|
||||
|
|
|
|||
|
|
@ -361,9 +361,7 @@ struct _mesa_glsl_parse_state {
|
|||
/** Extensions supported by the OpenGL implementation. */
|
||||
const struct gl_extensions *extensions;
|
||||
|
||||
/** Shaders containing built-in functions that are used for linking. */
|
||||
struct gl_shader *builtins_to_link[16];
|
||||
unsigned num_builtins_to_link;
|
||||
bool uses_builtin_functions;
|
||||
|
||||
/**
|
||||
* For geometry shaders, size of the most recently seen input declaration
|
||||
|
|
|
|||
|
|
@ -1405,36 +1405,38 @@ link_intrastage_shaders(void *mem_ctx,
|
|||
insertion_point, true, linked);
|
||||
}
|
||||
|
||||
/* Resolve initializers for global variables in the linked shader.
|
||||
*/
|
||||
unsigned num_linking_shaders = num_shaders;
|
||||
for (unsigned i = 0; i < num_shaders; i++)
|
||||
num_linking_shaders += shader_list[i]->num_builtins_to_link;
|
||||
|
||||
gl_shader **linking_shaders =
|
||||
(gl_shader **) calloc(num_linking_shaders, sizeof(gl_shader *));
|
||||
|
||||
memcpy(linking_shaders, shader_list,
|
||||
sizeof(linking_shaders[0]) * num_shaders);
|
||||
|
||||
unsigned idx = num_shaders;
|
||||
/* Check if any shader needs built-in functions. */
|
||||
bool need_builtins = false;
|
||||
for (unsigned i = 0; i < num_shaders; i++) {
|
||||
memcpy(&linking_shaders[idx], shader_list[i]->builtins_to_link,
|
||||
sizeof(linking_shaders[0]) * shader_list[i]->num_builtins_to_link);
|
||||
idx += shader_list[i]->num_builtins_to_link;
|
||||
if (shader_list[i]->uses_builtin_functions) {
|
||||
need_builtins = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
assert(idx == num_linking_shaders);
|
||||
bool ok;
|
||||
if (need_builtins) {
|
||||
/* Make a temporary array one larger than shader_list, which will hold
|
||||
* the built-in function shader as well.
|
||||
*/
|
||||
gl_shader **linking_shaders = (gl_shader **)
|
||||
calloc(num_shaders + 1, sizeof(gl_shader *));
|
||||
memcpy(linking_shaders, shader_list, num_shaders * sizeof(gl_shader *));
|
||||
linking_shaders[num_shaders] = _mesa_glsl_get_builtin_function_shader();
|
||||
|
||||
ok = link_function_calls(prog, linked, linking_shaders, num_shaders + 1);
|
||||
|
||||
if (!link_function_calls(prog, linked, linking_shaders,
|
||||
num_linking_shaders)) {
|
||||
ctx->Driver.DeleteShader(ctx, linked);
|
||||
free(linking_shaders);
|
||||
} else {
|
||||
ok = link_function_calls(prog, linked, shader_list, num_shaders);
|
||||
}
|
||||
|
||||
|
||||
if (!ok) {
|
||||
ctx->Driver.DeleteShader(ctx, linked);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free(linking_shaders);
|
||||
|
||||
/* At this point linked should contain all of the linked IR, so
|
||||
* validate it to make sure nothing went wrong.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1344,7 +1344,7 @@ create_new_program(struct gl_context *ctx, struct state_key *key)
|
|||
|
||||
p.shader->CompileStatus = true;
|
||||
p.shader->Version = state->language_version;
|
||||
p.shader->num_builtins_to_link = state->num_builtins_to_link;
|
||||
p.shader->uses_builtin_functions = state->uses_builtin_functions;
|
||||
p.shader_program->Shaders =
|
||||
(gl_shader **)malloc(sizeof(*p.shader_program->Shaders));
|
||||
p.shader_program->Shaders[0] = p.shader;
|
||||
|
|
|
|||
|
|
@ -2352,9 +2352,7 @@ struct gl_shader
|
|||
struct exec_list *ir;
|
||||
struct glsl_symbol_table *symbols;
|
||||
|
||||
/** Shaders containing built-in functions that are used for linking. */
|
||||
struct gl_shader *builtins_to_link[16];
|
||||
unsigned num_builtins_to_link;
|
||||
bool uses_builtin_functions;
|
||||
|
||||
/**
|
||||
* Geometry shader state from GLSL 1.50 layout qualifiers.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue