[Mesa-dev] [PATCH] st/mesa: fix crash when DrawBuffer->_ColorDrawBuffers[0] is NULL

Marek Olšák maraeo at gmail.com
Tue Feb 22 02:52:28 PST 2011


Brian,

I realized that this clear color translation is wrong because it won't work
for multiple render targets. It's possible to have mixed format attachments
like one with GL_LUMINANCE8_ALPHA8 and another one with GL_RGBA8 in slots 0
and 1 respectively, the ARB_fbo spec allows it. I think we should let
drivers swizzle the clear color for each active render target separately if
they need it.

For example, we setup r300 to only read the R and A components for
LUMINANCE8_ALPHA8, so it doesn't need any help from the state tracker, and
the other render targets are unaffected. r500 and later GPUs *can* do mixed
attachments.

Best regards
Marek

On Sun, Feb 20, 2011 at 4:52 PM, Marek Olšák <maraeo at gmail.com> wrote:

> This fixes the game Tiny and Big.
> ---
>  src/mesa/state_tracker/st_cb_clear.c |   16 ++++++++++------
>  1 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_clear.c
> b/src/mesa/state_tracker/st_cb_clear.c
> index d81e554..0e0c432 100644
> --- a/src/mesa/state_tracker/st_cb_clear.c
> +++ b/src/mesa/state_tracker/st_cb_clear.c
> @@ -300,9 +300,11 @@ clear_with_quad(struct gl_context *ctx,
>    cso_set_fragment_shader_handle(st->cso_context, st->clear.fs);
>    cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);
>
> -   st_translate_color(ctx->Color.ClearColor,
> -                      ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
> -                      clearColor);
> +   if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
> +      st_translate_color(ctx->Color.ClearColor,
> +
> ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
> +                         clearColor);
> +   }
>
>    /* draw quad matching scissor rect */
>    draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, clearColor);
> @@ -555,9 +557,11 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>            ctx->DrawBuffer->Visual.stencilBits == 0))
>          clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
>
> -      st_translate_color(ctx->Color.ClearColor,
> -
> ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
> -                         clearColor);
> +      if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
> +         st_translate_color(ctx->Color.ClearColor,
> +
>  ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
> +                            clearColor);
> +      }
>
>       st->pipe->clear(st->pipe, clear_buffers, ctx->Color.ClearColor,
>                       ctx->Depth.Clear, ctx->Stencil.Clear);
> --
> 1.7.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110222/df0173b4/attachment.htm>


More information about the mesa-dev mailing list