[Mesa-dev] Mesa (master): st/mesa: inline if(1) conditional

Jose Fonseca jfonseca at vmware.com
Wed Jan 25 05:39:32 PST 2012


Marek,

I'm seeing the following assertion failure

   src/mesa/state_tracker/st_glsl_to_tgsi.cpp:4032:src_register: Assertion `t->inputMapping[index] < (sizeof(t->inputs)/sizeof(*(t->inputs)))' failed.

all over the place (conform, glean, piglit) since the commit below.  For example, doing

  /var/lib/hudson/tools/linux64/piglit/bin/pbo-drawpixels -auto

w/ llvmpipe.

Jose

----- Original Message -----
> Module: Mesa
> Branch: master
> Commit: 697b9945fb0f55428b06821f98fd8621372f81ad
> URL:
>    http://cgit.freedesktop.org/mesa/mesa/commit/?id=697b9945fb0f55428b06821f98fd8621372f81ad
> 
> Author: Marek Olšák <maraeo at gmail.com>
> Date:   Mon Jan 23 13:28:07 2012 +0100
> 
> st/mesa: inline if(1) conditional
> 
> v2: fix typo
> 
> ---
> 
>  src/mesa/state_tracker/st_program.c |  434
>  +++++++++++++++++------------------
>  1 files changed, 215 insertions(+), 219 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_program.c
> b/src/mesa/state_tracker/st_program.c
> index 978de88..cebe390 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -473,6 +473,23 @@ st_translate_fragment_program(struct st_context
> *st,
>     struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
>     GLboolean deleteFP = GL_FALSE;
>  
> +   GLuint outputMapping[FRAG_RESULT_MAX];
> +   GLuint inputMapping[FRAG_ATTRIB_MAX];
> +   GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
> +   GLuint attr;
> +   const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
> +   struct ureg_program *ureg;
> +
> +   GLboolean write_all = GL_FALSE;
> +
> +   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> +   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> +   uint fs_num_inputs = 0;
> +
> +   ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
> +   ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
> +   uint fs_num_outputs = 0;
> +
>     if (!variant)
>        return NULL;
>  
> @@ -508,243 +525,222 @@ st_translate_fragment_program(struct
> st_context *st,
>     }
>  #endif
>  
> -   /* XXX this will be cleaned up in the following commit */
> -   if (1) {
> -      /* need to translate Mesa instructions to TGSI now */
> -      GLuint outputMapping[FRAG_RESULT_MAX];
> -      GLuint inputMapping[FRAG_ATTRIB_MAX];
> -      GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
> -      GLuint attr;
> -      const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
> -      struct ureg_program *ureg;
> -
> -      GLboolean write_all = GL_FALSE;
> -
> -      ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> -      ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> -      uint fs_num_inputs = 0;
> -
> -      ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
> -      ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
> -      uint fs_num_outputs = 0;
> -
> -      if (!stfp->glsl_to_tgsi)
> -         _mesa_remove_output_reads(&stfp->Base.Base,
> PROGRAM_OUTPUT);
> +   if (!stfp->glsl_to_tgsi)
> +      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
>  
> -      /*
> -       * Convert Mesa program inputs to TGSI input register
> semantics.
> -       */
> -      for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
> -         if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
> -            const GLuint slot = fs_num_inputs++;
> +   /*
> +    * Convert Mesa program inputs to TGSI input register semantics.
> +    */
> +   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
> +      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
> +         const GLuint slot = fs_num_inputs++;
>  
> -            inputMapping[attr] = slot;
> +         inputMapping[attr] = slot;
>  
> -            switch (attr) {
> -            case FRAG_ATTRIB_WPOS:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
> -               input_semantic_index[slot] = 0;
> +         switch (attr) {
> +         case FRAG_ATTRIB_WPOS:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
> +            input_semantic_index[slot] = 0;
> +            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> +            break;
> +         case FRAG_ATTRIB_COL0:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> +            input_semantic_index[slot] = 0;
> +            interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> +                                                   TRUE);
> +            break;
> +         case FRAG_ATTRIB_COL1:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> +            input_semantic_index[slot] = 1;
> +            interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> +                                                   TRUE);
> +            break;
> +         case FRAG_ATTRIB_FOGC:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
> +            input_semantic_index[slot] = 0;
> +            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
> +            break;
> +         case FRAG_ATTRIB_FACE:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
> +            input_semantic_index[slot] = 0;
> +            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
> +            break;
> +         case FRAG_ATTRIB_CLIP_DIST0:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> +            input_semantic_index[slot] = 0;
> +            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> +            break;
> +         case FRAG_ATTRIB_CLIP_DIST1:
> +            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> +            input_semantic_index[slot] = 1;
> +            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> +            break;
> +            /* In most cases, there is nothing special about these
> +             * inputs, so adopt a convention to use the generic
> +             * semantic name and the mesa FRAG_ATTRIB_ number as the
> +             * index.
> +             *
> +             * All that is required is that the vertex shader labels
> +             * its own outputs similarly, and that the vertex shader
> +             * generates at least every output required by the
> +             * fragment shader plus fixed-function hardware (such as
> +             * BFC).
> +             *
> +             * There is no requirement that semantic indexes start
> at
> +             * zero or be restricted to a particular range -- nobody
> +             * should be building tables based on semantic index.
> +             */
> +         case FRAG_ATTRIB_PNTC:
> +         case FRAG_ATTRIB_TEX0:
> +         case FRAG_ATTRIB_TEX1:
> +         case FRAG_ATTRIB_TEX2:
> +         case FRAG_ATTRIB_TEX3:
> +         case FRAG_ATTRIB_TEX4:
> +         case FRAG_ATTRIB_TEX5:
> +         case FRAG_ATTRIB_TEX6:
> +         case FRAG_ATTRIB_TEX7:
> +         case FRAG_ATTRIB_VAR0:
> +         default:
> +            /* Actually, let's try and zero-base this just for
> +             * readability of the generated TGSI.
> +             */
> +            assert(attr >= FRAG_ATTRIB_TEX0);
> +            input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
> +            input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
> +            if (attr == FRAG_ATTRIB_PNTC)
>                 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> -               break;
> -            case FRAG_ATTRIB_COL0:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> -               input_semantic_index[slot] = 0;
> -               interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> -                                                      TRUE);
> -               break;
> -            case FRAG_ATTRIB_COL1:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> -               input_semantic_index[slot] = 1;
> +            else
>                 interpMode[slot] =
>                 st_translate_interp(stfp->Base.InterpQualifier[attr],
> -                                                      TRUE);
> -               break;
> -            case FRAG_ATTRIB_FOGC:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
> -               input_semantic_index[slot] = 0;
> -               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
> -               break;
> -            case FRAG_ATTRIB_FACE:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
> -               input_semantic_index[slot] = 0;
> -               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
> -               break;
> -            case FRAG_ATTRIB_CLIP_DIST0:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> -               input_semantic_index[slot] = 0;
> -               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> -               break;
> -            case FRAG_ATTRIB_CLIP_DIST1:
> -               input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> -               input_semantic_index[slot] = 1;
> -               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> -               break;
> -               /* In most cases, there is nothing special about
> these
> -                * inputs, so adopt a convention to use the generic
> -                * semantic name and the mesa FRAG_ATTRIB_ number as
> the
> -                * index.
> -                *
> -                * All that is required is that the vertex shader
> labels
> -                * its own outputs similarly, and that the vertex
> shader
> -                * generates at least every output required by the
> -                * fragment shader plus fixed-function hardware (such
> as
> -                * BFC).
> -                *
> -                * There is no requirement that semantic indexes
> start at
> -                * zero or be restricted to a particular range --
> nobody
> -                * should be building tables based on semantic index.
> -                */
> -            case FRAG_ATTRIB_PNTC:
> -            case FRAG_ATTRIB_TEX0:
> -            case FRAG_ATTRIB_TEX1:
> -            case FRAG_ATTRIB_TEX2:
> -            case FRAG_ATTRIB_TEX3:
> -            case FRAG_ATTRIB_TEX4:
> -            case FRAG_ATTRIB_TEX5:
> -            case FRAG_ATTRIB_TEX6:
> -            case FRAG_ATTRIB_TEX7:
> -            case FRAG_ATTRIB_VAR0:
> -            default:
> -               /* Actually, let's try and zero-base this just for
> -                * readability of the generated TGSI.
> -                */
> -               assert(attr >= FRAG_ATTRIB_TEX0);
> -               input_semantic_index[slot] = (attr -
> FRAG_ATTRIB_TEX0);
> -               input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
> -               if (attr == FRAG_ATTRIB_PNTC)
> -                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> -               else
> -                  interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> -                                                         FALSE);
> -               break;
> -            }
> -         }
> -         else {
> -            inputMapping[attr] = -1;
> +                                                      FALSE);
> +            break;
>           }
>        }
> -
> -      /*
> -       * Semantics and mapping for outputs
> -       */
> -      {
> -         uint numColors = 0;
> -         GLbitfield64 outputsWritten =
> stfp->Base.Base.OutputsWritten;
> -
> -         /* if z is written, emit that first */
> -         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
> -            fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_POSITION;
> -            fs_output_semantic_index[fs_num_outputs] = 0;
> -            outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
> -            fs_num_outputs++;
> -            outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
> -         }
> -
> -         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
> -            fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_STENCIL;
> -            fs_output_semantic_index[fs_num_outputs] = 0;
> -            outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
> -            fs_num_outputs++;
> -            outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
> -         }
> -
> -         /* handle remaning outputs (color) */
> -         for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
> -            if (outputsWritten & BITFIELD64_BIT(attr)) {
> -               switch (attr) {
> -               case FRAG_RESULT_DEPTH:
> -               case FRAG_RESULT_STENCIL:
> -                  /* handled above */
> -                  assert(0);
> -                  break;
> -               case FRAG_RESULT_COLOR:
> -                  write_all = GL_TRUE; /* fallthrough */
> -               default:
> -                  assert(attr == FRAG_RESULT_COLOR ||
> -                         (FRAG_RESULT_DATA0 <= attr && attr <
> FRAG_RESULT_MAX));
> -                  fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_COLOR;
> -                  fs_output_semantic_index[fs_num_outputs] =
> numColors;
> -                  outputMapping[attr] = fs_num_outputs;
> -                  numColors++;
> -                  break;
> -               }
> -
> -               fs_num_outputs++;
> -            }
> -         }
> +      else {
> +         inputMapping[attr] = -1;
>        }
> +   }
>  
> -      ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
> -      if (ureg == NULL) {
> -         FREE(variant);
> -         return NULL;
> +   /*
> +    * Semantics and mapping for outputs
> +    */
> +   {
> +      uint numColors = 0;
> +      GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
> +
> +      /* if z is written, emit that first */
> +      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
> +         fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_POSITION;
> +         fs_output_semantic_index[fs_num_outputs] = 0;
> +         outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
> +         fs_num_outputs++;
> +         outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
>        }
>  
> -      if (ST_DEBUG & DEBUG_MESA) {
> -         _mesa_print_program(&stfp->Base.Base);
> -         _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
> -         debug_printf("\n");
> +      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
> +         fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_STENCIL;
> +         fs_output_semantic_index[fs_num_outputs] = 0;
> +         outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
> +         fs_num_outputs++;
> +         outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
>        }
> -      if (write_all == GL_TRUE)
> -         ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
>  
> -      if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
> -         switch (stfp->Base.FragDepthLayout) {
> -         case FRAG_DEPTH_LAYOUT_ANY:
> -            ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_ANY);
> -            break;
> -         case FRAG_DEPTH_LAYOUT_GREATER:
> -            ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_GREATER);
> -            break;
> -         case FRAG_DEPTH_LAYOUT_LESS:
> -            ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_LESS);
> -            break;
> -         case FRAG_DEPTH_LAYOUT_UNCHANGED:
> -            ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
> -            break;
> -         default:
> -            assert(0);
> +      /* handle remaining outputs (color) */
> +      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
> +         if (outputsWritten & BITFIELD64_BIT(attr)) {
> +            switch (attr) {
> +            case FRAG_RESULT_DEPTH:
> +            case FRAG_RESULT_STENCIL:
> +               /* handled above */
> +               assert(0);
> +               break;
> +            case FRAG_RESULT_COLOR:
> +               write_all = GL_TRUE; /* fallthrough */
> +            default:
> +               assert(attr == FRAG_RESULT_COLOR ||
> +                      (FRAG_RESULT_DATA0 <= attr && attr <
> FRAG_RESULT_MAX));
> +               fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_COLOR;
> +               fs_output_semantic_index[fs_num_outputs] = numColors;
> +               outputMapping[attr] = fs_num_outputs;
> +               numColors++;
> +               break;
> +            }
> +
> +            fs_num_outputs++;
>           }
>        }
> +   }
>  
> -      if (stfp->glsl_to_tgsi)
> -         st_translate_program(st->ctx,
> -                              TGSI_PROCESSOR_FRAGMENT,
> -                              ureg,
> -                              stfp->glsl_to_tgsi,
> -                              &stfp->Base.Base,
> -                              /* inputs */
> -                              fs_num_inputs,
> -                              inputMapping,
> -                              input_semantic_name,
> -                              input_semantic_index,
> -                              interpMode,
> -                              /* outputs */
> -                              fs_num_outputs,
> -                              outputMapping,
> -                              fs_output_semantic_name,
> -                              fs_output_semantic_index, FALSE,
> -                              key->clamp_color );
> -      else
> -         st_translate_mesa_program(st->ctx,
> -                                   TGSI_PROCESSOR_FRAGMENT,
> -                                   ureg,
> -                                   &stfp->Base.Base,
> -                                   /* inputs */
> -                                   fs_num_inputs,
> -                                   inputMapping,
> -                                   input_semantic_name,
> -                                   input_semantic_index,
> -                                   interpMode,
> -                                   /* outputs */
> -                                   fs_num_outputs,
> -                                   outputMapping,
> -                                   fs_output_semantic_name,
> -                                   fs_output_semantic_index, FALSE,
> -                                   key->clamp_color);
> +   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
> +   if (ureg == NULL) {
> +      FREE(variant);
> +      return NULL;
> +   }
>  
> -      variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
> -      ureg_destroy( ureg );
> +   if (ST_DEBUG & DEBUG_MESA) {
> +      _mesa_print_program(&stfp->Base.Base);
> +      _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
> +      debug_printf("\n");
>     }
> +   if (write_all == GL_TRUE)
> +      ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
> +
> +   if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
> +      switch (stfp->Base.FragDepthLayout) {
> +      case FRAG_DEPTH_LAYOUT_ANY:
> +         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_ANY);
> +         break;
> +      case FRAG_DEPTH_LAYOUT_GREATER:
> +         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_GREATER);
> +         break;
> +      case FRAG_DEPTH_LAYOUT_LESS:
> +         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_LESS);
> +         break;
> +      case FRAG_DEPTH_LAYOUT_UNCHANGED:
> +         ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
> +         break;
> +      default:
> +         assert(0);
> +      }
> +   }
> +
> +   if (stfp->glsl_to_tgsi)
> +      st_translate_program(st->ctx,
> +                           TGSI_PROCESSOR_FRAGMENT,
> +                           ureg,
> +                           stfp->glsl_to_tgsi,
> +                           &stfp->Base.Base,
> +                           /* inputs */
> +                           fs_num_inputs,
> +                           inputMapping,
> +                           input_semantic_name,
> +                           input_semantic_index,
> +                           interpMode,
> +                           /* outputs */
> +                           fs_num_outputs,
> +                           outputMapping,
> +                           fs_output_semantic_name,
> +                           fs_output_semantic_index, FALSE,
> +                           key->clamp_color );
> +   else
> +      st_translate_mesa_program(st->ctx,
> +                                TGSI_PROCESSOR_FRAGMENT,
> +                                ureg,
> +                                &stfp->Base.Base,
> +                                /* inputs */
> +                                fs_num_inputs,
> +                                inputMapping,
> +                                input_semantic_name,
> +                                input_semantic_index,
> +                                interpMode,
> +                                /* outputs */
> +                                fs_num_outputs,
> +                                outputMapping,
> +                                fs_output_semantic_name,
> +                                fs_output_semantic_index, FALSE,
> +                                key->clamp_color);
> +
> +   variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
> +   ureg_destroy( ureg );
>  
>     /* fill in variant */
>     variant->driver_shader = pipe->create_fs_state(pipe,
>     &variant->tgsi);
> 
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
> 


More information about the mesa-dev mailing list