[Mesa-dev] [PATCH] st/mesa: set the new pipe_surface::alpha_one field for RGB surfaces
Ilia Mirkin
imirkin at alum.mit.edu
Tue Jun 28 15:16:02 UTC 2016
The main issue is when the st selects an alpha-ful format, but the GL
wants an alpha-less format. The driver has no way of knowing. This
gives it a way of knowing.
The alternative is that the driver has to support every format and we
drop all the fallbacks from st_format. Brian's proposal seems like a
simpler solution. (This happens on nvc0, for example - RGB10A2 is
supported, but RGB10X2 isn't. So the st picks RGB10A2 and nvc0 is none
the wiser - until someone tries to do DST_ALPHA blending.)
-ilia
On Tue, Jun 28, 2016 at 11:11 AM, Marek Olšák <maraeo at gmail.com> wrote:
> I guess you need this because your driver doesn't support LUMINANCE
> and st/mesa selects RGBA, right? In that case, you can just set RGBX
> in pipe_surface::format and you don't need another flag.
>
> It would be better to select RGBX at renderbuffer creation, but doing
> it later is fine as well.
>
> Marek
>
> On Fri, Jun 24, 2016 at 4:43 PM, Brian Paul <brianp at vmware.com> wrote:
>> This indicates the alpha channel of the surface should always be one.
>> Drivers can use this to adjust blending terms when needed.
>>
>> v2: also check for R, RG, LUMINANCE surfaces, per Ilia
>> ---
>> src/mesa/state_tracker/st_cb_fbo.c | 9 +++++++++
>> 1 file changed, 9 insertions(+)
>>
>> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
>> index 9801b1f..843ff83 100644
>> --- a/src/mesa/state_tracker/st_cb_fbo.c
>> +++ b/src/mesa/state_tracker/st_cb_fbo.c
>> @@ -216,6 +216,11 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
>> return FALSE;
>>
>> u_surface_default_template(&surf_tmpl, strb->texture);
>> + surf_tmpl.alpha_one = (strb->Base._BaseFormat == GL_RGB ||
>> + strb->Base._BaseFormat == GL_RG ||
>> + strb->Base._BaseFormat == GL_R ||
>> + strb->Base._BaseFormat == GL_LUMINANCE);
>> +
>> strb->surface = pipe->create_surface(pipe,
>> strb->texture,
>> &surf_tmpl);
>> @@ -463,6 +468,10 @@ st_update_renderbuffer_surface(struct st_context *st,
>> /* create a new pipe_surface */
>> struct pipe_surface surf_tmpl;
>> memset(&surf_tmpl, 0, sizeof(surf_tmpl));
>> + surf_tmpl.alpha_one = (strb->Base._BaseFormat == GL_RGB ||
>> + strb->Base._BaseFormat == GL_RG ||
>> + strb->Base._BaseFormat == GL_R ||
>> + strb->Base._BaseFormat == GL_LUMINANCE);
>> surf_tmpl.format = format;
>> surf_tmpl.u.tex.level = level;
>> surf_tmpl.u.tex.first_layer = first_layer;
>> --
>> 1.9.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list