[Mesa-dev] [PATCH] draw: handle more TGSI_SEMANTIC_COLOR indices

Brian Paul brianp at vmware.com
Fri Jul 7 23:16:07 UTC 2017


Reviewed-by: Brian Paul <brianp at vmware.com>


On 07/07/2017 04:15 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> It could only handle indices 0/1, otherwise what happened was bad (accessing
> array out of bounds, no crash but kind of random). This is enough for the gl
> state tracker (primary/secondary color) but not enough for some other state
> trackers (d3d9 has no limits on the number of color interpolants).
> The complexity with color semantics are all due to the front/back mapping (2
> outputs in the vs map to one input in the fs) so this isn't extended to
> indices > 1 - d3d9 has no use for back colors, therefore this isn't needed and
> still only 2 back colors can be handled correctly.
> ---
>   src/gallium/auxiliary/draw/draw_pipe_clip.c      | 17 ++++++++++++++---
>   src/gallium/auxiliary/draw/draw_pipe_flatshade.c | 11 +++++++----
>   src/gallium/auxiliary/draw/draw_pipe_twoside.c   |  9 ++++++---
>   3 files changed, 27 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
> index cf2b417..4cfa54b 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
> @@ -771,8 +771,9 @@ find_interp(const struct draw_fragment_shader *fs, int *indexed_interp,
>      int interp;
>      /* If it's gl_{Front,Back}{,Secondary}Color, pick up the mode
>       * from the array we've filled before. */
> -   if (semantic_name == TGSI_SEMANTIC_COLOR ||
> -       semantic_name == TGSI_SEMANTIC_BCOLOR) {
> +   if ((semantic_name == TGSI_SEMANTIC_COLOR ||
> +        semantic_name == TGSI_SEMANTIC_BCOLOR) &&
> +       semantic_index < 2) {
>         interp = indexed_interp[semantic_index];
>      } else if (semantic_name == TGSI_SEMANTIC_POSITION ||
>                 semantic_name == TGSI_SEMANTIC_CLIPVERTEX) {
> @@ -851,7 +852,8 @@ clip_init_state(struct draw_stage *stage)
>
>      if (fs) {
>         for (i = 0; i < fs->info.num_inputs; i++) {
> -         if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR) {
> +         if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR &&
> +             fs->info.input_semantic_index[i] < 2) {
>               if (fs->info.input_interpolate[i] != TGSI_INTERPOLATE_COLOR)
>                  indexed_interp[fs->info.input_semantic_index[i]] = fs->info.input_interpolate[i];
>            }
> @@ -881,6 +883,15 @@ clip_init_state(struct draw_stage *stage)
>            clipper->perspect_attribs[clipper->num_perspect_attribs] = i;
>            clipper->num_perspect_attribs++;
>            break;
> +      case TGSI_INTERPOLATE_COLOR:
> +         if (draw->rasterizer->flatshade) {
> +            clipper->const_attribs[clipper->num_const_attribs] = i;
> +            clipper->num_const_attribs++;
> +         } else {
> +            clipper->perspect_attribs[clipper->num_perspect_attribs] = i;
> +            clipper->num_perspect_attribs++;
> +         }
> +         break;
>         default:
>            assert(interp == -1);
>            break;
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_flatshade.c b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c
> index cd285e6..2830435 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_flatshade.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c
> @@ -170,8 +170,9 @@ find_interp(const struct draw_fragment_shader *fs, int *indexed_interp,
>      int interp;
>      /* If it's gl_{Front,Back}{,Secondary}Color, pick up the mode
>       * from the array we've filled before. */
> -   if (semantic_name == TGSI_SEMANTIC_COLOR ||
> -       semantic_name == TGSI_SEMANTIC_BCOLOR) {
> +   if ((semantic_name == TGSI_SEMANTIC_COLOR ||
> +        semantic_name == TGSI_SEMANTIC_BCOLOR) &&
> +       semantic_index < 2) {
>         interp = indexed_interp[semantic_index];
>      } else {
>         /* Otherwise, search in the FS inputs, with a decent default
> @@ -216,7 +217,8 @@ static void flatshade_init_state( struct draw_stage *stage )
>
>      if (fs) {
>         for (i = 0; i < fs->info.num_inputs; i++) {
> -         if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR) {
> +         if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR &&
> +             fs->info.input_semantic_index[i] < 2) {
>               if (fs->info.input_interpolate[i] != TGSI_INTERPOLATE_COLOR)
>                  indexed_interp[fs->info.input_semantic_index[i]] = fs->info.input_interpolate[i];
>            }
> @@ -236,7 +238,8 @@ static void flatshade_init_state( struct draw_stage *stage )
>                                  info->output_semantic_index[i]);
>         /* If it's flat, add it to the flat vector. */
>
> -      if (interp == TGSI_INTERPOLATE_CONSTANT) {
> +      if (interp == TGSI_INTERPOLATE_CONSTANT ||
> +          (interp == TGSI_INTERPOLATE_COLOR && draw->rasterizer->flatshade)) {
>            flat->flat_attribs[flat->num_flat_attribs] = i;
>            flat->num_flat_attribs++;
>         }
> diff --git a/src/gallium/auxiliary/draw/draw_pipe_twoside.c b/src/gallium/auxiliary/draw/draw_pipe_twoside.c
> index 52d87c6..7e76835 100644
> --- a/src/gallium/auxiliary/draw/draw_pipe_twoside.c
> +++ b/src/gallium/auxiliary/draw/draw_pipe_twoside.c
> @@ -111,18 +111,21 @@ static void twoside_first_tri( struct draw_stage *stage,
>      twoside->attrib_back0 = -1;
>      twoside->attrib_back1 = -1;
>
> -   /* Find which vertex shader outputs are front/back colors */
> +   /*
> +    * Find which vertex shader outputs are front/back colors
> +    * (only first two can be front or back).
> +    */
>      for (i = 0; i < vs->info.num_outputs; i++) {
>         if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_COLOR) {
>            if (vs->info.output_semantic_index[i] == 0)
>               twoside->attrib_front0 = i;
> -         else
> +         else if (vs->info.output_semantic_index[i] == 1)
>               twoside->attrib_front1 = i;
>         }
>         if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_BCOLOR) {
>            if (vs->info.output_semantic_index[i] == 0)
>               twoside->attrib_back0 = i;
> -         else
> +         else if (vs->info.output_semantic_index[i] == 1)
>               twoside->attrib_back1 = i;
>         }
>      }
>



More information about the mesa-dev mailing list