mesa: Skip partial InvalidateFramebuffer of packed depth/stencil.

One of the CTS cases tries to invalidate just stencil of packed
depth/stencil, and we incorrectly lost the depth contents.

Fixes dEQP-GLES3.functional.fbo.invalidate.whole.unbind_read_stencil
Fixes: 0c42b5f3cb ("mesa: wire up InvalidateFramebuffer")
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Eric Anholt 2019-01-30 09:33:53 -08:00
parent 39cfdf9930
commit db2ae51121
1 changed files with 23 additions and 0 deletions

View File

@ -4691,6 +4691,29 @@ discard_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
if (!att)
continue;
/* If we're asked to invalidate just depth or just stencil, but the
* attachment is packed depth/stencil, then we can only use
* Driver.DiscardFramebuffer if the attachments list includes both depth
* and stencil and they both point at the same renderbuffer.
*/
if ((attachments[i] == GL_DEPTH_ATTACHMENT ||
attachments[i] == GL_STENCIL_ATTACHMENT) &&
(!att->Renderbuffer ||
att->Renderbuffer->_BaseFormat == GL_DEPTH_STENCIL)) {
GLenum other_format = (attachments[i] == GL_DEPTH_ATTACHMENT ?
GL_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT);
bool has_both = false;
for (int j = 0; j < numAttachments; j++) {
if (attachments[j] == other_format)
has_both = true;
break;
}
if (fb->Attachment[BUFFER_DEPTH].Renderbuffer !=
fb->Attachment[BUFFER_STENCIL].Renderbuffer || !has_both)
continue;
}
ctx->Driver.DiscardFramebuffer(ctx, fb, att);
}
}