[Mesa-dev] [PATCH 1/2] softpipe: handle NULL color buffer pointers

Roland Scheidegger sroland at vmware.com
Wed Jan 15 19:18:56 PST 2014


Am 16.01.2014 03:15, schrieb Brian Paul:
> Fixes regression from 9baa45f78b8ca7d66280e36009b6a685055d7cd6
> ---
>  src/gallium/drivers/softpipe/sp_quad_blend.c |  189 +++++++++++++-------------
>  1 file changed, 96 insertions(+), 93 deletions(-)
> 
> diff --git a/src/gallium/drivers/softpipe/sp_quad_blend.c b/src/gallium/drivers/softpipe/sp_quad_blend.c
> index d122586..00a9be6 100644
> --- a/src/gallium/drivers/softpipe/sp_quad_blend.c
> +++ b/src/gallium/drivers/softpipe/sp_quad_blend.c
> @@ -927,93 +927,94 @@ blend_fallback(struct quad_stage *qs,
>  
>     write_all = softpipe->fs_variant->info.color0_writes_all_cbufs;
>  
> -   for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) 
> -   {
> -      /* which blend/mask state index to use: */
> -      const uint blend_buf = blend->independent_blend_enable ? cbuf : 0;
> -      float dest[4][TGSI_QUAD_SIZE];
> -      struct softpipe_cached_tile *tile
> -         = sp_get_cached_tile(softpipe->cbuf_cache[cbuf],
> -                              quads[0]->input.x0, 
> -                              quads[0]->input.y0);
> -      const boolean clamp = bqs->clamp[cbuf];
> -      const float *blend_color;
> -      const boolean dual_source_blend = util_blend_state_is_dual(blend, cbuf);
> -      uint q, i, j;
> -
> -      if (clamp)
> -         blend_color = softpipe->blend_color_clamped.color;
> -      else
> -         blend_color = softpipe->blend_color.color;
> -
> -      for (q = 0; q < nr; q++) {
> -         struct quad_header *quad = quads[q];
> -         float (*quadColor)[4];
> -         float (*quadColor2)[4] = NULL;
> -         float temp_quad_color[TGSI_QUAD_SIZE][4];
> -         const int itx = (quad->input.x0 & (TILE_SIZE-1));
> -         const int ity = (quad->input.y0 & (TILE_SIZE-1));
> -
> -         if (write_all) {
> -            for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> -               for (i = 0; i < 4; i++) {
> -                  temp_quad_color[i][j] = quad->output.color[0][i][j];
> +   for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) {
> +      if (softpipe->framebuffer.cbufs[cbuf]) {
> +         /* which blend/mask state index to use: */
> +         const uint blend_buf = blend->independent_blend_enable ? cbuf : 0;
> +         float dest[4][TGSI_QUAD_SIZE];
> +         struct softpipe_cached_tile *tile
> +            = sp_get_cached_tile(softpipe->cbuf_cache[cbuf],
> +                                 quads[0]->input.x0, 
> +                                 quads[0]->input.y0);
> +         const boolean clamp = bqs->clamp[cbuf];
> +         const float *blend_color;
> +         const boolean dual_source_blend = util_blend_state_is_dual(blend, cbuf);
> +         uint q, i, j;
> +
> +         if (clamp)
> +            blend_color = softpipe->blend_color_clamped.color;
> +         else
> +            blend_color = softpipe->blend_color.color;
> +
> +         for (q = 0; q < nr; q++) {
> +            struct quad_header *quad = quads[q];
> +            float (*quadColor)[4];
> +            float (*quadColor2)[4] = NULL;
> +            float temp_quad_color[TGSI_QUAD_SIZE][4];
> +            const int itx = (quad->input.x0 & (TILE_SIZE-1));
> +            const int ity = (quad->input.y0 & (TILE_SIZE-1));
> +
> +            if (write_all) {
> +               for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> +                  for (i = 0; i < 4; i++) {
> +                     temp_quad_color[i][j] = quad->output.color[0][i][j];
> +                  }
>                 }
> +               quadColor = temp_quad_color;
> +            } else {
> +               quadColor = quad->output.color[cbuf];
> +               if (dual_source_blend)
> +                  quadColor2 = quad->output.color[cbuf + 1];
>              }
> -            quadColor = temp_quad_color;
> -         } else {
> -            quadColor = quad->output.color[cbuf];
> -	    if (dual_source_blend)
> -	       quadColor2 = quad->output.color[cbuf + 1];
> -         }
>  
> -         /* If fixed-point dest color buffer, need to clamp the incoming
> -          * fragment colors now.
> -          */
> -         if (clamp || softpipe->rasterizer->clamp_fragment_color) {
> -            clamp_colors(quadColor);
> -         }
> +            /* If fixed-point dest color buffer, need to clamp the incoming
> +             * fragment colors now.
> +             */
> +            if (clamp || softpipe->rasterizer->clamp_fragment_color) {
> +               clamp_colors(quadColor);
> +            }
>  
> -         /* get/swizzle dest colors
> -          */
> -         for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> -            int x = itx + (j & 1);
> -            int y = ity + (j >> 1);
> -            for (i = 0; i < 4; i++) {
> -               dest[i][j] = tile->data.color[y][x][i];
> +            /* get/swizzle dest colors
> +             */
> +            for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> +               int x = itx + (j & 1);
> +               int y = ity + (j >> 1);
> +               for (i = 0; i < 4; i++) {
> +                  dest[i][j] = tile->data.color[y][x][i];
> +               }
>              }
> -         }
>  
>  
> -         if (blend->logicop_enable) {
> -            if (bqs->format_type[cbuf] != UTIL_FORMAT_TYPE_FLOAT) {
> -               logicop_quad( qs, quadColor, dest );
> +            if (blend->logicop_enable) {
> +               if (bqs->format_type[cbuf] != UTIL_FORMAT_TYPE_FLOAT) {
> +                  logicop_quad( qs, quadColor, dest );
> +               }
>              }
> -         }
> -         else if (blend->rt[blend_buf].blend_enable) {
> -            blend_quad(qs, quadColor, quadColor2, dest, blend_color, blend_buf);
> -
> -            /* If fixed-point dest color buffer, need to clamp the outgoing
> -             * fragment colors now.
> -             */
> -            if (clamp) {
> -               clamp_colors(quadColor);
> +            else if (blend->rt[blend_buf].blend_enable) {
> +               blend_quad(qs, quadColor, quadColor2, dest, blend_color, blend_buf);
> +
> +               /* If fixed-point dest color buffer, need to clamp the outgoing
> +                * fragment colors now.
> +                */
> +               if (clamp) {
> +                  clamp_colors(quadColor);
> +               }
>              }
> -         }
>  
> -         rebase_colors(bqs->base_format[cbuf], quadColor);
> +            rebase_colors(bqs->base_format[cbuf], quadColor);
>  
> -         if (blend->rt[blend_buf].colormask != 0xf)
> -            colormask_quad( blend->rt[cbuf].colormask, quadColor, dest);
> -   
> -         /* Output color values
> -          */
> -         for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> -            if (quad->inout.mask & (1 << j)) {
> -               int x = itx + (j & 1);
> -               int y = ity + (j >> 1);
> -               for (i = 0; i < 4; i++) { /* loop over color chans */
> -                  tile->data.color[y][x][i] = quadColor[i][j];
> +            if (blend->rt[blend_buf].colormask != 0xf)
> +               colormask_quad( blend->rt[cbuf].colormask, quadColor, dest);
> +
> +            /* Output color values
> +             */
> +            for (j = 0; j < TGSI_QUAD_SIZE; j++) {
> +               if (quad->inout.mask & (1 << j)) {
> +                  int x = itx + (j & 1);
> +                  int y = ity + (j >> 1);
> +                  for (i = 0; i < 4; i++) { /* loop over color chans */
> +                     tile->data.color[y][x][i] = quadColor[i][j];
> +                  }
>                 }
>              }
>           }
> @@ -1255,23 +1256,25 @@ choose_blend_quad(struct quad_stage *qs,
>      * whether color clamping is needed.
>      */
>     for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) {
> -      const enum pipe_format format = softpipe->framebuffer.cbufs[i]->format;
> -      const struct util_format_description *desc =
> -         util_format_description(format);
> -      /* assuming all or no color channels are normalized: */
> -      bqs->clamp[i] = desc->channel[0].normalized;
> -      bqs->format_type[i] = desc->channel[0].type;
> -
> -      if (util_format_is_intensity(format))
> -         bqs->base_format[i] = INTENSITY;
> -      else if (util_format_is_luminance(format))
> -         bqs->base_format[i] = LUMINANCE;
> -      else if (util_format_is_luminance_alpha(format))
> -         bqs->base_format[i] = LUMINANCE_ALPHA;
> -      else if (!util_format_has_alpha(format))
> -         bqs->base_format[i] = RGB;
> -      else
> -         bqs->base_format[i] = RGBA;
> +      if (softpipe->framebuffer.cbufs[i]) {
> +         const enum pipe_format format = softpipe->framebuffer.cbufs[i]->format;
> +         const struct util_format_description *desc =
> +            util_format_description(format);
> +         /* assuming all or no color channels are normalized: */
> +         bqs->clamp[i] = desc->channel[0].normalized;
> +         bqs->format_type[i] = desc->channel[0].type;
> +
> +         if (util_format_is_intensity(format))
> +            bqs->base_format[i] = INTENSITY;
> +         else if (util_format_is_luminance(format))
> +            bqs->base_format[i] = LUMINANCE;
> +         else if (util_format_is_luminance_alpha(format))
> +            bqs->base_format[i] = LUMINANCE_ALPHA;
> +         else if (!util_format_has_alpha(format))
> +            bqs->base_format[i] = RGB;
> +         else
> +            bqs->base_format[i] = RGBA;
> +      }
>     }
>  
>     qs->run(qs, quads, nr);
> 

Reviewed-by: Roland Scheidegger <sroland at vmware.com>


More information about the mesa-dev mailing list