[Mesa-dev] [PATCH] glsl: Defer initialization of built-in functions until they're needed.

Kenneth Graunke kenneth at whitecape.org
Thu Sep 22 12:41:21 PDT 2011


Very simple shaders don't actually use GLSL built-ins.  For example:
- gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
- gl_FragColor = vec4(0.0);
Both of the shaders used by _mesa_meta_glsl_Clear() also qualify.

By waiting to initialize the built-ins until the first time we need to
look for a signature, we can avoid the overhead entirely in these cases.

Makes piglit run roughly 18% faster (255 vs. 312 seconds).

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/glsl/ast_function.cpp                    |    1 +
 src/glsl/ast_to_hir.cpp                      |    1 -
 src/glsl/builtins/tools/generate_builtins.py |    6 ++++--
 src/glsl/glsl_parser_extras.cpp              |    2 ++
 4 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
index ca45934..fc0d749 100644
--- a/src/glsl/ast_function.cpp
+++ b/src/glsl/ast_function.cpp
@@ -117,6 +117,7 @@ match_function_by_name(exec_list *instructions, const char *name,
       /* The current shader doesn't contain a matching function or signature.
        * Before giving up, look for the prototype in the built-in functions.
        */
+      _mesa_glsl_initialize_functions(state);
       for (unsigned i = 0; i < state->num_builtins_to_link; i++) {
 	 ir_function *builtin;
 	 builtin = state->builtins_to_link[i]->symbols->get_function(name);
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index ce29d5a..91a2231 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -60,7 +60,6 @@ void
 _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
 {
    _mesa_glsl_initialize_variables(instructions, state);
-   _mesa_glsl_initialize_functions(state);
 
    state->symbols->language_version = state->language_version;
 
diff --git a/src/glsl/builtins/tools/generate_builtins.py b/src/glsl/builtins/tools/generate_builtins.py
index 17d528c..8ce2b70 100755
--- a/src/glsl/builtins/tools/generate_builtins.py
+++ b/src/glsl/builtins/tools/generate_builtins.py
@@ -228,12 +228,14 @@ _mesa_read_profile(struct _mesa_glsl_parse_state *state,
 void
 _mesa_glsl_initialize_functions(struct _mesa_glsl_parse_state *state)
 {
+   /* If we've already initialized the built-ins, bail early. */
+   if (state->num_builtins_to_link > 0)
+      return;
+
    if (builtin_mem_ctx == NULL) {
       builtin_mem_ctx = ralloc_context(NULL); // "GLSL built-in functions"
       memset(&builtin_profiles, 0, sizeof(builtin_profiles));
    }
-
-   state->num_builtins_to_link = 0;
 """
 
     i = 0
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index 8faddc5..a9075b2 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -52,6 +52,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *ctx,
    this->error = false;
    this->loop_or_switch_nesting = NULL;
 
+   this->num_builtins_to_link = 0;
+
    /* Set default language version and extensions */
    this->language_version = 110;
    this->es_shader = false;
-- 
1.7.6.1



More information about the mesa-dev mailing list