Browse Source

llvmpipe: Pre-declare fetch_texel.

tags/mesa_7_6_rc1
José Fonseca 16 years ago
parent
commit
03180dca7a

+ 36
- 13
src/gallium/drivers/llvmpipe/lp_bld_intr.c View File

@@ -49,6 +49,37 @@
#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, "");
}

+ 7
- 0
src/gallium/drivers/llvmpipe/lp_bld_intr.h View File

@@ -46,6 +46,13 @@
#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,

+ 1
- 0
src/gallium/drivers/llvmpipe/lp_bld_tgsi.h View File

@@ -39,6 +39,7 @@


struct tgsi_token;
struct tgsi_sampler;
union lp_type;
struct lp_build_context;
struct lp_build_mask_context;

+ 22
- 2
src/gallium/drivers/llvmpipe/lp_jit.c View File

@@ -37,11 +37,13 @@

#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);
}

+ 0
- 13
src/gallium/drivers/llvmpipe/lp_state_fs.c View 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

Loading…
Cancel
Save