glcpp: Skip unnecessary line continuations removal
authorVladislav Egorov <vegorov180@gmail.com>
Sun, 21 May 2017 20:49:17 +0000 (22:49 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Mon, 22 May 2017 02:34:28 +0000 (12:34 +1000)
Overwhelming majority of shaders don't use line continuations. In my
shader-db only shaders from the Talos Principle and Serious Sam used
them, less than 1% out of all shaders. Optimize for this case, don't
do any copying if no line continuation was found.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/glcpp/pp.c

index c526f37719c308020c737831a1dc8f74716ac35a..96125f2e2f10e309e0a085794f1759506c7e0e29 100644 (file)
@@ -117,6 +117,12 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
         char newline_separator[3];
        int collapsed_newlines = 0;
 
+       backslash = strchr(shader, '\\');
+
+       /* No line continuations were found in this shader, our job is done */
+       if (backslash == NULL)
+               return (char *) shader;
+
        search_start = shader;
 
        /* Determine what flavor of newlines this shader is using. GLSL
@@ -157,8 +163,6 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
        }
 
        while (true) {
-               backslash = strchr(search_start, '\\');
-
                /* If we have previously collapsed any line-continuations,
                 * then we want to insert additional newlines at the next
                 * occurrence of a newline character to avoid changing any
@@ -204,6 +208,8 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
                        shader = skip_newline (backslash + 1);
                        search_start = shader;
                }
+
+               backslash = strchr(search_start, '\\');
        }
 
        ralloc_strcat(&clean, shader);