[Mesa-dev] [PATCH 11/15] gallivm: Refactor identical code out of lp_bld_tgsi_{aos, soa}.c

Tom Stellard tstellar at gmail.com
Fri Dec 9 14:16:03 PST 2011


The code to create and add the list of tgsi instructions is now in
lp_bld_tgsi.c.
---
 src/gallium/auxiliary/Makefile.sources          |    1 +
 src/gallium/auxiliary/gallivm/lp_bld_tgsi.c     |   71 +++++++++++++++++++++++
 src/gallium/auxiliary/gallivm/lp_bld_tgsi.h     |   19 +++++-
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c |   36 ++----------
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c |   37 ++----------
 5 files changed, 99 insertions(+), 65 deletions(-)
 create mode 100644 src/gallium/auxiliary/gallivm/lp_bld_tgsi.c

diff --git a/src/gallium/auxiliary/Makefile.sources b/src/gallium/auxiliary/Makefile.sources
index d40b954..eb4f2d5 100644
--- a/src/gallium/auxiliary/Makefile.sources
+++ b/src/gallium/auxiliary/Makefile.sources
@@ -175,6 +175,7 @@ GALLIVM_SOURCES := \
         gallivm/lp_bld_sample_soa.c \
         gallivm/lp_bld_struct.c \
         gallivm/lp_bld_swizzle.c \
+	gallivm/lp_bld_tgsi.c \
         gallivm/lp_bld_tgsi_aos.c \
         gallivm/lp_bld_tgsi_info.c \
         gallivm/lp_bld_tgsi_soa.c \
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
new file mode 100644
index 0000000..5a7c5ac
--- /dev/null
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
@@ -0,0 +1,71 @@
+/**************************************************************************
+ *
+ * Copyright 2010 VMware, Inc.
+ * Copyright 2009 VMware, Inc.
+ * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+#include "gallivm/lp_bld_tgsi.h"
+#include "tgsi/tgsi_parse.h"
+#include "util/u_memory.h"
+
+/* The user is responsible for freeing list->instructions */
+unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_inst_list * list)
+{
+   list->instructions = (struct tgsi_full_instruction *)
+         MALLOC( LP_MAX_INSTRUCTIONS * sizeof(struct tgsi_full_instruction) );
+   if (!list->instructions) {
+      return 0;
+   }
+   list->max_instructions = LP_MAX_INSTRUCTIONS;
+   return 1;
+}
+
+
+unsigned lp_bld_tgsi_add_instruction(
+   struct lp_build_tgsi_inst_list * list,
+   struct tgsi_full_instruction *inst_to_add)
+{
+
+   if (list->num_instructions == list->max_instructions) {
+      struct tgsi_full_instruction *instructions;
+      instructions = REALLOC(list->instructions, list->max_instructions
+                                      * sizeof(struct tgsi_full_instruction),
+                                      (list->max_instructions + LP_MAX_INSTRUCTIONS)
+                                      * sizeof(struct tgsi_full_instruction));
+      if (!instructions) {
+         return 0;
+      }
+      list->instructions = instructions;
+      list->max_instructions += LP_MAX_INSTRUCTIONS;
+   }
+   memcpy(list->instructions + list->num_instructions, inst_to_add,
+          sizeof(list->instructions[0]));
+
+   list->num_instructions++;
+
+   return 1;
+}
+
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
index e8b73e5..ec366ca 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
@@ -253,6 +253,19 @@ struct lp_exec_mask {
    LLVMValueRef exec_mask;
 };
 
