diff options
author | Thomas Helland <[email protected]> | 2017-05-20 22:50:09 +0200 |
---|---|---|
committer | Thomas Helland <[email protected]> | 2017-09-26 18:25:20 +0200 |
commit | e7220d2c22b55b8305e5338b80483a6659fb15c8 (patch) | |
tree | 69bf061b320696c904b45bd6c60e5e483f069e55 | |
parent | cad323f898fef3c8c1d07152919c3d3c88a26955 (diff) |
glcpp: Use string_buffer for line continuation removal
Migrate removal of line continuations to string_buffer. Before this
it used ralloc_strncat() to append strings, which internally
each time calculates strlen() of its argument. Its argument is
entire shader, so it multiple time scans the whole shader text.
Signed-off-by: Vladislav Egorov <[email protected]>
Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
V2: Adapt to different API of string buffer (Thomas Helland)
-rw-r--r-- | src/compiler/glsl/glcpp/pp.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/compiler/glsl/glcpp/pp.c b/src/compiler/glsl/glcpp/pp.c index 861f6e8669a..fab52227a02 100644 --- a/src/compiler/glsl/glcpp/pp.c +++ b/src/compiler/glsl/glcpp/pp.c @@ -97,17 +97,25 @@ skip_newline (const char *str) return ret; } +/* Initial output buffer size, 4096 minus ralloc() overhead. It was selected + * to minimize total amount of allocated memory during shader-db run. + */ +#define INITIAL_PP_OUTPUT_BUF_SIZE 4048 + /* Remove any line continuation characters in the shader, (whether in * preprocessing directives or in GLSL code). */ static char * remove_line_continuations(glcpp_parser_t *ctx, const char *shader) { - char *clean = ralloc_strdup(ctx, ""); + struct _mesa_string_buffer *sb = + _mesa_string_buffer_create(ctx, INITIAL_PP_OUTPUT_BUF_SIZE); + const char *backslash, *newline, *search_start; const char *cr, *lf; char newline_separator[3]; int collapsed_newlines = 0; + int separator_len; backslash = strchr(shader, '\\'); @@ -153,6 +161,7 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader) newline_separator[0] = '\n'; newline_separator[1] = '\r'; } + separator_len = strlen(newline_separator); while (true) { /* If we have previously collapsed any line-continuations, @@ -172,10 +181,12 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader) if (newline && (backslash == NULL || newline < backslash)) { - ralloc_strncat(&clean, shader, - newline - shader + 1); + _mesa_string_buffer_append_len(sb, shader, + newline - shader + 1); while (collapsed_newlines) { - ralloc_strcat(&clean, newline_separator); + _mesa_string_buffer_append_len(sb, + newline_separator, + separator_len); collapsed_newlines--; } shader = skip_newline (newline); @@ -196,7 +207,7 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader) if (backslash[1] == '\r' || backslash[1] == '\n') { collapsed_newlines++; - ralloc_strncat(&clean, shader, backslash - shader); + _mesa_string_buffer_append_len(sb, shader, backslash - shader); shader = skip_newline (backslash + 1); search_start = shader; } @@ -204,9 +215,9 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader) backslash = strchr(search_start, '\\'); } - ralloc_strcat(&clean, shader); + _mesa_string_buffer_append(sb, shader); - return clean; + return sb->buf; } int |