gallium/radeon: add basic code for setting shader return values
LLVMBuildInsertValue will be used on return_value. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -789,7 +789,7 @@ LLVMModuleRef r600_tgsi_llvm(
|
||||
unsigned ArgumentsCount = 0;
|
||||
for (unsigned i = 0; i < ctx->inputs_count; i++)
|
||||
Arguments[ArgumentsCount++] = LLVMVectorType(bld_base->base.elem_type, 4);
|
||||
radeon_llvm_create_func(ctx, Arguments, ArgumentsCount);
|
||||
radeon_llvm_create_func(ctx, NULL, 0, Arguments, ArgumentsCount);
|
||||
for (unsigned i = 0; i < ctx->inputs_count; i++) {
|
||||
LLVMValueRef P = LLVMGetParam(ctx->main_fn, i);
|
||||
LLVMAddAttribute(P, LLVMInRegAttribute);
|
||||
|
||||
@@ -113,6 +113,7 @@ struct radeon_llvm_context {
|
||||
struct tgsi_declaration_range *arrays;
|
||||
|
||||
LLVMValueRef main_fn;
|
||||
LLVMTypeRef return_type;
|
||||
|
||||
struct gallivm_state gallivm;
|
||||
};
|
||||
@@ -162,7 +163,8 @@ void radeon_llvm_context_init(struct radeon_llvm_context * ctx,
|
||||
const char *triple);
|
||||
|
||||
void radeon_llvm_create_func(struct radeon_llvm_context * ctx,
|
||||
LLVMTypeRef *ParamTypes, unsigned ParamCount);
|
||||
LLVMTypeRef *return_types, unsigned num_return_elems,
|
||||
LLVMTypeRef *ParamTypes, unsigned ParamCount);
|
||||
|
||||
void radeon_llvm_dispose(struct radeon_llvm_context * ctx);
|
||||
|
||||
|
||||
@@ -1701,14 +1701,22 @@ void radeon_llvm_context_init(struct radeon_llvm_context * ctx, const char *trip
|
||||
}
|
||||
|
||||
void radeon_llvm_create_func(struct radeon_llvm_context * ctx,
|
||||
LLVMTypeRef *return_types, unsigned num_return_elems,
|
||||
LLVMTypeRef *ParamTypes, unsigned ParamCount)
|
||||
{
|
||||
LLVMTypeRef main_fn_type;
|
||||
LLVMTypeRef main_fn_type, ret_type;
|
||||
LLVMBasicBlockRef main_fn_body;
|
||||
|
||||
if (num_return_elems)
|
||||
ret_type = LLVMStructTypeInContext(ctx->gallivm.context,
|
||||
return_types,
|
||||
num_return_elems, true);
|
||||
else
|
||||
ret_type = LLVMVoidTypeInContext(ctx->gallivm.context);
|
||||
|
||||
/* Setup the function */
|
||||
main_fn_type = LLVMFunctionType(LLVMVoidTypeInContext(ctx->gallivm.context),
|
||||
ParamTypes, ParamCount, 0);
|
||||
ctx->return_type = ret_type;
|
||||
main_fn_type = LLVMFunctionType(ret_type, ParamTypes, ParamCount, 0);
|
||||
ctx->main_fn = LLVMAddFunction(ctx->gallivm.module, "main", main_fn_type);
|
||||
main_fn_body = LLVMAppendBasicBlockInContext(ctx->gallivm.context,
|
||||
ctx->main_fn, "main_body");
|
||||
|
||||
@@ -96,6 +96,7 @@ struct si_shader_context
|
||||
LLVMValueRef esgs_ring;
|
||||
LLVMValueRef gsvs_ring[4];
|
||||
LLVMValueRef gs_next_vertex[4];
|
||||
LLVMValueRef return_value;
|
||||
|
||||
LLVMTypeRef voidt;
|
||||
LLVMTypeRef i1;
|
||||
@@ -3711,8 +3712,10 @@ static void create_function(struct si_shader_context *ctx)
|
||||
}
|
||||
|
||||
assert(num_params <= Elements(params));
|
||||
radeon_llvm_create_func(&ctx->radeon_bld, params, num_params);
|
||||
radeon_llvm_create_func(&ctx->radeon_bld, NULL, 0,
|
||||
params, num_params);
|
||||
radeon_llvm_shader_type(ctx->radeon_bld.main_fn, ctx->type);
|
||||
ctx->return_value = LLVMGetUndef(ctx->radeon_bld.return_type);
|
||||
|
||||
for (i = 0; i <= last_sgpr; ++i) {
|
||||
LLVMValueRef P = LLVMGetParam(ctx->radeon_bld.main_fn, i);
|
||||
@@ -4241,7 +4244,7 @@ static int si_generate_gs_copy_shader(struct si_screen *sscreen,
|
||||
|
||||
si_llvm_export_vs(bld_base, outputs, gsinfo->num_outputs);
|
||||
|
||||
LLVMBuildRetVoid(bld_base->base.gallivm->builder);
|
||||
LLVMBuildRet(gallivm->builder, ctx->return_value);
|
||||
|
||||
/* Dump LLVM IR before any optimization passes */
|
||||
if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
|
||||
@@ -4475,7 +4478,7 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
|
||||
goto out;
|
||||
}
|
||||
|
||||
LLVMBuildRetVoid(bld_base->base.gallivm->builder);
|
||||
LLVMBuildRet(bld_base->base.gallivm->builder, ctx.return_value);
|
||||
mod = bld_base->base.gallivm->module;
|
||||
|
||||
/* Dump LLVM IR before any optimization passes */
|
||||
|
||||
Reference in New Issue
Block a user