Mesa (llvm-context): llvmpipe: make variant_count global

Brian Paul brianp at kemper.freedesktop.org
Fri Nov 5 14:15:19 UTC 2010


Module: Mesa
Branch: llvm-context
Commit: 05a54356513d6cb40e5da1e45cd6aca42e05490e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=05a54356513d6cb40e5da1e45cd6aca42e05490e

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Nov  3 10:50:51 2010 -0600

llvmpipe: make variant_count global

It's shared by all contexts.  When we GC, we destroy all contexts' shader
variants.

---

 src/gallium/drivers/llvmpipe/lp_context.c     |    2 ++
 src/gallium/drivers/llvmpipe/lp_context.h     |    9 ++++++++-
 src/gallium/drivers/llvmpipe/lp_flush.c       |    4 ++--
 src/gallium/drivers/llvmpipe/lp_state_fs.c    |    2 +-
 src/gallium/drivers/llvmpipe/lp_state_setup.c |    2 ++
 5 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_context.c b/src/gallium/drivers/llvmpipe/lp_context.c
index a2a9991..2036a71 100644
--- a/src/gallium/drivers/llvmpipe/lp_context.c
+++ b/src/gallium/drivers/llvmpipe/lp_context.c
@@ -50,6 +50,8 @@
 DEBUG_GET_ONCE_BOOL_OPTION(lp_no_rast, "LP_NO_RAST", FALSE)
 
 
+/** shared by all contexts */
+unsigned llvmpipe_variant_count;
 
 
 /**
diff --git a/src/gallium/drivers/llvmpipe/lp_context.h b/src/gallium/drivers/llvmpipe/lp_context.h
index 83e3973..5719071 100644
--- a/src/gallium/drivers/llvmpipe/lp_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_context.h
@@ -124,13 +124,20 @@ struct llvmpipe_context {
    /** JIT code generation */
    struct gallivm_state *gallivm;
    LLVMTypeRef jit_context_ptr_type;
-   unsigned variant_count;
 
    struct lp_setup_variant_list_item setup_variants_list;
    unsigned nr_setup_variants;
 };
 
 
+/**
+ * Fragment and setup variant count, used to trigger garbage collection.
+ * This is global since all variants in all contexts will be free when
+ * we do garbage collection.
+ */
+extern unsigned llvmpipe_variant_count;
+
+
 struct pipe_context *
 llvmpipe_create_context( struct pipe_screen *screen, void *priv );
 
diff --git a/src/gallium/drivers/llvmpipe/lp_flush.c b/src/gallium/drivers/llvmpipe/lp_flush.c
index 72eb4e4..e8d00cf 100644
--- a/src/gallium/drivers/llvmpipe/lp_flush.c
+++ b/src/gallium/drivers/llvmpipe/lp_flush.c
@@ -57,10 +57,10 @@ llvmpipe_flush( struct pipe_context *pipe,
    lp_setup_flush(llvmpipe->setup, flags, fence, reason);
 
 
-   if (llvmpipe->variant_count > 1000) {
+   if (llvmpipe_variant_count > 1000) {
       /* time to do a garbage collection */
       gallivm_garbage_collect(llvmpipe->gallivm);
-      llvmpipe->variant_count = 0;
+      llvmpipe_variant_count = 0;
    }
 
    /* Enable to dump BMPs of the color/depth buffers each frame */
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 5965381..9c39845 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -1372,7 +1372,7 @@ llvmpipe_update_fs(struct llvmpipe_context *lp)
       LP_COUNT_ADD(llvm_compile_time, dt);
       LP_COUNT_ADD(nr_llvm_compiles, 2);  /* emit vs. omit in/out test */
 
-      lp->variant_count++;
+      llvmpipe_variant_count++;
 
       /* Put the new variant into the list */
       if (variant) {
diff --git a/src/gallium/drivers/llvmpipe/lp_state_setup.c b/src/gallium/drivers/llvmpipe/lp_state_setup.c
index 8376ecd..f7a9b55 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_setup.c
@@ -720,6 +720,8 @@ llvmpipe_update_setup(struct llvmpipe_context *lp)
       variant = generate_setup_variant(lp->gallivm, key);
       insert_at_head(&lp->setup_variants_list, &variant->list_item_global);
       lp->nr_setup_variants++;
+
+      llvmpipe_variant_count++;
    }
 
    lp_setup_set_setup_variant(lp->setup,




More information about the mesa-commit mailing list