glsl: Delete linker stuff relating to built-in functions.
Now that we generate built-in functions inline, there's no need to link against the built-in shader, and no built-in prototypes to consider. This lets us delete a bunch of code. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by; Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -32,7 +32,7 @@
|
||||
|
||||
static ir_function_signature *
|
||||
find_matching_signature(const char *name, const exec_list *actual_parameters,
|
||||
glsl_symbol_table *symbols, bool use_builtin);
|
||||
glsl_symbol_table *symbols);
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -74,12 +74,15 @@ public:
|
||||
assert(callee != NULL);
|
||||
const char *const name = callee->function_name();
|
||||
|
||||
/* We don't actually need to find intrinsics; they're not real */
|
||||
if (callee->is_intrinsic)
|
||||
return visit_continue;
|
||||
|
||||
/* Determine if the requested function signature already exists in the
|
||||
* final linked shader. If it does, use it as the target of the call.
|
||||
*/
|
||||
ir_function_signature *sig =
|
||||
find_matching_signature(name, &callee->parameters, linked->symbols,
|
||||
ir->use_builtin);
|
||||
find_matching_signature(name, &callee->parameters, linked->symbols);
|
||||
if (sig != NULL) {
|
||||
ir->callee = sig;
|
||||
return visit_continue;
|
||||
@@ -90,8 +93,7 @@ public:
|
||||
*/
|
||||
for (unsigned i = 0; i < num_shaders; i++) {
|
||||
sig = find_matching_signature(name, &ir->actual_parameters,
|
||||
shader_list[i]->symbols,
|
||||
ir->use_builtin);
|
||||
shader_list[i]->symbols);
|
||||
if (sig)
|
||||
break;
|
||||
}
|
||||
@@ -122,9 +124,7 @@ public:
|
||||
|
||||
ir_function_signature *linked_sig =
|
||||
f->exact_matching_signature(NULL, &callee->parameters);
|
||||
if ((linked_sig == NULL)
|
||||
|| ((linked_sig != NULL)
|
||||
&& (linked_sig->is_builtin() != ir->use_builtin))) {
|
||||
if (linked_sig == NULL) {
|
||||
linked_sig = new(linked) ir_function_signature(callee->return_type);
|
||||
f->add_signature(linked_sig);
|
||||
}
|
||||
@@ -314,22 +314,16 @@ private:
|
||||
*/
|
||||
ir_function_signature *
|
||||
find_matching_signature(const char *name, const exec_list *actual_parameters,
|
||||
glsl_symbol_table *symbols, bool use_builtin)
|
||||
glsl_symbol_table *symbols)
|
||||
{
|
||||
ir_function *const f = symbols->get_function(name);
|
||||
|
||||
if (f) {
|
||||
ir_function_signature *sig =
|
||||
f->matching_signature(NULL, actual_parameters, use_builtin);
|
||||
f->matching_signature(NULL, actual_parameters, false);
|
||||
|
||||
if (sig && (sig->is_defined || sig->is_intrinsic)) {
|
||||
/* If this function expects to bind to a built-in function and the
|
||||
* signature that we found isn't a built-in, keep looking. Also keep
|
||||
* looking if we expect a non-built-in but found a built-in.
|
||||
*/
|
||||
if (use_builtin == sig->is_builtin())
|
||||
return sig;
|
||||
}
|
||||
if (sig && (sig->is_defined || sig->is_intrinsic))
|
||||
return sig;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
@@ -2098,14 +2098,13 @@ link_intrastage_shaders(void *mem_ctx,
|
||||
continue;
|
||||
|
||||
foreach_in_list(ir_function_signature, sig, &f->signatures) {
|
||||
if (!sig->is_defined || sig->is_builtin())
|
||||
if (!sig->is_defined)
|
||||
continue;
|
||||
|
||||
ir_function_signature *other_sig =
|
||||
other->exact_matching_signature(NULL, &sig->parameters);
|
||||
|
||||
if ((other_sig != NULL) && other_sig->is_defined
|
||||
&& !other_sig->is_builtin()) {
|
||||
if (other_sig != NULL && other_sig->is_defined) {
|
||||
linker_error(prog, "function `%s' is multiply defined\n",
|
||||
f->name);
|
||||
return NULL;
|
||||
@@ -2171,42 +2170,7 @@ link_intrastage_shaders(void *mem_ctx,
|
||||
insertion_point, true, linked);
|
||||
}
|
||||
|
||||
/* Check if any shader needs built-in functions. */
|
||||
bool need_builtins = false;
|
||||
for (unsigned i = 0; i < num_shaders; i++) {
|
||||
if (shader_list[i]->info.uses_builtin_functions) {
|
||||
need_builtins = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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 *));
|
||||
|
||||
ok = linking_shaders != NULL;
|
||||
|
||||
if (ok) {
|
||||
memcpy(linking_shaders, shader_list, num_shaders * sizeof(gl_shader *));
|
||||
_mesa_glsl_initialize_builtin_functions();
|
||||
linking_shaders[num_shaders] = _mesa_glsl_get_builtin_function_shader();
|
||||
|
||||
ok = link_function_calls(prog, linked, linking_shaders, num_shaders + 1);
|
||||
|
||||
free(linking_shaders);
|
||||
} else {
|
||||
_mesa_error_no_memory(__func__);
|
||||
}
|
||||
} else {
|
||||
ok = link_function_calls(prog, linked, shader_list, num_shaders);
|
||||
}
|
||||
|
||||
|
||||
if (!ok) {
|
||||
if (!link_function_calls(prog, linked, shader_list, num_shaders)) {
|
||||
_mesa_delete_linked_shader(ctx, linked);
|
||||
return NULL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user