When handling the depth/stencil case of CopyTexSubImage using blorp, we weren't paying attention to intel_mipmap_tree::stencil_mt field; as a result we were sometimes attempting to read and/or write stencil data using the depth miptree, resulting in image corruption.
Fixes some failures with piglit tests "copyteximage {1D,2D,CUBE,RECT,2D_ARRAY}". --- src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 0a9aca8..3417a99 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -380,16 +380,20 @@ brw_blorp_copytexsubimage(struct intel_context *intel, dstX0, dstY0, dstX1, dstY1, false, mirror_y); - /* If we're copying to a packed depth stencil texture and the source - * framebuffer has separate stencil, we need to also copy the stencil data - * over. + /* Blorp only ever copies one miptree at a time. Since Gen6+ uses separate + * stencil buffers, this means that the above copy just copied depth. If + * we're copying to a depth/stencil texture and the source framebuffer has + * stencil, we need to also copy the stencil data over. */ src_rb = ctx->ReadBuffer->Attachment[BUFFER_STENCIL].Renderbuffer; if (_mesa_get_format_bits(dst_image->TexFormat, GL_STENCIL_BITS) > 0 && src_rb != NULL) { src_irb = intel_renderbuffer(src_rb); - if (src_irb->mt != src_mt) - + src_mt = src_irb->mt; + if (src_mt->stencil_mt) + src_mt = src_mt->stencil_mt; + if (dst_mt->stencil_mt) + dst_mt = dst_mt->stencil_mt; brw_blorp_blit_miptrees(intel, src_irb->mt, src_irb->mt_level, src_irb->mt_layer, dst_mt, dst_image->Level, dst_image->Face, -- 1.8.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev