[Mesa-dev] [PATCH V3 11/19] mesa: support multisample textures in framebuffer completeness check
Chris Forbes
chrisf at ijw.co.nz
Mon Feb 11 18:58:49 PST 2013
Yikes, apparently I missed one. Thanks for spotting that.
-- Chris
On Tue, Feb 12, 2013 at 3:35 PM, Eric Anholt <eric at anholt.net> wrote:
> Chris Forbes <chrisf at ijw.co.nz> writes:
>
>> - 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)
>>
>> 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.
>>
>> V3: - Removed silly stencil hacks entirely; the extension doesn't
>> actually make stencil-only textures legal at all.
>> - Moved sample count / fixed sample locations checks into
>> existing attachment-type-specific blocks, as suggested by Eric
>>
>> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
>> [V2] Reviewed-by: Paul Berry <stereotype441 at gmail.com>
>> ---
>> src/mesa/main/fbobject.c | 60 ++++++++++++++++++++++++++++++++++--------------
>> 1 file changed, 43 insertions(+), 17 deletions(-)
>>
>> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
>> index d9fd78e..46663dd 100644
>> --- a/src/mesa/main/fbobject.c
>> +++ b/src/mesa/main/fbobject.c
>> @@ -664,8 +664,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;
>
> Hey! You said you removed the silly stencil hacks! :)
>
>> @@ -745,6 +748,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 +770,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 +810,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);
>
> I think the texImg declaration change can be reverted now.
>
>> @@ -814,12 +818,29 @@ _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;
>> + else if (numSamples != texImg->NumSamples) {
>> + fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> + fbo_incomplete("inconsistent sample count", -1);
>> + return;
>> + }
>> +
>> + if (fixedSampleLocations < 0)
>> + fixedSampleLocations = texImg->FixedSampleLocations;
>> + else if (fixedSampleLocations != texImg->FixedSampleLocations) {
>> + fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> + fbo_incomplete("inconsistent fixed sample locations", -1);
>> + return;
>> + }
>> }
>> else if (att->Type == GL_RENDERBUFFER_EXT) {
>> minWidth = MIN2(minWidth, att->Renderbuffer->Width);
>> @@ -829,24 +850,35 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>> f = att->Renderbuffer->InternalFormat;
>> attFormat = att->Renderbuffer->Format;
>> numImages++;
>> +
>> + if (numSamples < 0)
>> + numSamples = att->Renderbuffer->NumSamples;
>> + else if (numSamples != att->Renderbuffer->NumSamples) {
>> + fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> + fbo_incomplete("inconsistent sample count", -1);
>> + return;
>> + }
>> +
>> + /* RENDERBUFFER has fixedSampleLocations implicitly true */
>> + if (fixedSampleLocations < 0)
>> + fixedSampleLocations = GL_TRUE;
>> + else if (fixedSampleLocations != GL_TRUE) {
>> + fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
>> + fbo_incomplete("inconsistent fixed sample locations", -1);
>> + return;
>> + }
>
> This looks like what I was thinking.
>
> Other than the 2 trivial comments,
>
> Reviewed-by: Eric Anholt <eric at anholt.net>
More information about the mesa-dev
mailing list