llvmpipe: Centralize all position interpolation in lp_bld_interp.c.

This commit is contained in:
José Fonseca 2010-06-02 09:56:05 +01:00
parent 53beea574f
commit 147dc2354c
3 changed files with 43 additions and 51 deletions

View File

@ -75,6 +75,10 @@
*/
static const unsigned char quad_offset_x[4] = {0, 1, 0, 1};
static const unsigned char quad_offset_y[4] = {0, 0, 1, 1};
static void
attrib_name(LLVMValueRef val, unsigned attrib, unsigned chan, const char *suffix)
{
@ -281,18 +285,46 @@ attribs_update(struct lp_build_interp_soa_context *bld, int quad_index)
/**
* Generate the position vectors.
*
* Parameter x0, y0 are the integer values with the quad upper left coordinates.
* Parameter x0, y0 are the integer values with upper left coordinates.
*/
static void
pos_init(struct lp_build_interp_soa_context *bld,
LLVMValueRef x0,
LLVMValueRef y0)
{
lp_build_name(x0, "pos.x");
lp_build_name(y0, "pos.y");
LLVMBuilderRef builder = bld->base.builder;
LLVMTypeRef int_elem_type = LLVMInt32Type();
LLVMTypeRef int_vec_type = LLVMVectorType(int_elem_type, QUAD_SIZE);
LLVMTypeRef elem_type = LLVMFloatType();
LLVMTypeRef vec_type = LLVMVectorType(elem_type, QUAD_SIZE);
LLVMValueRef x_offsets[QUAD_SIZE];
LLVMValueRef y_offsets[QUAD_SIZE];
unsigned i;
bld->attribs[0][0] = x0;
bld->attribs[0][1] = y0;
/*
* Derive from the quad's upper left scalar coordinates the coordinates for
* all other quad pixels
*/
x0 = lp_build_broadcast(builder, int_vec_type, x0);
y0 = lp_build_broadcast(builder, int_vec_type, y0);
for(i = 0; i < QUAD_SIZE; ++i) {
x_offsets[i] = LLVMConstInt(int_elem_type, quad_offset_x[i], 0);
y_offsets[i] = LLVMConstInt(int_elem_type, quad_offset_y[i], 0);
}
x0 = LLVMBuildAdd(builder, x0, LLVMConstVector(x_offsets, QUAD_SIZE), "");
y0 = LLVMBuildAdd(builder, y0, LLVMConstVector(y_offsets, QUAD_SIZE), "");
bld->x0 = LLVMBuildSIToFP(builder, x0, vec_type, "");
bld->y0 = LLVMBuildSIToFP(builder, y0, vec_type, "");
lp_build_name(bld->x0, "pos.x");
lp_build_name(bld->y0, "pos.y");
bld->attribs[0][0] = bld->x0;
bld->attribs[0][1] = bld->y0;
}

View File

@ -57,6 +57,9 @@ struct lp_build_interp_soa_context
unsigned mask[1 + PIPE_MAX_SHADER_INPUTS]; /**< TGSI_WRITE_MASK_x */
enum lp_interp interp[1 + PIPE_MAX_SHADER_INPUTS];
LLVMValueRef x0;
LLVMValueRef y0;
LLVMValueRef a0 [1 + PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
LLVMValueRef dadx[1 + PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
LLVMValueRef dady[1 + PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
@ -83,8 +86,8 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
LLVMValueRef a0_ptr,
LLVMValueRef dadx_ptr,
LLVMValueRef dady_ptr,
LLVMValueRef x0,
LLVMValueRef y0);
LLVMValueRef x,
LLVMValueRef y);
void
lp_build_interp_soa_update(struct lp_build_interp_soa_context *bld,

View File

@ -99,45 +99,6 @@
#include <llvm-c/Analysis.h>
static const unsigned char quad_offset_x[4] = {0, 1, 0, 1};
static const unsigned char quad_offset_y[4] = {0, 0, 1, 1};
/*
* Derive from the quad's upper left scalar coordinates the coordinates for
* all other quad pixels
*/
static void
generate_pos0(LLVMBuilderRef builder,
LLVMValueRef x,
LLVMValueRef y,
LLVMValueRef *x0,
LLVMValueRef *y0)
{
LLVMTypeRef int_elem_type = LLVMInt32Type();
LLVMTypeRef int_vec_type = LLVMVectorType(int_elem_type, QUAD_SIZE);
LLVMTypeRef elem_type = LLVMFloatType();
LLVMTypeRef vec_type = LLVMVectorType(elem_type, QUAD_SIZE);
LLVMValueRef x_offsets[QUAD_SIZE];
LLVMValueRef y_offsets[QUAD_SIZE];
unsigned i;
x = lp_build_broadcast(builder, int_vec_type, x);
y = lp_build_broadcast(builder, int_vec_type, y);
for(i = 0; i < QUAD_SIZE; ++i) {
x_offsets[i] = LLVMConstInt(int_elem_type, quad_offset_x[i], 0);
y_offsets[i] = LLVMConstInt(int_elem_type, quad_offset_y[i], 0);
}
x = LLVMBuildAdd(builder, x, LLVMConstVector(x_offsets, QUAD_SIZE), "");
y = LLVMBuildAdd(builder, y, LLVMConstVector(y_offsets, QUAD_SIZE), "");
*x0 = LLVMBuildSIToFP(builder, x, vec_type, "");
*y0 = LLVMBuildSIToFP(builder, y, vec_type, "");
}
/**
* Generate the depth /stencil test code.
*/
@ -635,8 +596,6 @@ generate_fragment(struct llvmpipe_context *lp,
LLVMValueRef c0, c1, c2, step0_ptr, step1_ptr, step2_ptr, counter = NULL;
LLVMBasicBlockRef block;
LLVMBuilderRef builder;
LLVMValueRef x0;
LLVMValueRef y0;
struct lp_build_sampler_soa *sampler;
struct lp_build_interp_soa_context interp;
LLVMValueRef fs_mask[LP_MAX_VECTOR_LENGTH];
@ -757,8 +716,6 @@ generate_fragment(struct llvmpipe_context *lp,
builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, block);
generate_pos0(builder, x, y, &x0, &y0);
/*
* The shader input interpolation info is not explicitely baked in the
* shader key, but everything it derives from (TGSI, and flatshade) is
@ -769,7 +726,7 @@ generate_fragment(struct llvmpipe_context *lp,
lp->inputs,
builder, fs_type,
a0_ptr, dadx_ptr, dady_ptr,
x0, y0);
x, y);
/* code generated texture sampling */
sampler = lp_llvm_sampler_soa_create(key->sampler, context_ptr);