[Mesa-dev] [PATCH 1/3] st/mesa: fix handling of NumSamples=1

Roland Scheidegger sroland at vmware.com
Wed Aug 2 17:59:14 UTC 2017


I think the problem here is that msaa surfaces with sample count 1 are
not really supposed to exist in gallium.
This is a rather awkward gl-ism, which isn't possible anywhere else,
other apis have no distinction between a multisampled surface with
sample count 1 and a non-multisampled surface with effectively sample
count 1 too.
So, drivers should not have to distinguish between msaa surfaces with
sample count 1 and non-msaa surfaces, those should be the same (the
state tracker takes care of not accidentally enabling things like
alpha_to_coverage for non-msaa surfaces even if multisampling and
alpha_to_coverage itself is enabled). This is how d3d10 (and our device)
operate.

I believe the correct solution would be to translate whatever is failing
for those fake multsample surfaces (you mentioned
glRenderbufferStorageMultisample()) away to something more appropriate
for non-msaa surfaces (in the state tracker or driver, I have no idea
what actually goes wrong).
But creating a non-msaa surface for a gl msaa surface with sample count
1 is the right thing to do.

Roland


Am 02.08.2017 um 19:07 schrieb Brian Paul:
> We pretty much use the convention that if gl_renderbuffer::NumSamples
> or gl_texture_image::NumSamples is zero, it's a non-MSAA surface.
> Otherwise, it's an MSAA surface.
> 
> This patch changes the sample count checks in st_AllocTextureStorage()
> and st_renderbuffer_alloc_storage() to test for samples > 0 instead of > 1.
> As it is, if samples==1 we skip the search for the next higher number of
> supported samples and ask the gallium driver to create a MSAA surface with
> one sample, which no driver supports (AFAIK).  Instead, drivers create a
> non-MSAA surface.
> 
> A specific example of this problem is the Piglit arb_framebuffer_srgb-blit
> test.  It calls glRenderbufferStorageMultisample() with samples=1 to
> request an MSAA renderbuffer with the minimum supported number of MSAA
> samples.  Instead of creating a 4x or 8x, etc. MSAA surface, we wound up
> creating a non-MSAA surface.
> 
> Finally, add a comment on the gl_renderbuffer::NumSamples field.
> 
> There is one piglit regression with the VMware driver:
> ext_framebuffer_multisample-blit-mismatched-formats fails because
> now we're actually creating real MSAA surfaces (the requested sample
> count is 1) and we're hitting some sort of bug in the blitter code.  That
> will have to be fixed separately.  Other drivers may find regressions
> too now that MSAA surfaces are really being created.
> ---
>  src/mesa/main/mtypes.h                 | 2 +-
>  src/mesa/state_tracker/st_cb_fbo.c     | 3 +--
>  src/mesa/state_tracker/st_cb_texture.c | 2 +-
>  3 files changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 404d586..1dec89c 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3303,7 +3303,7 @@ struct gl_renderbuffer
>      * called without a rb->TexImage.
>      */
>     GLboolean NeedsFinishRenderTexture;
> -   GLubyte NumSamples;
> +   GLubyte NumSamples;    /**< zero means not multisampled */
>     GLenum InternalFormat; /**< The user-specified format */
>     GLenum _BaseFormat;    /**< Either GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT or
>                                 GL_STENCIL_INDEX. */
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index 23cbcdc..6986eaa 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -156,9 +156,8 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
>      *   by the implementation.
>      *
>      * So let's find the supported number of samples closest to NumSamples.
> -    * (NumSamples == 1) is treated the same as (NumSamples == 0).
>      */
> -   if (rb->NumSamples > 1) {
> +   if (rb->NumSamples > 0) {
>        unsigned i;
>  
>        for (i = rb->NumSamples; i <= ctx->Const.MaxSamples; i++) {
> diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
> index db2913e..de6b57e 100644
> --- a/src/mesa/state_tracker/st_cb_texture.c
> +++ b/src/mesa/state_tracker/st_cb_texture.c
> @@ -2680,7 +2680,7 @@ st_AllocTextureStorage(struct gl_context *ctx,
>     bindings = default_bindings(st, fmt);
>  
>     /* Raise the sample count if the requested one is unsupported. */
> -   if (num_samples > 1) {
> +   if (num_samples > 0) {
>        enum pipe_texture_target ptarget = gl_target_to_pipe(texObj->Target);
>        boolean found = FALSE;
>  
> 



More information about the mesa-dev mailing list