[Mesa-dev] [PATCH 5/9] glcpp: Use string_buffer for line continuation removal

Thomas Helland thomashelland90 at gmail.com
Sun May 21 20:49:16 UTC 2017


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 <vegorov180 at gmail.com>

V2: Adapt to different API of string buffer (Thomas Helland)
---
 src/compiler/glsl/glcpp/pp.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/compiler/glsl/glcpp/pp.c b/src/compiler/glsl/glcpp/pp.c
index 86a1ed13ce..cd86e369b1 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;
 
 	search_start = shader;
 
@@ -147,6 +155,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) {
 		backslash = strchr(search_start, '\\');
@@ -168,10 +177,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);
@@ -192,15 +203,15 @@ 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;
 		}
 	}
 
-	ralloc_strcat(&clean, shader);
+	_mesa_string_buffer_append(sb, shader);
 
-	return clean;
+	return sb->buf;
 }
 
 int
-- 
2.13.0



More information about the mesa-dev mailing list