[Mesa-dev] [PATCH 2/2] glsl: replace strncmp("gl_") calls with new is_gl_identifier() helper

Ian Romanick idr at freedesktop.org
Wed May 28 10:21:53 PDT 2014


Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 05/23/2014 02:22 PM, Brian Paul wrote:
> Makes things a little easier to read.
> ---
>  src/glsl/ast_to_hir.cpp       |    8 ++++----
>  src/glsl/ir.h                 |    9 +++++++++
>  src/glsl/ir_print_visitor.cpp |    2 +-
>  src/glsl/link_uniforms.cpp    |    4 ++--
>  src/glsl/link_varyings.cpp    |    3 +--
>  5 files changed, 17 insertions(+), 9 deletions(-)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index e06f9b4..f230a70 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3078,7 +3078,7 @@ validate_identifier(const char *identifier, YYLTYPE loc,
>      *   OpenGL, and may not be declared in a shader as either a
>      *   variable or a function."
>      */
> -   if (strncmp(identifier, "gl_", 3) == 0) {
> +   if (is_gl_identifier(identifier)) {
>        _mesa_glsl_error(&loc, state,
>                         "identifier `%s' uses reserved `gl_' prefix",
>                         identifier);
> @@ -3653,7 +3653,7 @@ ast_declarator_list::hir(exec_list *instructions,
>        exec_list initializer_instructions;
>  
>        /* Examine var name here since var may get deleted in the next call */
> -      bool var_is_gl_id = (strncmp(var->name, "gl_", 3) == 0);
> +      bool var_is_gl_id = is_gl_identifier(var->name);
>  
>        ir_variable *earlier =
>           get_variable_being_redeclared(var, decl->get_location(), state,
> @@ -5403,7 +5403,7 @@ ast_interface_block::hir(exec_list *instructions,
>              ir_variable *earlier =
>                 get_variable_being_redeclared(var, loc, state,
>                                               true /* allow_all_redeclarations */);
> -            if (strncmp(var->name, "gl_", 3) != 0 || earlier == NULL) {
> +            if (!is_gl_identifier(var->name) || earlier == NULL) {
>                 _mesa_glsl_error(&loc, state,
>                                  "redeclaration of gl_PerVertex can only "
>                                  "include built-in variables");
> @@ -5638,7 +5638,7 @@ detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
>           gl_FragColor_assigned = true;
>        else if (strcmp(var->name, "gl_FragData") == 0)
>           gl_FragData_assigned = true;
> -      else if (strncmp(var->name, "gl_", 3) != 0) {
> +      else if (!is_gl_identifier(var->name)) {
>           if (state->stage == MESA_SHADER_FRAGMENT &&
>               var->data.mode == ir_var_shader_out) {
>              user_defined_fs_output_assigned = true;
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index ef4a12d..8060982 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -2342,6 +2342,15 @@ prototype_string(const glsl_type *return_type, const char *name,
>  const char *
>  mode_string(const ir_variable *var);
>  
> +/**
> + * Built-in / reserved GL variables names start with "gl_"
> + */
> +static inline bool
> +is_gl_identifier(const char *s)
> +{
> +   return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_';
> +}
> +
>  extern "C" {
>  #endif /* __cplusplus */
>  
> diff --git a/src/glsl/ir_print_visitor.cpp b/src/glsl/ir_print_visitor.cpp
> index 0a7695a..418f051 100644
> --- a/src/glsl/ir_print_visitor.cpp
> +++ b/src/glsl/ir_print_visitor.cpp
> @@ -146,7 +146,7 @@ print_type(FILE *f, const glsl_type *t)
>        print_type(f, t->fields.array);
>        fprintf(f, " %u)", t->length);
>     } else if ((t->base_type == GLSL_TYPE_STRUCT)
> -	      && (strncmp("gl_", t->name, 3) != 0)) {
> +              && !is_gl_identifier(t->name)) {
>        fprintf(f, "%s@%p", t->name, (void *) t);
>     } else {
>        fprintf(f, "%s", t->name);
> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
> index c7147e0..ba66053 100644
> --- a/src/glsl/link_uniforms.cpp
> +++ b/src/glsl/link_uniforms.cpp
> @@ -848,7 +848,7 @@ link_assign_uniform_locations(struct gl_shader_program *prog)
>  
>  	 /* FINISHME: Update code to process built-in uniforms!
>  	  */
> -	 if (strncmp("gl_", var->name, 3) == 0) {
> +	 if (is_gl_identifier(var->name)) {
>  	    uniform_size.num_shader_uniform_components +=
>  	       var->type->component_slots();
>  	    continue;
> @@ -900,7 +900,7 @@ link_assign_uniform_locations(struct gl_shader_program *prog)
>  
>  	 /* FINISHME: Update code to process built-in uniforms!
>  	  */
> -	 if (strncmp("gl_", var->name, 3) == 0)
> +	 if (is_gl_identifier(var->name))
>  	    continue;
>  
>  	 parcel.set_and_process(prog, var);
> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> index 71998df..6863298 100644
> --- a/src/glsl/link_varyings.cpp
> +++ b/src/glsl/link_varyings.cpp
> @@ -77,8 +77,7 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
>         *     correspondence between the vertex language and the
>         *     fragment language."
>         */
> -      if (!output->type->is_array()
> -          || (strncmp("gl_", output->name, 3) != 0)) {
> +      if (!output->type->is_array() || !is_gl_identifier(output->name)) {
>           linker_error(prog,
>                        "%s shader output `%s' declared as type `%s', "
>                        "but %s shader input declared as type `%s'\n",
> 



More information about the mesa-dev mailing list