Mesa (master): nv50: add relocs for stack and local mem buffers

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Sat Sep 18 13:23:45 UTC 2010


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

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Sat Sep 18 13:40:10 2010 +0200

nv50: add relocs for stack and local mem buffers

---

 src/gallium/drivers/nv50/nv50_context.h      |    1 +
 src/gallium/drivers/nv50/nv50_pc.c           |    2 ++
 src/gallium/drivers/nv50/nv50_program.h      |    1 +
 src/gallium/drivers/nv50/nv50_screen.c       |   13 +++++++++++++
 src/gallium/drivers/nv50/nv50_shader_state.c |   17 ++++++++++++++---
 5 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_context.h b/src/gallium/drivers/nv50/nv50_context.h
index 6ec9095..ac69c78 100644
--- a/src/gallium/drivers/nv50/nv50_context.h
+++ b/src/gallium/drivers/nv50/nv50_context.h
@@ -157,6 +157,7 @@ struct nv50_context {
 	unsigned sampler_view_nr[3];
 
 	unsigned vbo_fifo;
+	unsigned req_lmem;
 };
 
 static INLINE struct nv50_context *
diff --git a/src/gallium/drivers/nv50/nv50_pc.c b/src/gallium/drivers/nv50/nv50_pc.c
index 6765405..42127a1 100644
--- a/src/gallium/drivers/nv50/nv50_pc.c
+++ b/src/gallium/drivers/nv50/nv50_pc.c
@@ -547,6 +547,8 @@ nv50_generate_code(struct nv50_translation_info *ti)
    ti->p->fixups = pc->fixups;
    ti->p->num_fixups = pc->num_fixups;
 
+   ti->p->uses_lmem = ti->store_to_memory;
+
    NV50_DBGMSG("SHADER TRANSLATION - %s\n", ret ? "failure" : "success");
 
 out:
diff --git a/src/gallium/drivers/nv50/nv50_program.h b/src/gallium/drivers/nv50/nv50_program.h
index 37b02bb..33c4c8c 100644
--- a/src/gallium/drivers/nv50/nv50_program.h
+++ b/src/gallium/drivers/nv50/nv50_program.h
@@ -45,6 +45,7 @@ struct nv50_program {
 
    ubyte type;
    boolean translated;
+   boolean uses_lmem;
 
    struct nouveau_bo *bo;
    struct nouveau_stateobj *so;
diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index 49af9b5..a8f7721 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -265,6 +265,19 @@ nv50_screen_relocs(struct nv50_screen *screen)
 		OUT_RELOC (chan, screen->constbuf_parm[i],
 			   ((NV50_CB_PVP + i) << 16) | 0x0000, rl, 0, 0);
 	}
+
+	BGN_RELOC (chan, screen->stack_bo,
+		   tesla, NV50TCL_STACK_ADDRESS_HIGH, 2, rl);
+	OUT_RELOCh(chan, screen->stack_bo, 0, rl);
+	OUT_RELOCl(chan, screen->stack_bo, 0, rl);
+
+	if (!screen->cur_ctx->req_lmem)
+		return;
+
+	BGN_RELOC (chan, screen->local_bo,
+		   tesla, NV50TCL_LOCAL_ADDRESS_HIGH, 2, rl);
+	OUT_RELOCh(chan, screen->local_bo, 0, rl);
+	OUT_RELOCl(chan, screen->local_bo, 0, rl);
 }
 
 #ifndef NOUVEAU_GETPARAM_GRAPH_UNITS
diff --git a/src/gallium/drivers/nv50/nv50_shader_state.c b/src/gallium/drivers/nv50/nv50_shader_state.c
index 8c1a599..8057ec9 100644
--- a/src/gallium/drivers/nv50/nv50_shader_state.c
+++ b/src/gallium/drivers/nv50/nv50_shader_state.c
@@ -281,6 +281,17 @@ nv50_program_validate(struct nv50_program *p)
    return p->translated;
 }
 
+static INLINE void
+nv50_program_validate_common(struct nv50_context *nv50, struct nv50_program *p)
+{
+   nv50_program_validate_code(nv50, p);
+
+   if (p->uses_lmem)
+      nv50->req_lmem |= 1 << p->type;
+   else
+      nv50->req_lmem &= ~(1 << p->type);
+}
+
 struct nouveau_stateobj *
 nv50_vertprog_validate(struct nv50_context *nv50)
 {
@@ -300,7 +311,7 @@ nv50_vertprog_validate(struct nv50_context *nv50)
    if (!(nv50->dirty & NV50_NEW_VERTPROG))
       return NULL;
 
-   nv50_program_validate_code(nv50, p);
+   nv50_program_validate_common(nv50, p);
 
    so_ref(p->so, &so);
    return so;
@@ -325,7 +336,7 @@ nv50_fragprog_validate(struct nv50_context *nv50)
    if (!(nv50->dirty & NV50_NEW_FRAGPROG))
       return NULL;
 
-   nv50_program_validate_code(nv50, p);
+   nv50_program_validate_common(nv50, p);
 
    so_ref(p->so, &so);
    return so;
@@ -350,7 +361,7 @@ nv50_geomprog_validate(struct nv50_context *nv50)
    if (!(nv50->dirty & NV50_NEW_GEOMPROG))
       return NULL;
 
-   nv50_program_validate_code(nv50, p);
+   nv50_program_validate_common(nv50, p);
 
    so_ref(p->so, &so);
    return so;




More information about the mesa-commit mailing list