Mesa (master): nv50,nvc0: fix shader eviction

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Fri Dec 7 21:52:19 UTC 2012


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

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Fri Dec  7 22:43:10 2012 +0100

nv50,nvc0: fix shader eviction

---

 src/gallium/drivers/nv50/nv50_program.c |    5 +++++
 src/gallium/drivers/nvc0/nvc0_program.c |   16 ++++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index 0d292f7..10810bf 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -396,6 +396,11 @@ nv50_program_upload_code(struct nv50_context *nv50, struct nv50_program *prog)
             nouveau_heap_free(&evict->mem);
       }
       debug_printf("WARNING: out of code space, evicting all shaders.\n");
+      ret = nouveau_heap_alloc(heap, size, prog, &prog->mem);
+      if (ret) {
+         NOUVEAU_ERR("shader too large (0x%x) to fit in code space ?\n", size);
+         return FALSE;
+      }
    }
    prog->code_base = prog->mem->start;
 
diff --git a/src/gallium/drivers/nvc0/nvc0_program.c b/src/gallium/drivers/nvc0/nvc0_program.c
index 9655e18..8bcb206 100644
--- a/src/gallium/drivers/nvc0/nvc0_program.c
+++ b/src/gallium/drivers/nvc0/nvc0_program.c
@@ -670,8 +670,20 @@ nvc0_program_upload_code(struct nvc0_context *nvc0, struct nvc0_program *prog)
 
    ret = nouveau_heap_alloc(screen->text_heap, size, prog, &prog->mem);
    if (ret) {
-      NOUVEAU_ERR("out of code space\n");
-      return FALSE;
+      struct nouveau_heap *heap = screen->text_heap;
+      struct nouveau_heap *iter;
+      for (iter = heap; iter && iter->next != heap; iter = iter->next) {
+         struct nvc0_program *evict = iter->priv;
+         if (evict)
+            nouveau_heap_free(&evict->mem);
+      }
+      debug_printf("WARNING: out of code space, evicting all shaders.\n");
+      ret = nouveau_heap_alloc(heap, size, prog, &prog->mem);
+      if (ret) {
+         NOUVEAU_ERR("shader too large (0x%x) to fit in code space ?\n", size);
+         return FALSE;
+      }
+      IMMED_NVC0(nvc0->base.pushbuf, NVC0_3D(SERIALIZE), 0);
    }
    prog->code_base = prog->mem->start;
    prog->immd_base = align(prog->mem->start + prog->immd_base, 0x100);




More information about the mesa-commit mailing list