default: assert(!"unknown system value");
}
-#if HAVE_LLVM >= 0x0304
ctx->system_values[index] = LLVMBuildExtractElement(ctx->gallivm.builder,
LLVMGetParam(ctx->main_fn, 0), lp_build_const_int32(&(ctx->gallivm), chan),
"");
-#else
- LLVMValueRef reg = lp_build_const_int32(
- ctx->soa.bld_base.base.gallivm, chan);
- ctx->system_values[index] = lp_build_intrinsic(
- ctx->soa.bld_base.base.gallivm->builder,
- "llvm.R600.load.input",
- ctx->soa.bld_base.base.elem_type, ®, 1,
- LLVMReadNoneAttribute);
-#endif
}
-#if HAVE_LLVM >= 0x0304
static LLVMValueRef
llvm_load_input_vector(
struct radeon_llvm_context * ctx, unsigned location, unsigned ijregs,
VecType, Args, ArgCount, LLVMReadNoneAttribute);
}
}
-#else
-static LLVMValueRef
-llvm_load_input_helper(
- struct radeon_llvm_context * ctx,
- unsigned idx, int interp, int ij_index)
-{
- const struct lp_build_context * bb = &ctx->soa.bld_base.base;
- LLVMValueRef arg[2];
- int arg_count;
- const char * intrinsic;
-
- arg[0] = lp_build_const_int32(bb->gallivm, idx);
-
- if (interp) {
- intrinsic = "llvm.R600.interp.input";
- arg[1] = lp_build_const_int32(bb->gallivm, ij_index);
- arg_count = 2;
- } else {
- intrinsic = "llvm.R600.load.input";
- arg_count = 1;
- }
-
- return lp_build_intrinsic(bb->gallivm->builder, intrinsic,
- bb->elem_type, &arg[0], arg_count, LLVMReadNoneAttribute);
-}
-#endif
-#if HAVE_LLVM >= 0x0304
static LLVMValueRef
llvm_face_select_helper(
struct radeon_llvm_context * ctx,
return LLVMBuildSelect(bb->gallivm->builder, is_front,
front_color, back_color, "");
}
-#else
-static LLVMValueRef
-llvm_face_select_helper(
- struct radeon_llvm_context * ctx,
- unsigned face_loc, LLVMValueRef front_color, LLVMValueRef back_color)
-{
- const struct lp_build_context * bb = &ctx->soa.bld_base.base;
- LLVMValueRef face = llvm_load_input_helper(ctx, face_loc, 0, 0);
- LLVMValueRef is_front = LLVMBuildFCmp(
- bb->gallivm->builder, LLVMRealUGT, face,
- lp_build_const_float(bb->gallivm, 0.0f), "");
- return LLVMBuildSelect(bb->gallivm->builder, is_front,
- front_color, back_color, "");
-}
-#endif
static void llvm_load_input(
struct radeon_llvm_context * ctx,
{
const struct r600_shader_io * input = &ctx->r600_inputs[input_index];
unsigned chan;
-#if HAVE_LLVM < 0x0304
- unsigned interp = 0;
- int ij_index;
-#endif
int two_side = (ctx->two_side && input->name == TGSI_SEMANTIC_COLOR);
LLVMValueRef v;
-#if HAVE_LLVM >= 0x0304
boolean require_interp_intrinsic = ctx->chip_class >= EVERGREEN &&
ctx->type == TGSI_PROCESSOR_FRAGMENT;
-#endif
-#if HAVE_LLVM >= 0x0304
if (require_interp_intrinsic && input->spi_sid) {
v = llvm_load_input_vector(ctx, input->lds_pos, input->ij_index,
(input->interpolate > 0));
lp_build_const_float(&(ctx->gallivm), 1.0f),
ctx->inputs[soa_index], "");
}
-}
-#else
- if (ctx->chip_class >= EVERGREEN && ctx->type == TGSI_PROCESSOR_FRAGMENT &&
- input->spi_sid) {
- interp = 1;
- ij_index = (input->interpolate > 0) ? input->ij_index : -1;
}
-
- for (chan = 0; chan < 4; chan++) {
- unsigned soa_index = radeon_llvm_reg_index_soa(input_index, chan);
- int loc;
-
- if (interp) {
- loc = 4 * input->lds_pos + chan;
- } else {
- if (input->name == TGSI_SEMANTIC_FACE)
- loc = 4 * ctx->face_gpr;
- else
- loc = 4 * input->gpr + chan;
- }
-
- v = llvm_load_input_helper(ctx, loc, interp, ij_index);
-
- if (two_side) {
- struct r600_shader_io * back_input =
- &ctx->r600_inputs[input->back_color_input];
- int back_loc = interp ? back_input->lds_pos : back_input->gpr;
- LLVMValueRef v2;
-
- back_loc = 4 * back_loc + chan;
- v2 = llvm_load_input_helper(ctx, back_loc, interp, ij_index);
- v = llvm_face_select_helper(ctx, 4 * ctx->face_gpr, v, v2);
- } else if (input->name == TGSI_SEMANTIC_POSITION &&
- ctx->type == TGSI_PROCESSOR_FRAGMENT && chan == 3) {
- /* RCP for fragcoord.w */
- v = LLVMBuildFDiv(ctx->gallivm.builder,
- lp_build_const_float(&(ctx->gallivm), 1.0f),
- v, "");
- }
-
- ctx->inputs[soa_index] = v;
- }
-#endif
}
static void llvm_emit_prologue(struct lp_build_tgsi_context * bld_base)
struct tgsi_shader_info shader_info;
struct lp_build_tgsi_context * bld_base = &ctx->soa.bld_base;
radeon_llvm_context_init(ctx);
-#if HAVE_LLVM >= 0x0304
LLVMTypeRef Arguments[32];
unsigned ArgumentsCount = 0;
for (unsigned i = 0; i < ctx->inputs_count; i++)
LLVMValueRef P = LLVMGetParam(ctx->main_fn, i);
LLVMAddAttribute(P, LLVMInRegAttribute);
}
-#else
- radeon_llvm_create_func(ctx, NULL, 0);
-#endif
tgsi_scan_shader(tokens, &shader_info);
bld_base->info = &shader_info;