llvmpipe: Reuse llvmpipes LLVMContext in the draw context.
authorMathias Fröhlich <Mathias.Froehlich@gmx.net>
Sun, 21 Sep 2014 06:54:00 +0000 (08:54 +0200)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Tue, 30 Sep 2014 18:51:02 +0000 (20:51 +0200)
Reuse the LLVMContext already allocated in llvmpipe_context
for draw_llvm if ppossible. This should decrease the memory
footprint of an llvmpipe context.

v2: Fix compile with llvm disabled.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Signed-off-by: Mathias Froehlich <Mathias.Froehlich@web.de>
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_context.h
src/gallium/auxiliary/draw/draw_llvm.c
src/gallium/auxiliary/draw/draw_llvm.h
src/gallium/drivers/llvmpipe/lp_context.c

index 85f8e26eb33cbdb1d7bf204e2d3008063ea61f34..b0f4ca2c4c0d425b81bb6ff684d01bdae6aaa639 100644 (file)
@@ -81,7 +81,8 @@ draw_get_option_use_llvm(void)
  * Create new draw module context with gallivm state for LLVM JIT.
  */
 static struct draw_context *
-draw_create_context(struct pipe_context *pipe, boolean try_llvm)
+draw_create_context(struct pipe_context *pipe, void *context,
+                    boolean try_llvm)
 {
    struct draw_context *draw = CALLOC_STRUCT( draw_context );
    if (draw == NULL)
@@ -92,7 +93,7 @@ draw_create_context(struct pipe_context *pipe, boolean try_llvm)
 
 #if HAVE_LLVM
    if (try_llvm && draw_get_option_use_llvm()) {
-      draw->llvm = draw_llvm_create(draw);
+      draw->llvm = draw_llvm_create(draw, (LLVMContextRef)context);
    }
 #endif
 
@@ -120,17 +121,26 @@ err_out:
 struct draw_context *
 draw_create(struct pipe_context *pipe)
 {
-   return draw_create_context(pipe, TRUE);
+   return draw_create_context(pipe, NULL, TRUE);
 }
 
 
+#if HAVE_LLVM
+struct draw_context *
+draw_create_with_llvm_context(struct pipe_context *pipe,
+                              void *context)
+{
+   return draw_create_context(pipe, context, TRUE);
+}
+#endif
+
 /**
  * Create a new draw context, without LLVM JIT.
  */
 struct draw_context *
 draw_create_no_llvm(struct pipe_context *pipe)
 {
-   return draw_create_context(pipe, FALSE);
+   return draw_create_context(pipe, NULL, FALSE);
 }
 
 
index 48549fe200e2cea59b86859cdd8a01b356ed18f8..a5a6df5b72e3d2e027aa6b7c4cead51bad8466b9 100644 (file)
@@ -64,6 +64,11 @@ struct draw_so_target {
 
 struct draw_context *draw_create( struct pipe_context *pipe );
 
+#if HAVE_LLVM
+struct draw_context *draw_create_with_llvm_context(struct pipe_context *pipe,
+                                                   void *context);
+#endif
+
 struct draw_context *draw_create_no_llvm(struct pipe_context *pipe);
 
 void draw_destroy( struct draw_context *draw );
index 8469d6999b1063e55d14edfef1b4af529ad319f2..14c802b3b2a1988fb3c13228419ef68e7afb1e5c 100644 (file)
@@ -480,7 +480,7 @@ get_vertex_header_ptr_type(struct draw_llvm_variant *variant)
  * Create per-context LLVM info.
  */
 struct draw_llvm *
-draw_llvm_create(struct draw_context *draw)
+draw_llvm_create(struct draw_context *draw, LLVMContextRef context)
 {
    struct draw_llvm *llvm;
 
@@ -493,7 +493,11 @@ draw_llvm_create(struct draw_context *draw)
 
    llvm->draw = draw;
 
-   llvm->context = LLVMContextCreate();
+   llvm->context = context;
+   if (!llvm->context) {
+      llvm->context = LLVMContextCreate();
+      llvm->context_owned = true;
+   }
    if (!llvm->context)
       goto fail;
 
@@ -517,7 +521,8 @@ fail:
 void
 draw_llvm_destroy(struct draw_llvm *llvm)
 {
-   LLVMContextDispose(llvm->context);
+   if (llvm->context_owned)
+      LLVMContextDispose(llvm->context);
    llvm->context = NULL;
 
    /* XXX free other draw_llvm data? */
index a4bd1edcf0d38caa43f6ad8e429edca8c83d95d7..54a7da2d02c7b6485101b65a201e1db5870a1f57 100644 (file)
@@ -462,6 +462,7 @@ struct draw_llvm {
    struct draw_context *draw;
 
    LLVMContextRef context;
+   boolean context_owned;
 
    struct draw_jit_context jit_context;
    struct draw_gs_jit_context gs_jit_context;
@@ -490,7 +491,7 @@ llvm_geometry_shader(struct draw_geometry_shader *gs)
 
 
 struct draw_llvm *
-draw_llvm_create(struct draw_context *draw);
+draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context);
 
 void
 draw_llvm_destroy(struct draw_llvm *llvm);
index 3a9b4c22a9b44ab10a36e603ec0756672b27ba64..37b1ff4ed1b3580c7062a2060e87bcdeb4da87a1 100644 (file)
@@ -171,7 +171,8 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
    /*
     * Create drawing context and plug our rendering stage into it.
     */
-   llvmpipe->draw = draw_create(&llvmpipe->pipe);
+   llvmpipe->draw = draw_create_with_llvm_context(&llvmpipe->pipe,
+                                                  llvmpipe->context);
    if (!llvmpipe->draw)
       goto fail;