[Mesa-dev] [PATCH V2 13/22] mesa: support multisample textures in framebuffer completeness check

Paul Berry stereotype441 at gmail.com
Tue Feb 5 11:26:21 PST 2013


On 4 February 2013 21:48, Chris Forbes <chrisf at ijw.co.nz> wrote:

> - sample count must be the same on all attachments
> - fixedsamplepositions must be the same on all attachments
> (renderbuffers have fixedsamplepositions=true implicitly; only
> multisample textures can choose to have it false)
> - stencil-only formats become legal.
>

Can you help me understand what aspect of ARB_texture_multisample causes
stencil-only formats to become legal?  I don't see anything in the
extension spec that allows this, and I'm worried that we may make
assumptions elsewhere in the driver that would be broken by stencil-only
framebuffers.

Cc'ing Ken since he's currently working on a patch which I believe makes
this assumption ("i965: Implement CopyTexSubImage2D via BLORP (and use it
by default).").


>
> V2: - fix wrapping to 80 columns, debug message, fix for state moving
>       from texobj to image.
>     - stencil texturing tweaks tidied up and folded in here.
>
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
>  src/mesa/main/fbobject.c | 50
> ++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 38 insertions(+), 12 deletions(-)
>
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index d9fd78e..089fa84 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -575,6 +575,7 @@ is_legal_depth_format(const struct gl_context *ctx,
> GLenum baseFormat)
>     switch (baseFormat) {
>     case GL_DEPTH_COMPONENT:
>     case GL_DEPTH_STENCIL_EXT:
> +   case GL_STENCIL_INDEX:
>        return GL_TRUE;
>     default:
>        return GL_FALSE;
> @@ -664,8 +665,11 @@ test_attachment_completeness(const struct gl_context
> *ctx, GLenum format,
>               baseFormat == GL_DEPTH_STENCIL_EXT) {
>              /* OK */
>           }
> +         else if (ctx->Extensions.ARB_texture_multisample &&
> +               baseFormat == GL_STENCIL_INDEX) {
> +            /* OK */
> +         }
>           else {
> -            /* no such thing as stencil-only textures */
>              att_incomplete("illegal stencil texture");
>              att->Complete = GL_FALSE;
>              return;
> @@ -745,6 +749,7 @@ _mesa_test_framebuffer_completeness(struct gl_context
> *ctx,
>     GLenum intFormat = GL_NONE; /* color buffers' internal format */
>     GLuint minWidth = ~0, minHeight = ~0, maxWidth = 0, maxHeight = 0;
>     GLint numSamples = -1;
> +   GLint fixedSampleLocations = -1;
>     GLint i;
>     GLuint j;
>
> @@ -766,6 +771,7 @@ _mesa_test_framebuffer_completeness(struct gl_context
> *ctx,
>        struct gl_renderbuffer_attachment *att;
>        GLenum f;
>        gl_format attFormat;
> +      struct gl_texture_image *texImg = NULL;
>
>        /*
>         * XXX for ARB_fbo, only check color buffers that are named by
> @@ -805,8 +811,7 @@ _mesa_test_framebuffer_completeness(struct gl_context
> *ctx,
>        /* get width, height, format of the renderbuffer/texture
>         */
>        if (att->Type == GL_TEXTURE) {
> -         const struct gl_texture_image *texImg =
> -            _mesa_get_attachment_teximage(att);
> +         texImg = _mesa_get_attachment_teximage(att);
>           minWidth = MIN2(minWidth, texImg->Width);
>           maxWidth = MAX2(maxWidth, texImg->Width);
>           minHeight = MIN2(minHeight, texImg->Height);
> @@ -814,12 +819,19 @@ _mesa_test_framebuffer_completeness(struct
> gl_context *ctx,
>           f = texImg->_BaseFormat;
>           attFormat = texImg->TexFormat;
>           numImages++;
> +
>           if (!is_format_color_renderable(ctx, attFormat,
> texImg->InternalFormat) &&
>               !is_legal_depth_format(ctx, f)) {
>              fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
>              fbo_incomplete("texture attachment incomplete", -1);
>              return;
>           }
> +
> +         if (numSamples < 0)
> +            numSamples = texImg->NumSamples;
> +
> +         if (fixedSampleLocations < 0)
> +            fixedSampleLocations = texImg->FixedSampleLocations;
>        }
>        else if (att->Type == GL_RENDERBUFFER_EXT) {
>           minWidth = MIN2(minWidth, att->Renderbuffer->Width);
> @@ -829,21 +841,23 @@ _mesa_test_framebuffer_completeness(struct
> gl_context *ctx,
>           f = att->Renderbuffer->InternalFormat;
>           attFormat = att->Renderbuffer->Format;
>           numImages++;
> +
> +         if (numSamples < 0)
> +            numSamples = att->Renderbuffer->NumSamples;
> +
> +         /* RENDERBUFFER has fixedSampleLocations implicitly true */
> +         if (fixedSampleLocations < 0)
> +            fixedSampleLocations = GL_TRUE;
>        }
>        else {
>           assert(att->Type == GL_NONE);
>           continue;
>        }
>
> -      if (att->Renderbuffer && numSamples < 0) {
> -         /* first buffer */
> -         numSamples = att->Renderbuffer->NumSamples;
> -      }
> -
>        /* check if integer color */
>        fb->_IntegerColor = _mesa_is_format_integer_color(attFormat);
>
> -      /* Error-check width, height, format, samples
> +      /* Error-check width, height, format, samples, fixedSampleLocations
>         */
>        if (numImages == 1) {
>           /* save format, num samples */
> @@ -866,10 +880,22 @@ _mesa_test_framebuffer_completeness(struct
> gl_context *ctx,
>                 return;
>              }
>           }
> -         if (att->Renderbuffer &&
> -             att->Renderbuffer->NumSamples != numSamples) {
> +
> +         if ((att->Type == GL_RENDERBUFFER &&
> +                  att->Renderbuffer->NumSamples != numSamples) ||
> +             (att->Type == GL_TEXTURE &&
> +              texImg->NumSamples != numSamples)) {
> +            fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
> +            fbo_incomplete("inconsistent number of samples", i);
> +            return;
> +         }
> +
> +         if ((att->Type == GL_RENDERBUFFER &&
> +               GL_TRUE != fixedSampleLocations) ||
> +             (att->Type == GL_TEXTURE &&
> +               texImg->FixedSampleLocations != fixedSampleLocations)) {
>              fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
> -            fbo_incomplete("inconsistant number of samples", i);
> +            fbo_incomplete("inconsistent fixed sample locations", i);
>              return;
>           }
>        }
> --
> 1.8.1.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130205/09d38ad3/attachment.html>


More information about the mesa-dev mailing list