llvmpipe: Make the code portable for MinGW.
[mesa.git] / src / gallium / drivers / llvmpipe / lp_jit.c
index 92d5d43d0ccdba7c5d4aa2effc882f1771d525cb..b4a22ff4a97bcdae7cc23f2cc0836427588ce80f 100644 (file)
 
 #include "util/u_memory.h"
 #include "lp_screen.h"
+#include "lp_bld_intr.h"
 #include "lp_jit.h"
 
 
 static void
-lp_jit_init_types(struct llvmpipe_screen *screen)
+lp_jit_init_globals(struct llvmpipe_screen *screen)
 {
+   LLVMTypeRef texture_type;
+
+   /* struct lp_jit_texture */
+   {
+      LLVMTypeRef elem_types[4];
+
+      elem_types[LP_JIT_TEXTURE_WIDTH]  = LLVMInt32Type();
+      elem_types[LP_JIT_TEXTURE_HEIGHT] = LLVMInt32Type();
+      elem_types[LP_JIT_TEXTURE_STRIDE] = LLVMInt32Type();
+      elem_types[LP_JIT_TEXTURE_DATA]   = LLVMPointerType(LLVMInt8Type(), 0);
+
+      texture_type = LLVMStructType(elem_types, Elements(elem_types), 0);
+
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, width,
+                             screen->target, texture_type,
+                             LP_JIT_TEXTURE_WIDTH);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, height,
+                             screen->target, texture_type,
+                             LP_JIT_TEXTURE_HEIGHT);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, stride,
+                             screen->target, texture_type,
+                             LP_JIT_TEXTURE_STRIDE);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, data,
+                             screen->target, texture_type,
+                             LP_JIT_TEXTURE_DATA);
+      LP_CHECK_STRUCT_SIZE(struct lp_jit_texture,
+                           screen->target, texture_type);
+
+      LLVMAddTypeName(screen->module, "texture", texture_type);
+   }
+
    /* struct lp_jit_context */
    {
-      LLVMTypeRef elem_types[2];
+      LLVMTypeRef elem_types[5];
       LLVMTypeRef context_type;
 
       elem_types[0] = LLVMPointerType(LLVMFloatType(), 0); /* constants */
       elem_types[1] = LLVMPointerType(LLVMInt8Type(), 0);  /* samplers */
+      elem_types[2] = LLVMFloatType();                     /* alpha_ref_value */
+      elem_types[3] = LLVMPointerType(LLVMInt8Type(), 0);  /* blend_color */
+      elem_types[4] = LLVMArrayType(texture_type, PIPE_MAX_SAMPLERS); /* textures */
 
       context_type = LLVMStructType(elem_types, Elements(elem_types), 0);
 
@@ -57,6 +92,13 @@ lp_jit_init_types(struct llvmpipe_screen *screen)
                              screen->target, context_type, 0);
       LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, samplers,
                              screen->target, context_type, 1);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, alpha_ref_value,
+                             screen->target, context_type, 2);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, blend_color,
+                             screen->target, context_type, 3);
+      LP_CHECK_MEMBER_OFFSET(struct lp_jit_context, textures,
+                             screen->target, context_type,
+                             LP_JIT_CONTEXT_TEXTURES_INDEX);
       LP_CHECK_STRUCT_SIZE(struct lp_jit_context,
                            screen->target, context_type);
 
@@ -65,6 +107,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_fetch_texel_soa);
+   }
+
 #ifdef DEBUG
    LLVMDumpModule(screen->module);
 #endif
@@ -92,7 +152,7 @@ lp_jit_screen_init(struct llvmpipe_screen *screen)
    screen->provider = LLVMCreateModuleProviderForExistingModule(screen->module);
 
    if (LLVMCreateJITCompiler(&screen->engine, screen->provider, 1, &error)) {
-      fprintf(stderr, "%s\n", error);
+      _debug_printf("%s\n", error);
       LLVMDisposeMessage(error);
       abort();
    }
@@ -109,5 +169,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);
 }