draw/llvm: reduce memory usage
authorZack Rusin <zackr@vmware.com>
Wed, 23 Apr 2014 21:06:13 +0000 (17:06 -0400)
committerZack Rusin <zackr@vmware.com>
Thu, 24 Apr 2014 17:59:24 +0000 (13:59 -0400)
Lets make draw_get_option_use_llvm function available unconditionally
and use it to avoid useless allocations when LLVM paths are active.
TGSI machine is never used when we're using LLVM.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_context.h
src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/draw/draw_vs.c
src/gallium/auxiliary/draw/draw_vs_exec.c

index 0a678790f134d2af7d931bde6a339283086657a5..ddc305b3b8d3c9457199390912c1dc210385f94a 100644 (file)
@@ -68,6 +68,12 @@ draw_get_option_use_llvm(void)
    }
    return value;
 }
+#else
+boolean
+draw_get_option_use_llvm(void)
+{
+   return FALSE;
+}
 #endif
 
 
index f114f503546f2b2737dbcdf0dfa57228dcf26011..48549fe200e2cea59b86859cdd8a01b356ed18f8 100644 (file)
@@ -288,9 +288,7 @@ draw_get_shader_param(unsigned shader, enum pipe_shader_cap param);
 int
 draw_get_shader_param_no_llvm(unsigned shader, enum pipe_shader_cap param);
 
-#ifdef HAVE_LLVM
 boolean
 draw_get_option_use_llvm(void);
-#endif
 
 #endif /* DRAW_CONTEXT_H */
index 7de5e0308ec6cbc2fd26af865821c78b251206bd..5e503fff76a6153260409911892e3c943de98666 100644 (file)
@@ -674,11 +674,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
 void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
                                   struct draw_context *draw)
 {
-#ifdef HAVE_LLVM
    boolean use_llvm = draw_get_option_use_llvm();
-#else
-   boolean use_llvm = FALSE;
-#endif
    if (!use_llvm && shader && shader->machine->Tokens != shader->state.tokens) {
       tgsi_exec_machine_bind_shader(shader->machine,
                                     shader->state.tokens,
@@ -690,16 +686,18 @@ void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
 boolean
 draw_gs_init( struct draw_context *draw )
 {
-   draw->gs.tgsi.machine = tgsi_exec_machine_create();
-   if (!draw->gs.tgsi.machine)
-      return FALSE;
-
-   draw->gs.tgsi.machine->Primitives = align_malloc(
-      MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector), 16);
-   if (!draw->gs.tgsi.machine->Primitives)
-      return FALSE;
-   memset(draw->gs.tgsi.machine->Primitives, 0,
-          MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector));
+   if (!draw_get_option_use_llvm()) {
+      draw->gs.tgsi.machine = tgsi_exec_machine_create();
+      if (!draw->gs.tgsi.machine)
+         return FALSE;
+
+      draw->gs.tgsi.machine->Primitives = align_malloc(
+         MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector), 16);
+      if (!draw->gs.tgsi.machine->Primitives)
+         return FALSE;
+      memset(draw->gs.tgsi.machine->Primitives, 0,
+             MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector));
+   }
 
    return TRUE;
 }
index 55cbeb9203d4e90165f0e21421e75a3bb59a3b33..eb7f4e0967c32ffa8c3d773ca646df7027679794 100644 (file)
@@ -149,9 +149,11 @@ draw_vs_init( struct draw_context *draw )
 {
    draw->dump_vs = debug_get_option_gallium_dump_vs();
 
-   draw->vs.tgsi.machine = tgsi_exec_machine_create();
-   if (!draw->vs.tgsi.machine)
-      return FALSE;
+   if (!draw_get_option_use_llvm()) {
+      draw->vs.tgsi.machine = tgsi_exec_machine_create();
+      if (!draw->vs.tgsi.machine)
+         return FALSE;
+   }
 
    draw->vs.emit_cache = translate_cache_create();
    if (!draw->vs.emit_cache) 
@@ -173,7 +175,8 @@ draw_vs_destroy( struct draw_context *draw )
    if (draw->vs.emit_cache)
       translate_cache_destroy(draw->vs.emit_cache);
 
-   tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
+   if (!draw_get_option_use_llvm())
+      tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
 }
 
 
index 133b116a49cf22fd547d998fb07146f83274e388..6a18d8c46bdc57924f7734e14b2c68932a985d1d 100644 (file)
@@ -63,6 +63,7 @@ vs_exec_prepare( struct draw_vertex_shader *shader,
 {
    struct exec_vertex_shader *evs = exec_vertex_shader(shader);
 
+   debug_assert(!draw_get_option_use_llvm());
    /* Specify the vertex program to interpret/execute.
     * Avoid rebinding when possible.
     */
@@ -96,6 +97,7 @@ vs_exec_run_linear( struct draw_vertex_shader *shader,
    unsigned slot;
    boolean clamp_vertex_color = shader->draw->rasterizer->clamp_vertex_color;
 
+   debug_assert(!draw_get_option_use_llvm());
    tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS,
                                   constants, const_size);