Mesa (openchrome-branch): openchrome: Implement hardware fbo stencil / depth interleaving.

Thomas Hellstrom thomash at kemper.freedesktop.org
Sun Feb 22 09:43:35 UTC 2009


Module: Mesa
Branch: openchrome-branch
Commit: 47acb806b2141d38a8bc07065437b357c9006a2d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=47acb806b2141d38a8bc07065437b357c9006a2d

Author: Thomas Hellstrom <thomas-at-shipmail-dot-org>
Date:   Sun Feb 22 10:40:14 2009 +0100

openchrome: Implement hardware fbo stencil / depth interleaving.

---

 src/mesa/drivers/dri/openchrome/via_depthstencil.c |   66 +++++++++++++++++--
 1 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/openchrome/via_depthstencil.c b/src/mesa/drivers/dri/openchrome/via_depthstencil.c
index 5dfa265..e10f943 100644
--- a/src/mesa/drivers/dri/openchrome/via_depthstencil.c
+++ b/src/mesa/drivers/dri/openchrome/via_depthstencil.c
@@ -151,6 +151,62 @@ unmap_buffers(GLcontext * ctx,
     }
 }
 
+static int via_extract_stencil(GLcontext * ctx,
+			       struct gl_renderbuffer *combinedRb,
+			       struct gl_renderbuffer *stencilRb)
+{
+    struct via_context *vmesa = VIA_CONTEXT(ctx);
+    struct via_renderbuffer *viaStencilRb = via_renderbuffer(stencilRb);
+    struct via_renderbuffer *viaCombinedRb = via_renderbuffer(combinedRb);
+    int ret;
+
+    if (!viaStencilRb || !viaCombinedRb)
+	goto out_sw;
+
+    VIA_FLUSH_DMA(vmesa);
+    viaBlit(vmesa, 24, viaCombinedRb->buf, viaStencilRb->buf, 0, 0,
+	    viaCombinedRb->pitch, viaStencilRb->pitch, 1, 1,
+	    combinedRb->Width, combinedRb->Height, VIA_BLIT_COPY,
+	    0, 0xe << 28);
+    return 0;
+  out_sw:
+    ret = map_buffers(ctx, viaCombinedRb, viaStencilRb);
+    if (!ret) {
+	_mesa_extract_stencil(ctx, combinedRb, stencilRb);
+	unmap_buffers(ctx, viaCombinedRb, viaStencilRb);
+    }
+    return ret;
+}
+
+static int via_insert_stencil(GLcontext * ctx,
+			       struct gl_renderbuffer *combinedRb,
+			       struct gl_renderbuffer *stencilRb)
+{
+    struct via_context *vmesa = VIA_CONTEXT(ctx);
+    struct via_renderbuffer *viaStencilRb = via_renderbuffer(stencilRb);
+    struct via_renderbuffer *viaCombinedRb = via_renderbuffer(combinedRb);
+    int ret;
+
+    if (!viaStencilRb || !viaCombinedRb)
+	goto out_sw;
+
+    VIA_FLUSH_DMA(vmesa);
+    viaBlit(vmesa, 24, viaStencilRb->buf, viaCombinedRb->buf, 0, 0,
+	    viaStencilRb->pitch, viaCombinedRb->pitch, 1, 1,
+	    combinedRb->Width, combinedRb->Height, VIA_BLIT_COPY,
+	    0, 0xe << 28);
+	
+    return 0;
+  out_sw:
+    ret = map_buffers(ctx, viaCombinedRb, viaStencilRb);
+    if (!ret) {
+	_mesa_insert_stencil(ctx, combinedRb, stencilRb);
+	unmap_buffers(ctx, viaCombinedRb, viaStencilRb);
+    }
+    return ret;
+}
+	
+
 /**
  * Undo the pairing/interleaving between depth and stencil buffers.
  * viarb should be a depth/stencil or stencil renderbuffer.
@@ -170,9 +226,7 @@ via_unpair_depth_stencil(GLcontext * ctx, struct via_renderbuffer *viarb)
 	if (stencilViarb) {
 	    /* need to extract stencil values from the depth buffer */
 	    ASSERT(stencilViarb->PairedDepth == viarb->Base.Name);
-	    map_buffers(ctx, viarb, stencilViarb);
-	    _mesa_extract_stencil(ctx, &viarb->Base, &stencilViarb->Base);
-	    unmap_buffers(ctx, viarb, stencilViarb);
+	    via_extract_stencil(ctx, &viarb->Base, &stencilViarb->Base);
 	    stencilViarb->PairedDepth = 0;
 	}
 	viarb->PairedStencil = 0;
@@ -189,9 +243,7 @@ via_unpair_depth_stencil(GLcontext * ctx, struct via_renderbuffer *viarb)
 	if (depthViarb) {
 	    /* need to extract stencil values from the depth buffer */
 	    ASSERT(depthViarb->PairedStencil == viarb->Base.Name);
-	    map_buffers(ctx, depthViarb, viarb);
-	    _mesa_extract_stencil(ctx, &depthViarb->Base, &viarb->Base);
-	    unmap_buffers(ctx, depthViarb, viarb);
+	    via_extract_stencil(ctx, &depthViarb->Base, &viarb->Base);
 	    depthViarb->PairedStencil = 0;
 	}
 	viarb->PairedDepth = 0;
@@ -255,7 +307,7 @@ via_validate_paired_depth_stencil(GLcontext * ctx, struct gl_framebuffer *fb)
 
 		/* establish new pairing: interleave stencil into depth buffer */
 		map_buffers(ctx, depthRb, stencilRb);
-		_mesa_insert_stencil(ctx, &depthRb->Base, &stencilRb->Base);
+		via_insert_stencil(ctx, &depthRb->Base, &stencilRb->Base);
 		unmap_buffers(ctx, depthRb, stencilRb);
 		depthRb->PairedStencil = stencilRb->Base.Name;
 		stencilRb->PairedDepth = depthRb->Base.Name;




More information about the mesa-commit mailing list