llvmpipe: Pre-declare fetch_texel.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 23 Aug 2009 06:55:29 +0000 (07:55 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:41 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/lp_bld_intr.c
src/gallium/drivers/llvmpipe/lp_bld_intr.h
src/gallium/drivers/llvmpipe/lp_bld_tgsi.h
src/gallium/drivers/llvmpipe/lp_jit.c
src/gallium/drivers/llvmpipe/lp_state_fs.c

index 42fd57fdf05285a9a6bb255fe785fa6590e5eaf2..9895749d5686978930db5537b2cf0e7be64b0d38 100644 (file)
 #include "lp_bld_intr.h"
 
 
+LLVMValueRef
+lp_declare_intrinsic(LLVMModuleRef module,
+                     const char *name,
+                     LLVMTypeRef ret_type,
+                     LLVMTypeRef *arg_types,
+                     unsigned num_args)
+{
+   LLVMTypeRef function_type;
+   LLVMValueRef function;
+
+   assert(!LLVMGetNamedFunction(module, name));
+
+   function_type = LLVMFunctionType(ret_type, arg_types, num_args, 0);
+   function = LLVMAddFunction(module, name, function_type);
+
+   LLVMSetFunctionCallConv(function, LLVMCCallConv);
+   LLVMSetLinkage(function, LLVMExternalLinkage);
+
+   assert(LLVMIsDeclaration(function));
+
+   if(name[0] == 'l' &&
+      name[1] == 'l' &&
+      name[2] == 'v' &&
+      name[3] == 'm' &&
+      name[4] == '.')
+      assert(LLVMGetIntrinsicID(function));
+
+   return function;
+}
+
+
 LLVMValueRef
 lp_build_intrinsic(LLVMBuilderRef builder,
                    const char *name,
@@ -59,28 +90,20 @@ lp_build_intrinsic(LLVMBuilderRef builder,
    LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
    LLVMValueRef function;
 
-   assert(num_args <= LP_MAX_FUNC_ARGS);
-
    function = LLVMGetNamedFunction(module, name);
    if(!function) {
       LLVMTypeRef arg_types[LP_MAX_FUNC_ARGS];
       unsigned i;
+
+      assert(num_args <= LP_MAX_FUNC_ARGS);
+
       for(i = 0; i < num_args; ++i) {
          assert(args[i]);
          arg_types[i] = LLVMTypeOf(args[i]);
       }
-      function = LLVMAddFunction(module, name, LLVMFunctionType(ret_type, arg_types, num_args, 0));
-      LLVMSetFunctionCallConv(function, LLVMCCallConv);
-      LLVMSetLinkage(function, LLVMExternalLinkage);
-   }
-   assert(LLVMIsDeclaration(function));
 
-   if(name[0] == 'l' &&
-      name[1] == 'l' &&
-      name[2] == 'v' &&
-      name[3] == 'm' &&
-      name[4] == '.')
-      assert(LLVMGetIntrinsicID(function));
+      function = lp_declare_intrinsic(module, name, ret_type, arg_types, num_args);
+   }
 
    return LLVMBuildCall(builder, function, args, num_args, "");
 }
index 3608988dc47f3a34d77a29ab8175e67dd65728dd..f813f27074b922f8a2dd2c27b1a030b12920f125 100644 (file)
 #define LP_MAX_FUNC_ARGS 32
 
 
+LLVMValueRef
+lp_declare_intrinsic(LLVMModuleRef module,
+                     const char *name,
+                     LLVMTypeRef ret_type,
+                     LLVMTypeRef *arg_types,
+                     unsigned num_args);
+
 LLVMValueRef
 lp_build_intrinsic(LLVMBuilderRef builder,
                    const char *name,
index 8aaf494d2b2387fa437c0bd4798cc7023d4cba7f..86380a1dcaa3803eafca670c5c7f7935cc320126 100644 (file)
@@ -39,6 +39,7 @@
 
 
 struct tgsi_token;
+struct tgsi_sampler;
 union lp_type;
 struct lp_build_context;
 struct lp_build_mask_context;
index 0a32c41a6fa9cc2c55c5ece15b3b50090c11191e..39c4df836334fd2312e16cc6f44e073930d3090b 100644 (file)
 
 #include "util/u_memory.h"
 #include "lp_screen.h"
+#include "lp_bld_intr.h"
+#include "lp_bld_tgsi.h" /* for lp_build_tgsi_fetch_texel_soa */
 #include "lp_jit.h"
 
 
 static void
-lp_jit_init_types(struct llvmpipe_screen *screen)
+lp_jit_init_globals(struct llvmpipe_screen *screen)
 {
    /* struct lp_jit_context */
    {
@@ -71,6 +73,24 @@ lp_jit_init_types(struct llvmpipe_screen *screen)
       screen->context_ptr_type = LLVMPointerType(context_type, 0);
    }
 
+   /* fetch_texel
+    */
+   {
+      LLVMTypeRef ret_type;
+      LLVMTypeRef arg_types[3];
+      LLVMValueRef fetch_texel;
+
+      ret_type = LLVMVoidType();
+      arg_types[0] = LLVMPointerType(LLVMInt8Type(), 0);  /* samplers */
+      arg_types[1] = LLVMInt32Type();                     /* unit */
+      arg_types[2] = LLVMPointerType(LLVMVectorType(LLVMFloatType(), 4), 0); /* store */
+
+      fetch_texel = lp_declare_intrinsic(screen->module, "fetch_texel",
+                                         ret_type, arg_types, Elements(arg_types));
+
+      LLVMAddGlobalMapping(screen->engine, fetch_texel, lp_build_tgsi_fetch_texel_soa);
+   }
+
 #ifdef DEBUG
    LLVMDumpModule(screen->module);
 #endif
@@ -115,5 +135,5 @@ lp_jit_screen_init(struct llvmpipe_screen *screen)
    LLVMAddGVNPass(screen->pass);
    LLVMAddCFGSimplificationPass(screen->pass);
 
-   lp_jit_init_types(screen);
+   lp_jit_init_globals(screen);
 }
index eea332e3e48bdf50862ef84e6791a9452a3bb219..e639f9c20fc06ea19d99542614fb44ca756f322c 100644 (file)
@@ -404,7 +404,6 @@ generate_fragment(struct llvmpipe_context *lp,
    LLVMValueRef fs_out_color[NUM_CHANNELS][LP_MAX_VECTOR_LENGTH];
    LLVMValueRef blend_mask;
    LLVMValueRef blend_in_color[NUM_CHANNELS];
-   LLVMValueRef fetch_texel;
    unsigned num_fs;
    unsigned i;
    unsigned chan;
@@ -592,18 +591,6 @@ generate_fragment(struct llvmpipe_context *lp,
       abort();
    }
 
-   /* Tell where the fetch_texel function is, if the shader refers to it.
-    * TODO: this should be done elsewhere.
-    */
-   fetch_texel = LLVMGetNamedFunction(screen->module, "fetch_texel");
-   if(fetch_texel) {
-      static boolean first_time = TRUE;
-      if(first_time) {
-         LLVMAddGlobalMapping(screen->engine, fetch_texel, lp_build_tgsi_fetch_texel_soa);
-         first_time = FALSE;
-      }
-   }
-
    variant->jit_function = (lp_jit_frag_func)LLVMGetPointerToGlobal(screen->engine, variant->function);
 
 #ifdef DEBUG