diff options
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_const.c | 29 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_const.h | 10 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_format_aos.c | 20 |
3 files changed, 44 insertions, 15 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.c b/src/gallium/auxiliary/gallivm/lp_bld_const.c index 9e9dc442733..f0611b158d9 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_const.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.c @@ -446,3 +446,32 @@ lp_build_const_string(struct gallivm_state *gallivm, string = LLVMConstBitCast(string, LLVMPointerType(i8, 0)); return string; } + + +/** + * Build a callable function pointer. + * + * We this casts instead of LLVMAddGlobalMapping() + * to work around a bug in LLVM 2.6, and for efficiency/simplicity. + */ +LLVMValueRef +lp_build_const_func_pointer(struct gallivm_state *gallivm, + const void *ptr, + LLVMTypeRef ret_type, + LLVMTypeRef *arg_types, + unsigned num_args, + const char *name) +{ + LLVMTypeRef function_type; + LLVMValueRef function; + + function_type = LLVMFunctionType(ret_type, arg_types, num_args, 0); + + function = lp_build_const_int_pointer(gallivm, ptr); + + function = LLVMBuildBitCast(gallivm->builder, function, + LLVMPointerType(function_type, 0), + name); + + return function; +} diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.h b/src/gallium/auxiliary/gallivm/lp_bld_const.h index 34c3c691377..2205616274f 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_const.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.h @@ -153,4 +153,14 @@ LLVMValueRef lp_build_const_string(struct gallivm_state *gallivm, const char *str); + +LLVMValueRef +lp_build_const_func_pointer(struct gallivm_state *gallivm, + const void *ptr, + LLVMTypeRef ret_type, + LLVMTypeRef *arg_types, + unsigned num_args, + const char *name); + + #endif /* !LP_BLD_CONST_H */ diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c index 82ab19eda14..e4b8da6bcfd 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c @@ -643,28 +643,18 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm, */ LLVMTypeRef ret_type; LLVMTypeRef arg_types[4]; - LLVMTypeRef function_type; ret_type = LLVMVoidTypeInContext(gallivm->context); arg_types[0] = pf32t; arg_types[1] = pi8t; arg_types[2] = i32t; arg_types[3] = i32t; - function_type = LLVMFunctionType(ret_type, arg_types, - Elements(arg_types), 0); - /* Note: we're using this casting here instead of LLVMAddGlobalMapping() - * to work around a bug in LLVM 2.6, and for efficiency/simplicity. - */ - - /* make const pointer for the C fetch_rgba_float function */ - function = lp_build_const_int_pointer(gallivm, - func_to_pointer((func_pointer) format_desc->fetch_rgba_float)); - - /* cast the callee pointer to the function's type */ - function = LLVMBuildBitCast(builder, function, - LLVMPointerType(function_type, 0), - "cast callee"); + function = lp_build_const_func_pointer(gallivm, + func_to_pointer((func_pointer) format_desc->fetch_rgba_float), + ret_type, + arg_types, Elements(arg_types), + format_desc->short_name); } tmp_ptr = lp_build_alloca(gallivm, f32x4t, ""); |