From 4b6311978f6710cfb2e9d77a2ca7a30f709c1f37 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Fri, 7 Oct 2011 16:22:56 -0700 Subject: swrast: Fix fastpaths for glRead/WritePixels(GL_DEPTH_STENCIL) In some cases, Intel hardware requires that depth and stencil buffers be separate. To accommodate swrast, i965 resorts to hackery that causes a segfault in the fastpaths of draw_depth_stencil_pixels() and read_depth_stencil_pixels(). The hack is that i965 sets framebuffer->Attachment[BUFFER_DEPTH].Renderbuffer and framebuffer->Attachment[BUFFER_STENCIL].Renderbuffer to a dummy renderbuffer for which the GetRow accessors and friends are null. The real buffers are located at framebuffer->_DepthBuffer and framebuffer->_Stencilbuffer. To fix the segault, this patch skips the fastpath if framebuffer->Attachment[BUFFER_DEPTH].Renderbuffer->GetRow is null. Note: This is a candidate for the 7.11 branch. Reviewed-by: Brian Paul Signed-off-by: Chad Versace --- src/mesa/swrast/s_drawpix.c | 2 ++ src/mesa/swrast/s_readpix.c | 2 ++ 2 files changed, 4 insertions(+) (limited to 'src/mesa') diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index 6535a8f4350..20bf4d62635 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -593,6 +593,8 @@ draw_depth_stencil_pixels(struct gl_context *ctx, GLint x, GLint y, depthRb->Format == MESA_FORMAT_Z24_S8 && type == GL_UNSIGNED_INT_24_8 && depthRb == stencilRb && + depthRb->GetRow && /* May be null if depthRb is a wrapper around + * separate depth and stencil buffers. */ !scaleOrBias && !zoom && ctx->Depth.Mask && diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c index d120468c021..0d2e63f72bc 100644 --- a/src/mesa/swrast/s_readpix.c +++ b/src/mesa/swrast/s_readpix.c @@ -394,6 +394,8 @@ read_depth_stencil_pixels(struct gl_context *ctx, depthRb->Format == MESA_FORMAT_Z24_S8 && type == GL_UNSIGNED_INT_24_8 && depthRb == stencilRb && + depthRb->GetRow && /* May be null if depthRb is a wrapper around + * separate depth and stencil buffers. */ !scaleOrBias && !stencilTransfer) { /* This is the ideal case. -- cgit v1.2.3