Mesa (master): dri/nv25: Bind a hierarchical depth buffer.

Francisco Jerez currojerez at kemper.freedesktop.org
Sun Oct 31 01:08:46 UTC 2010


Module: Mesa
Branch: master
Commit: e3c0b7ba4198db170543ff2b8cf9ebc8e0657f62
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e3c0b7ba4198db170543ff2b8cf9ebc8e0657f62

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Fri Oct 29 21:53:56 2010 +0200

dri/nv25: Bind a hierarchical depth buffer.

---

 src/mesa/drivers/dri/nouveau/nouveau_bo_state.h |    2 +-
 src/mesa/drivers/dri/nouveau/nouveau_class.h    |    2 +
 src/mesa/drivers/dri/nouveau/nv10_state_fb.c    |    6 ++--
 src/mesa/drivers/dri/nouveau/nv20_context.c     |    4 ---
 src/mesa/drivers/dri/nouveau/nv20_state_fb.c    |   28 +++++++++++++++++++++++
 5 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bo_state.h b/src/mesa/drivers/dri/nouveau/nouveau_bo_state.h
index 6119a83..388a16a 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_bo_state.h
+++ b/src/mesa/drivers/dri/nouveau/nouveau_bo_state.h
@@ -29,7 +29,7 @@
 
 enum {
 	NOUVEAU_BO_CONTEXT_FRAMEBUFFER = 0,
-	NOUVEAU_BO_CONTEXT_LMA_DEPTH,
+	NOUVEAU_BO_CONTEXT_HIERZ,
 	NOUVEAU_BO_CONTEXT_SURFACE,
 	NOUVEAU_BO_CONTEXT_TEXTURE0,
 	NOUVEAU_BO_CONTEXT_TEXTURE1,
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_class.h b/src/mesa/drivers/dri/nouveau/nouveau_class.h
index d41d431..687b847 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_class.h
+++ b/src/mesa/drivers/dri/nouveau/nouveau_class.h
@@ -4954,6 +4954,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define  NV25TCL_DMA_IN_MEMORY5								0x000001a0
 #define  NV25TCL_DMA_IN_MEMORY8								0x000001ac
 #define  NV25TCL_DMA_IN_MEMORY9								0x000001b0
+#define  NV25TCL_HIERZ_PITCH								0x0000022c
+#define  NV25TCL_HIERZ_OFFSET								0x00000230
 
 #endif /* NOUVEAU_REG_H */
 
diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c
index d87fe96..0fda9fa 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_fb.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_fb.c
@@ -51,11 +51,11 @@ get_rt_format(gl_format format)
 }
 
 static void
-setup_lma_buffer(struct gl_context *ctx)
+setup_hierz_buffer(struct gl_context *ctx)
 {
 	struct nouveau_channel *chan = context_chan(ctx);
 	struct nouveau_grobj *celsius = context_eng3d(ctx);
-	struct nouveau_bo_context *bctx = context_bctx(ctx, LMA_DEPTH);
+	struct nouveau_bo_context *bctx = context_bctx(ctx, HIERZ);
 	struct gl_framebuffer *fb = ctx->DrawBuffer;
 	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
 	unsigned pitch = align(fb->Width, 128),
@@ -135,7 +135,7 @@ nv10_emit_framebuffer(struct gl_context *ctx, int emit)
 				 s->bo, 0, bo_flags);
 
 		if (context_chipset(ctx) >= 0x17) {
-			setup_lma_buffer(ctx);
+			setup_hierz_buffer(ctx);
 			context_dirty(ctx, ZCLEAR);
 		}
 	}
diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c b/src/mesa/drivers/dri/nouveau/nv20_context.c
index 4ca7cd6..c31fd39 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_context.c
@@ -187,10 +187,6 @@ nv20_hwctx_init(struct gl_context *ctx)
 	OUT_RING  (chan, 2);
 
 	if (context_chipset(ctx) >= 0x25) {
-		BEGIN_RING(chan, kelvin, 0x022c, 2);
-		OUT_RING  (chan, 0x280);
-		OUT_RING  (chan, 0x07d28000);
-
 		BEGIN_RING(chan, kelvin, 0x1da4, 1);
 		OUT_RING  (chan, 0);
 	}
diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_fb.c b/src/mesa/drivers/dri/nouveau/nv20_state_fb.c
index 7822ca2..854392f 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_state_fb.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_state_fb.c
@@ -51,6 +51,31 @@ get_rt_format(gl_format format)
 	}
 }
 
+static void
+setup_hierz_buffer(struct gl_context *ctx)
+{
+	struct nouveau_channel *chan = context_chan(ctx);
+	struct nouveau_grobj *kelvin = context_eng3d(ctx);
+	struct nouveau_bo_context *bctx = context_bctx(ctx, HIERZ);
+	struct gl_framebuffer *fb = ctx->DrawBuffer;
+	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
+	unsigned pitch = align(fb->Width, 128),
+		height = align(fb->Height, 2),
+		size = pitch * height;
+
+	if (!nfb->hierz.bo || nfb->hierz.bo->size != size) {
+		nouveau_bo_ref(NULL, &nfb->hierz.bo);
+		nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_VRAM, 0, size,
+			       &nfb->hierz.bo);
+	}
+
+	BEGIN_RING(chan, kelvin, NV25TCL_HIERZ_PITCH, 1);
+	OUT_RING(chan, pitch);
+
+	nouveau_bo_markl(bctx, kelvin, NV25TCL_HIERZ_OFFSET, nfb->hierz.bo,
+			 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR);
+}
+
 void
 nv20_emit_framebuffer(struct gl_context *ctx, int emit)
 {
@@ -88,6 +113,9 @@ nv20_emit_framebuffer(struct gl_context *ctx, int emit)
 
 		nouveau_bo_markl(bctx, kelvin, NV20TCL_ZETA_OFFSET,
 				 s->bo, 0, bo_flags);
+
+		if (context_chipset(ctx) >= 0x25)
+			setup_hierz_buffer(ctx);
 	} else {
 		rt_format |= get_rt_format(MESA_FORMAT_Z24_S8);
 		zeta_pitch = rt_pitch;




More information about the mesa-commit mailing list