From 08dd41fd6899bd6b3289d30dc31f8b2998406889 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sun, 23 Aug 2009 05:52:20 +0100 Subject: [PATCH] llvmpipe: Centralize the C <-> JIT interfaces in one place. --- src/gallium/drivers/llvmpipe/Makefile | 1 + src/gallium/drivers/llvmpipe/SConscript | 1 + src/gallium/drivers/llvmpipe/lp_jit.c | 77 ++++++++++++++++++++++ src/gallium/drivers/llvmpipe/lp_jit.h | 67 +++++++++++++++++++ src/gallium/drivers/llvmpipe/lp_screen.c | 30 +-------- src/gallium/drivers/llvmpipe/lp_state.h | 16 +---- src/gallium/drivers/llvmpipe/lp_state_fs.c | 4 +- 7 files changed, 153 insertions(+), 43 deletions(-) create mode 100644 src/gallium/drivers/llvmpipe/lp_jit.c create mode 100644 src/gallium/drivers/llvmpipe/lp_jit.h diff --git a/src/gallium/drivers/llvmpipe/Makefile b/src/gallium/drivers/llvmpipe/Makefile index 9290720aaf0..5603f06b390 100644 --- a/src/gallium/drivers/llvmpipe/Makefile +++ b/src/gallium/drivers/llvmpipe/Makefile @@ -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 \ diff --git a/src/gallium/drivers/llvmpipe/SConscript b/src/gallium/drivers/llvmpipe/SConscript index 4161edb5cf8..ed23660a688 100644 --- a/src/gallium/drivers/llvmpipe/SConscript +++ b/src/gallium/drivers/llvmpipe/SConscript @@ -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 index 00000000000..c3ba03a5a18 --- /dev/null +++ b/src/gallium/drivers/llvmpipe/lp_jit.c @@ -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 + */ + + +#include + +#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 index 00000000000..03ab268d0cf --- /dev/null +++ b/src/gallium/drivers/llvmpipe/lp_jit.h @@ -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 + */ + +#ifndef LP_JIT_H +#define LP_JIT_H + + +#include + + +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 */ diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 750573a4a9a..f302b99ad76 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -26,8 +26,6 @@ **************************************************************************/ -#include - #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; } diff --git a/src/gallium/drivers/llvmpipe/lp_state.h b/src/gallium/drivers/llvmpipe/lp_state.h index 2b1f2e452db..fb10329887d 100644 --- a/src/gallium/drivers/llvmpipe/lp_state.h +++ b/src/gallium/drivers/llvmpipe/lp_state.h @@ -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; }; diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index cf0a90bc18a..f77b488e6d1 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -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); -- 2.30.2