[Mesa-dev] [PATCH 3/3] glsl: don't run the GLSL pre-processor when we are skipping compilation
Timothy Arceri
tarceri at itsqueeze.com
Wed Apr 5 03:56:19 UTC 2017
Improves Deus Ex start-up times with a warm cache from ~30 seconds to
~22 seconds.
Also fixes the leaking of state.
V2: fix indentation
Tested-by: Grazvydas Ignotas <notasas at gmail.com>
---
src/compiler/glsl/glsl_parser_extras.cpp | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
index ec7860d0..01037d4 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -1997,32 +1997,23 @@ opt_shader_and_create_symbol_table(struct gl_context *ctx,
}
}
_mesa_glsl_initialize_derived_variables(ctx, shader);
}
void
_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
bool dump_ast, bool dump_hir, bool force_recompile)
{
- struct _mesa_glsl_parse_state *state =
- new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
const char *source = force_recompile && shader->FallbackSource ?
shader->FallbackSource : shader->Source;
- if (ctx->Const.GenerateTemporaryNames)
- (void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names,
- false, true);
-
- state->error = glcpp_preprocess(state, &source, &state->info_log,
- add_builtin_defines, state, ctx);
-
if (!force_recompile) {
if (ctx->Cache) {
char buf[41];
disk_cache_compute_key(ctx->Cache, source, strlen(source),
shader->sha1);
if (disk_cache_has_key(ctx->Cache, shader->sha1)) {
/* We've seen this shader before and know it compiles */
if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
_mesa_sha1_format(buf, shader->sha1);
fprintf(stderr, "deferring compile of shader: %s\n", buf);
@@ -2042,20 +2033,30 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
if (shader->CompileStatus == compile_success)
return;
if (shader->CompileStatus == compiled_no_opts) {
opt_shader_and_create_symbol_table(ctx, shader);
shader->CompileStatus = compile_success;
return;
}
}
+ struct _mesa_glsl_parse_state *state =
+ new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
+
+ if (ctx->Const.GenerateTemporaryNames)
+ (void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names,
+ false, true);
+
+ state->error = glcpp_preprocess(state, &source, &state->info_log,
+ add_builtin_defines, state, ctx);
+
if (!state->error) {
_mesa_glsl_lexer_ctor(state, source);
_mesa_glsl_parse(state);
_mesa_glsl_lexer_dtor(state);
do_late_parsing_checks(state);
}
if (dump_ast) {
foreach_list_typed(ast_node, ast, link, &state->translation_unit) {
ast->print();
--
2.9.3
More information about the mesa-dev
mailing list