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

Author: Christoph Bumiller <e0425...@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;

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to