+struct lp_build_tgsi_inst_list
+{
+   struct tgsi_full_instruction *instructions;
+   uint max_instructions;
+   uint num_instructions;
+};
+
+unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_inst_list * list);
+
+
+unsigned lp_bld_tgsi_add_instruction(
+   struct lp_build_tgsi_inst_list * list,
+   struct tgsi_full_instruction *inst_to_add);
 
 struct lp_build_tgsi_soa_context
 {
@@ -303,8 +316,7 @@ struct lp_build_tgsi_soa_context
    struct lp_build_mask_context *mask;
    struct lp_exec_mask exec_mask;
 
-   struct tgsi_full_instruction *instructions;
-   uint max_instructions;
+   struct lp_build_tgsi_inst_list inst_list;
 
    /* Allow the user to store data in this structure rather than passing it
     * to every function. */
@@ -390,8 +402,7 @@ struct lp_build_tgsi_aos_context
    /** bitmask indicating which register files are accessed indirectly */
    unsigned indirect_files;
 
-   struct tgsi_full_instruction *instructions;
-   uint max_instructions;
+   struct lp_build_tgsi_inst_list inst_list;
 
    /* Allow the user to store data in this structure rather than passing it
     * to every function. */
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
index bf623ca..5f88eca 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c
@@ -1016,7 +1016,6 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm,
    struct lp_build_tgsi_aos_context bld;
    struct tgsi_parse_context parse;
    uint num_immediates = 0;
-   uint num_instructions = 0;
    unsigned chan;
    int pc = 0;
 
@@ -1036,12 +1035,9 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm,
    bld.sampler = sampler;
    bld.indirect_files = info->indirect_files;
    bld.emit_fetch_switch_file_fn = emit_fetch_switch_file;
-   bld.instructions = (struct tgsi_full_instruction *)
-                      MALLOC(LP_MAX_INSTRUCTIONS * sizeof(struct tgsi_full_instruction));
-   bld.max_instructions = LP_MAX_INSTRUCTIONS;
    bld.emit_swizzle = swizzle_aos;
 
-   if (!bld.instructions) {
+   if (!lp_bld_tgsi_list_init(&bld.inst_list)) {
       return;
    }
 
@@ -1057,29 +1053,9 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm,
          break;
 
       case TGSI_TOKEN_TYPE_INSTRUCTION:
-         {
-            /* save expanded instruction */
-            if (num_instructions == bld.max_instructions) {
-               struct tgsi_full_instruction *instructions;
-               instructions = REALLOC(bld.instructions,
-                                      bld.max_instructions
-                                      * sizeof(struct tgsi_full_instruction),
-                                      (bld.max_instructions + LP_MAX_INSTRUCTIONS)
-                                      * sizeof(struct tgsi_full_instruction));
-               if (!instructions) {
-                  break;
-               }
-               bld.instructions = instructions;
-               bld.max_instructions += LP_MAX_INSTRUCTIONS;
-            }
-
-            memcpy(bld.instructions + num_instructions,
-                   &parse.FullToken.FullInstruction,
-                   sizeof(bld.instructions[0]));
-
-            num_instructions++;
-         }
-
+         /* save expanded instruction */
+         lp_bld_tgsi_add_instruction(&bld.inst_list,
+                                     &parse.FullToken.FullInstruction);
          break;
 
       case TGSI_TOKEN_TYPE_IMMEDIATE:
@@ -1113,7 +1089,7 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm,
    }
 
    while (pc != -1) {
-      struct tgsi_full_instruction *instr = bld.instructions + pc;
+      struct tgsi_full_instruction *instr = bld.inst_list.instructions + pc;
       const struct tgsi_opcode_info *opcode_info =
          tgsi_get_opcode_info(instr->Instruction.Opcode);
       if (!lp_emit_instruction_aos(&bld, instr, opcode_info, &pc))
@@ -1137,6 +1113,6 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm,
       LLVMDumpModule(module);
    }
 
-   FREE(bld.instructions);
+   FREE(bld.inst_list.instructions);
 }
 
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index f504fed..93968e7 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -1080,7 +1080,7 @@ near_end_of_shader(struct lp_build_tgsi_soa_context *bld,
       if (pc + i >= bld->info->num_instructions)
 	 return TRUE;
 
-      opcode = bld->instructions[pc + i].Instruction.Opcode;
+      opcode = bld->inst_list.instructions[pc + i].Instruction.Opcode;
 
       if (opcode == TGSI_OPCODE_END)
 	 return TRUE;
@@ -2266,7 +2266,6 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
    struct lp_build_tgsi_soa_context bld;
    struct tgsi_parse_context parse;
    uint num_immediates = 0;
-   uint num_instructions = 0;
    unsigned i;
    int pc = 0;
 
@@ -2292,11 +2291,8 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
    bld.info = info;
    bld.indirect_files = info->indirect_files;
    bld.emit_fetch_switch_file_fn = emit_fetch_switch_file;
-   bld.instructions = (struct tgsi_full_instruction *)
-                      MALLOC( LP_MAX_INSTRUCTIONS * sizeof(struct tgsi_full_instruction) );
-   bld.max_instructions = LP_MAX_INSTRUCTIONS;
 
-   if (!bld.instructions) {
+   if (!lp_bld_tgsi_list_init(&bld.inst_list)) {
       return;
    }
 
@@ -2361,29 +2357,8 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
          break;
 
       case TGSI_TOKEN_TYPE_INSTRUCTION:
-         {
-            /* save expanded instruction */
-            if (num_instructions == bld.max_instructions) {
-               struct tgsi_full_instruction *instructions;
-               instructions = REALLOC(bld.instructions,
-                                      bld.max_instructions
-                                      * sizeof(struct tgsi_full_instruction),
-                                      (bld.max_instructions + LP_MAX_INSTRUCTIONS)
-                                      * sizeof(struct tgsi_full_instruction));
-               if (!instructions) {
-                  break;
-               }
-               bld.instructions = instructions;
-               bld.max_instructions += LP_MAX_INSTRUCTIONS;
-            }
-
-            memcpy(bld.instructions + num_instructions,
-                   &parse.FullToken.FullInstruction,
-                   sizeof(bld.instructions[0]));
-
-            num_instructions++;
-         }
-
+         lp_bld_tgsi_add_instruction(&bld.inst_list,
+                                     &parse.FullToken.FullInstruction);
          break;
 
       case TGSI_TOKEN_TYPE_IMMEDIATE:
@@ -2410,7 +2385,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
    }
 
    while (pc != -1) {
-      struct tgsi_full_instruction *instr = bld.instructions + pc;
+      struct tgsi_full_instruction *instr = bld.inst_list.instructions + pc;
       const struct tgsi_opcode_info *opcode_info =
          tgsi_get_opcode_info(instr->Instruction.Opcode);
       if (!lp_emit_instruction_soa( &bld, instr, opcode_info, &pc ))
@@ -2447,7 +2422,7 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm,
 
    }
 
-   FREE( bld.instructions );
+   FREE( bld.inst_list.instructions );
 }
 
 
-- 
1.7.6.4



More information about the mesa-dev mailing list