[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