glsl/standalone: Enable par-linking
If the user did not request full linking, link the shader with the built-in functions, inline them, and eliminate them. Previous to this you'd see all these calls to "dot" and "max" in the output. This prevented a lot of expected optimizations and cluttered the output. This gives it some chance of being useful. v2: Rebase on top of Ken's "built-ins now" work. v3: Don't do_common_optimizations if par-linking fails. Update expected output of warnings tests to prevent 'make check' regressions. v4: Optimize harder. Most important, do function inlining. Otherwise it's quite impractical for one function in a file to call another function in the same file. v5: Add some code simplifications and an assertion suggested by Iago. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
parent
4dc759c8c2
commit
d0028b2e1c
|
@ -38,6 +38,8 @@
|
||||||
#include "standalone.h"
|
#include "standalone.h"
|
||||||
#include "util/string_to_uint_map.h"
|
#include "util/string_to_uint_map.h"
|
||||||
#include "util/set.h"
|
#include "util/set.h"
|
||||||
|
#include "linker.h"
|
||||||
|
#include "glsl_parser_extras.h"
|
||||||
#include "opt_add_neg_to_sub.h"
|
#include "opt_add_neg_to_sub.h"
|
||||||
|
|
||||||
class dead_variable_visitor : public ir_hierarchical_visitor {
|
class dead_variable_visitor : public ir_hierarchical_visitor {
|
||||||
|
@ -478,10 +480,49 @@ standalone_compile_shader(const struct standalone_options *_options,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((status == EXIT_SUCCESS) && options->do_link) {
|
if (status == EXIT_SUCCESS) {
|
||||||
_mesa_clear_shader_program_data(ctx, whole_program);
|
_mesa_clear_shader_program_data(ctx, whole_program);
|
||||||
|
|
||||||
link_shaders(ctx, whole_program);
|
if (options->do_link) {
|
||||||
|
link_shaders(ctx, whole_program);
|
||||||
|
} else {
|
||||||
|
const gl_shader_stage stage = whole_program->Shaders[0]->Stage;
|
||||||
|
|
||||||
|
whole_program->LinkStatus = GL_TRUE;
|
||||||
|
whole_program->_LinkedShaders[stage] =
|
||||||
|
link_intrastage_shaders(whole_program /* mem_ctx */,
|
||||||
|
ctx,
|
||||||
|
whole_program,
|
||||||
|
whole_program->Shaders,
|
||||||
|
1,
|
||||||
|
true);
|
||||||
|
|
||||||
|
/* Par-linking can fail, for example, if there are undefined external
|
||||||
|
* references.
|
||||||
|
*/
|
||||||
|
if (whole_program->_LinkedShaders[stage] != NULL) {
|
||||||
|
assert(whole_program->LinkStatus);
|
||||||
|
|
||||||
|
struct gl_shader_compiler_options *const compiler_options =
|
||||||
|
&ctx->Const.ShaderCompilerOptions[stage];
|
||||||
|
|
||||||
|
exec_list *const ir =
|
||||||
|
whole_program->_LinkedShaders[stage]->ir;
|
||||||
|
|
||||||
|
bool progress;
|
||||||
|
do {
|
||||||
|
progress = do_function_inlining(ir);
|
||||||
|
|
||||||
|
progress = do_common_optimization(ir,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
compiler_options,
|
||||||
|
true)
|
||||||
|
&& progress;
|
||||||
|
} while(progress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE;
|
status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
|
|
||||||
if (strlen(whole_program->InfoLog) > 0) {
|
if (strlen(whole_program->InfoLog) > 0) {
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
error: unresolved reference to function `fooFunction'
|
|
@ -1 +1,3 @@
|
||||||
0:11(14): warning: `willBeDefined' used uninitialized
|
0:11(14): warning: `willBeDefined' used uninitialized
|
||||||
|
|
||||||
|
error: unresolved reference to function `fooFunction'
|
||||||
|
|
|
@ -5,3 +5,5 @@
|
||||||
0:14(20): warning: `undefinedIndex' used uninitialized
|
0:14(20): warning: `undefinedIndex' used uninitialized
|
||||||
0:14(51): warning: `undefinedIndex' used uninitialized
|
0:14(51): warning: `undefinedIndex' used uninitialized
|
||||||
0:14(82): warning: `undefinedIndex' used uninitialized
|
0:14(82): warning: `undefinedIndex' used uninitialized
|
||||||
|
|
||||||
|
error: unresolved reference to function `foo'
|
||||||
|
|
Loading…
Reference in New Issue