[Mesa-dev] [PATCH 4/8] glcpp: Use string_buffer for line continuation removal

Nicolai Hähnle nhaehnle at gmail.com
Wed Sep 6 08:53:52 UTC 2017


On 29.08.2017 21:56, Thomas Helland wrote:
> 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)

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> ---
>   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 40e0f033d2..c3827e439f 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
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list