summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2009-08-14 10:03:46 +0100
committerJosé Fonseca <jfonseca@vmware.com>2009-08-29 09:21:32 +0100
commit95f38dd67c7dfeb3172ef9723c6f8e4c33de0754 (patch)
tree7ed94f811d1860e3f8f693d582c52d23fae62e90 /src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c
parentaf608e56ca246232ef11a561040b84801ae3a552 (diff)
llvmpipe: Code generate interpolators.
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c98
1 files changed, 68 insertions, 30 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c
index c9143ebfe4..1f489a359b 100644
--- a/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c
+++ b/src/gallium/drivers/llvmpipe/lp_bld_tgsi_soa.c
@@ -69,13 +69,21 @@ struct lp_build_tgsi_soa_context
{
struct lp_build_context base;
- LLVMValueRef (*inputs)[4];
+ LLVMValueRef x, y, w;
+ LLVMValueRef a0_ptr;
+ LLVMValueRef dadx_ptr;
+ LLVMValueRef dady_ptr;
+
LLVMValueRef consts_ptr;
- LLVMValueRef (*outputs)[4];
+ LLVMValueRef (*outputs)[NUM_CHANNELS];
LLVMValueRef samplers_ptr;
- LLVMValueRef immediates[LP_MAX_IMMEDIATES][4];
- LLVMValueRef temps[LP_MAX_TEMPS][4];
+ LLVMValueRef oow;
+
+ LLVMValueRef inputs[PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
+
+ LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
+ LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
/** Coords/texels store */
LLVMValueRef store_ptr;
@@ -1339,48 +1347,70 @@ emit_declaration(
struct lp_build_tgsi_soa_context *bld,
struct tgsi_full_declaration *decl )
{
-#if 0
if( decl->Declaration.File == TGSI_FILE_INPUT ) {
+ LLVMBuilderRef builder = bld->base.builder;
unsigned first, last, mask;
- unsigned i, j;
- LLVMValueRef tmp;
+ unsigned attrib, chan;
first = decl->DeclarationRange.First;
last = decl->DeclarationRange.Last;
mask = decl->Declaration.UsageMask;
- for( i = first; i <= last; i++ ) {
- for( j = 0; j < NUM_CHANNELS; j++ ) {
- if( mask & (1 << j) ) {
- switch( decl->Declaration.Interpolate ) {
- case TGSI_INTERPOLATE_CONSTANT:
- bld->inputs[i][j] = bld->interp_coefs[i].a0[j];
- break;
+ for( attrib = first; attrib <= last; attrib++ ) {
+ for( chan = 0; chan < NUM_CHANNELS; chan++ ) {
+ LLVMValueRef input = bld->base.undef;
- case TGSI_INTERPOLATE_LINEAR:
- tmp = bld->interp_coefs[i].a0[j];
- tmp = lp_build_add(&bld->base, tmp, lp_build_mul(&bld->base, bld->pos[0], bld->interp_coefs[i].dadx[j]));
- tmp = lp_build_add(&bld->base, tmp, lp_build_mul(&bld->base, bld->pos[1], bld->interp_coefs[i].dady[j]));
- bld->inputs[i][j] = tmp;
- break;
+ if( mask & (1 << chan) ) {
+ LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), attrib*NUM_CHANNELS + chan, 0);
+ LLVMValueRef a0;
+ LLVMValueRef dadx;
+ LLVMValueRef dady;
+ char name[32];
+ switch( decl->Declaration.Interpolate ) {
case TGSI_INTERPOLATE_PERSPECTIVE:
- tmp = bld->interp_coefs[i].a0[j];
- tmp = lp_build_add(&bld->base, tmp, lp_build_mul(&bld->base, bld->pos[0], bld->interp_coefs[i].dadx[j]));
- tmp = lp_build_add(&bld->base, tmp, lp_build_mul(&bld->base, bld->pos[1], bld->interp_coefs[i].dady[j]));
- tmp = lp_build_div(&bld->base, tmp, bld->pos[3]);
- bld->inputs[i][j] = tmp;
+ case TGSI_INTERPOLATE_LINEAR: {
+ LLVMValueRef dadx_ptr = LLVMBuildGEP(builder, bld->dadx_ptr, &index, 1, "");
+ LLVMValueRef dady_ptr = LLVMBuildGEP(builder, bld->dady_ptr, &index, 1, "");
+ util_snprintf(name, sizeof name, "dadx_%u.%c", attrib, "xyzw"[chan]);
+ dadx = LLVMBuildLoad(builder, dadx_ptr, name);
+ util_snprintf(name, sizeof name, "dady_%u.%c", attrib, "xyzw"[chan]);
+ dady = LLVMBuildLoad(builder, dady_ptr, name);
+ }
+
+ case TGSI_INTERPOLATE_CONSTANT: {
+ LLVMValueRef a0_ptr = LLVMBuildGEP(builder, bld->a0_ptr, &index, 1, "");
+ util_snprintf(name, sizeof name, "a0_%u.%c", attrib, "xyzw"[chan]);
+ a0 = LLVMBuildLoad(builder, a0_ptr, name);
break;
+ }
default:
- assert( 0 );
- break;
+ assert(0);
+ break;
+ }
+
+ input = a0;
+
+ if (decl->Declaration.Interpolate != TGSI_INTERPOLATE_CONSTANT) {
+ input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->x, dadx));
+ input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->y, dady));
}
+
+ if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
+ if(!bld->oow)
+ bld->oow = lp_build_rcp(&bld->base, bld->w);
+ input = lp_build_mul(&bld->base, input, bld->oow);
+ }
+
+ util_snprintf(name, sizeof name, "input%u.%c", attrib, "xyzw"[chan]);
+ LLVMSetValueName(input, name);
}
+
+ bld->inputs[attrib][chan] = input;
}
}
}
-#endif
}
/**
@@ -1396,7 +1426,10 @@ void
lp_build_tgsi_soa(LLVMBuilderRef builder,
const struct tgsi_token *tokens,
union lp_type type,
- LLVMValueRef (*inputs)[4],
+ LLVMValueRef *pos,
+ LLVMValueRef a0_ptr,
+ LLVMValueRef dadx_ptr,
+ LLVMValueRef dady_ptr,
LLVMValueRef consts_ptr,
LLVMValueRef (*outputs)[4],
LLVMValueRef samplers_ptr)
@@ -1409,7 +1442,12 @@ lp_build_tgsi_soa(LLVMBuilderRef builder,
/* Setup build context */
memset(&bld, 0, sizeof bld);
lp_build_context_init(&bld.base, builder, type);
- bld.inputs = inputs;
+ bld.x = pos[0];
+ bld.y = pos[1];
+ bld.w = pos[3];
+ bld.a0_ptr = a0_ptr;
+ bld.dadx_ptr = dadx_ptr;
+ bld.dady_ptr = dady_ptr;
bld.outputs = outputs;
bld.consts_ptr = consts_ptr;
bld.samplers_ptr = samplers_ptr;