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:
parent
39cfdf9930
commit
db2ae51121
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue