llvmpipe: Centralize the C <-> JIT interfaces in one place.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 23 Aug 2009 04:52:20 +0000 (05:52 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:41 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/Makefile
src/gallium/drivers/llvmpipe/SConscript
src/gallium/drivers/llvmpipe/lp_jit.c [new file with mode: 0644]
src/gallium/drivers/llvmpipe/lp_jit.h [new file with mode: 0644]
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/llvmpipe/lp_state.h
src/gallium/drivers/llvmpipe/lp_state_fs.c

index 9290720aaf0c3cd338caefab8dddc152eb45ebae..5603f06b3907f92272a9f31d5f317997edec2594 100644 (file)
@@ -27,6 +27,7 @@ C_SOURCES = \
        lp_context.c \
        lp_draw_arrays.c \
        lp_flush.c \
+       lp_jit.c \
        lp_prim_setup.c \
        lp_prim_vbuf.c \
        lp_setup.c \
index 4161edb5cf8810a0d8844cec1728e2d7824cf51e..ed23660a688c9509d73cdb5c9327ffd40db46153 100644 (file)
@@ -31,6 +31,7 @@ llvmpipe = env.ConvenienceLibrary(
                'lp_context.c',
                'lp_draw_arrays.c',
                'lp_flush.c',
+               'lp_jit.c',
                'lp_prim_setup.c',
                'lp_prim_vbuf.c',
                'lp_setup.c',
diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c
new file mode 100644 (file)
index 0000000..c3ba03a
--- /dev/null
@@ -0,0 +1,77 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * C - JIT interfaces
+ *
+ * @author Jose Fonseca <jfonseca@vmware.com>
+ */
+
+
+#include <llvm-c/Transforms/Scalar.h>
+
+#include "lp_screen.h"
+#include "lp_jit.h"
+
+
+void
+lp_jit_screen_cleanup(struct llvmpipe_screen *screen)
+{
+   if(screen->engine)
+      LLVMDisposeExecutionEngine(screen->engine);
+
+   if(screen->pass)
+      LLVMDisposePassManager(screen->pass);
+}
+
+
+void
+lp_jit_screen_init(struct llvmpipe_screen *screen)
+{
+   char *error = NULL;
+
+   screen->module = LLVMModuleCreateWithName("llvmpipe");
+
+   screen->provider = LLVMCreateModuleProviderForExistingModule(screen->module);
+
+   if (LLVMCreateJITCompiler(&screen->engine, screen->provider, 1, &error)) {
+      fprintf(stderr, "%s\n", error);
+      LLVMDisposeMessage(error);
+      abort();
+   }
+
+   screen->pass = LLVMCreateFunctionPassManager(screen->provider);
+   LLVMAddTargetData(LLVMGetExecutionEngineTargetData(screen->engine), screen->pass);
+   /* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
+    * but there are more on SVN. */
+   LLVMAddConstantPropagationPass(screen->pass);
+   LLVMAddInstructionCombiningPass(screen->pass);
+   LLVMAddPromoteMemoryToRegisterPass(screen->pass);
+   LLVMAddGVNPass(screen->pass);
+   LLVMAddCFGSimplificationPass(screen->pass);
+}
diff --git a/src/gallium/drivers/llvmpipe/lp_jit.h b/src/gallium/drivers/llvmpipe/lp_jit.h
new file mode 100644 (file)
index 0000000..03ab268
--- /dev/null
@@ -0,0 +1,67 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * C - JIT interfaces
+ *
+ * @author Jose Fonseca <jfonseca@vmware.com>
+ */
+
+#ifndef LP_JIT_H
+#define LP_JIT_H
+
+
+#include <llvm-c/Core.h>
+
+
+struct tgsi_sampler;
+struct llvmpipe_screen;
+
+
+typedef void
+(*lp_jit_frag_func)(uint32_t x,
+                    uint32_t y,
+                    const void *a0,
+                    const void *dadx,
+                    const void *dady,
+                    const void *consts,
+                    uint32_t *mask,
+                    void *color,
+                    void *depth,
+                    struct tgsi_sampler **samplers);
+
+
+void
+lp_jit_screen_cleanup(struct llvmpipe_screen *screen);
+
+
+void
+lp_jit_screen_init(struct llvmpipe_screen *screen);
+
+
+#endif /* LP_JIT_H */
index 750573a4a9a327773843cbc256d860cef514fbe4..f302b99ad769beedbe873ecba304d9d067d22a4e 100644 (file)
@@ -26,8 +26,6 @@
  **************************************************************************/
 
 
-#include <llvm-c/Transforms/Scalar.h>
-
 #include "util/u_memory.h"
 #include "util/u_simple_screen.h"
 #include "pipe/internal/p_winsys_screen.h"
@@ -36,6 +34,7 @@
 
 #include "lp_texture.h"
 #include "lp_winsys.h"
+#include "lp_jit.h"
 #include "lp_screen.h"
 
 
@@ -162,11 +161,7 @@ llvmpipe_destroy_screen( struct pipe_screen *_screen )
 
    struct pipe_winsys *winsys = _screen->winsys;
 
-   if(screen->engine)
-      LLVMDisposeExecutionEngine(screen->engine);
-
-   if(screen->pass)
-      LLVMDisposePassManager(screen->pass);
+   lp_jit_screen_cleanup(screen);
 
    if(winsys->destroy)
       winsys->destroy(winsys);
@@ -184,7 +179,6 @@ struct pipe_screen *
 llvmpipe_create_screen(struct pipe_winsys *winsys)
 {
    struct llvmpipe_screen *screen = CALLOC_STRUCT(llvmpipe_screen);
-   char *error = NULL;
 
    if (!screen)
       return NULL;
@@ -202,25 +196,7 @@ llvmpipe_create_screen(struct pipe_winsys *winsys)
    llvmpipe_init_screen_texture_funcs(&screen->base);
    u_simple_screen_init(&screen->base);
 
-   screen->module = LLVMModuleCreateWithName("llvmpipe");
-
-   screen->provider = LLVMCreateModuleProviderForExistingModule(screen->module);
-
-   if (LLVMCreateJITCompiler(&screen->engine, screen->provider, 1, &error)) {
-      fprintf(stderr, "%s\n", error);
-      LLVMDisposeMessage(error);
-      abort();
-   }
-
-   screen->pass = LLVMCreateFunctionPassManager(screen->provider);
-   LLVMAddTargetData(LLVMGetExecutionEngineTargetData(screen->engine), screen->pass);
-   /* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
-    * but there are more on SVN. */
-   LLVMAddConstantPropagationPass(screen->pass);
-   LLVMAddInstructionCombiningPass(screen->pass);
-   LLVMAddPromoteMemoryToRegisterPass(screen->pass);
-   LLVMAddGVNPass(screen->pass);
-   LLVMAddCFGSimplificationPass(screen->pass);
+   lp_jit_screen_init(screen);
 
    return &screen->base;
 }
index 2b1f2e452db6dbacc1017512c01b6358397a0f9e..fb10329887df9e0faf745245a69400c5746be080 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "pipe/p_state.h"
 #include "tgsi/tgsi_scan.h"
+#include "lp_jit.h"
 
 
 #define LP_NEW_VIEWPORT      0x1
@@ -58,19 +59,6 @@ struct tgsi_sampler;
 struct vertex_info;
 
 
-typedef void
-(*lp_shader_fs_func)(uint32_t x,
-                     uint32_t y,
-                     const void *a0,
-                     const void *dadx,
-                     const void *dady,
-                     const void *consts,
-                     uint32_t *mask,
-                     void *color,
-                     void *depth,
-                     struct tgsi_sampler **samplers);
-
-
 struct lp_fragment_shader;
 
 
@@ -90,7 +78,7 @@ struct lp_fragment_shader_variant
 
    LLVMValueRef function;
 
-   lp_shader_fs_func jit_function;
+   lp_jit_frag_func jit_function;
 
    struct lp_fragment_shader_variant *next;
 };
index cf0a90bc18a46e55c875cd59f8047e605de16735..f77b488e6d19fbd7e4655c4b6636d5d759a1be64 100644 (file)
@@ -453,7 +453,7 @@ generate_fragment(struct llvmpipe_context *lp,
 
    /* 
     * Generate the function prototype. Any change here must be reflected in
-    * lp_state.h's lp_shader_fs_func function pointer type, and vice-versa.
+    * lp_jit.h's lp_jit_frag_func function pointer type, and vice-versa.
     */
 
    fs_elem_type = lp_build_elem_type(fs_type);
@@ -604,7 +604,7 @@ generate_fragment(struct llvmpipe_context *lp,
       }
    }
 
-   variant->jit_function = (lp_shader_fs_func)LLVMGetPointerToGlobal(screen->engine, variant->function);
+   variant->jit_function = (lp_jit_frag_func)LLVMGetPointerToGlobal(screen->engine, variant->function);
 
 #ifdef DEBUG
    lp_disassemble(variant->jit_function);