Module: Mesa Branch: master Commit: 11e08f42e4fa5f1d296429415be6da7c03f105b0 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=11e08f42e4fa5f1d296429415be6da7c03f105b0
Author: Vincent Lejeune <v...@ovi.com> Date: Sun Sep 23 19:46:53 2012 +0200 r600g: use a select to handle front/back color in llvm Reviewed-by: Tom Stellard <thomas.stell...@amd.com> --- src/gallium/drivers/r600/r600_llvm.c | 36 ++++++++++++++++++++++++++++++++ src/gallium/drivers/r600/r600_shader.c | 13 +++++++---- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c index 71ea578..c6e60af 100644 --- a/src/gallium/drivers/r600/r600_llvm.c +++ b/src/gallium/drivers/r600/r600_llvm.c @@ -86,6 +86,42 @@ static void llvm_load_input( "llvm.R600.load.input", ctx->soa.bld_base.base.elem_type, ®, 1, LLVMReadNoneAttribute); + + if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR && ctx->two_side) { + unsigned back_reg = ctx->r600_inputs[input_index] + .potential_back_facing_reg; + unsigned back_soa_index = radeon_llvm_reg_index_soa( + ctx->r600_inputs[back_reg].gpr + , chan); + LLVMValueRef backcolor_reg = lp_build_const_int32( + ctx->soa.bld_base.base.gallivm, + back_soa_index); + LLVMValueRef backcolor = build_intrinsic( + ctx->soa.bld_base.base.gallivm->builder, + "llvm.R600.load.input", + ctx->soa.bld_base.base.elem_type, &backcolor_reg, 1, + LLVMReadNoneAttribute); + LLVMValueRef face_reg = lp_build_const_int32( + ctx->soa.bld_base.base.gallivm, + ctx->face_input * 4); + LLVMValueRef face = build_intrinsic( + ctx->soa.bld_base.base.gallivm->builder, + "llvm.R600.load.input", + ctx->soa.bld_base.base.elem_type, + &face_reg, 1, + LLVMReadNoneAttribute); + LLVMValueRef is_face_positive = LLVMBuildFCmp( + ctx->soa.bld_base.base.gallivm->builder, + LLVMRealUGT, face, + lp_build_const_float(ctx->soa.bld_base.base.gallivm, 0.0f), + ""); + ctx->inputs[soa_index] = LLVMBuildSelect( + ctx->soa.bld_base.base.gallivm->builder, + is_face_positive, + ctx->inputs[soa_index], + backcolor, + ""); + } } } diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 0c585de..daa5082 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -1128,7 +1128,7 @@ static int tgsi_split_literal_constant(struct r600_shader_ctx *ctx) return 0; } -static int process_twoside_color_inputs(struct r600_shader_ctx *ctx) +static int process_twoside_color_inputs(struct r600_shader_ctx *ctx, unsigned use_llvm) { int i, r, count = ctx->shader->ninput; @@ -1139,9 +1139,12 @@ static int process_twoside_color_inputs(struct r600_shader_ctx *ctx) if ((r = evergreen_interp_input(ctx, back_facing_reg))) return r; } - r = select_twoside_color(ctx, i, back_facing_reg); - if (r) - return r; + + if (!use_llvm) { + r = select_twoside_color(ctx, i, back_facing_reg); + if (r) + return r; + } } } return 0; @@ -1402,7 +1405,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen, } if (shader->two_side && ctx.colors_used) { - if ((r = process_twoside_color_inputs(&ctx))) + if ((r = process_twoside_color_inputs(&ctx, use_llvm))) return r; } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit