diff options
author | José Fonseca <jfonseca@vmware.com> | 2013-04-18 11:39:19 +0100 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2013-04-18 14:18:25 +0100 |
commit | a93013697747f09a414cd4674cb1ccc59c2d1d8b (patch) | |
tree | 2034be487aa45d52ffaec7fd787b7eaaafe50748 /src/gallium/drivers/llvmpipe/lp_bld_interp.c | |
parent | b191be52f2fda88f557476014eeb0e5446f2799e (diff) |
llvmpipe: Support half integer pixel center fs coord.
Tested with graw/fs-fragcoord 2/3, and piglit
glsl-arb-fragment-coord-conventions.
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_bld_interp.c')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_interp.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_interp.c b/src/gallium/drivers/llvmpipe/lp_bld_interp.c index 083c6da3f87..490a69179fa 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_interp.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_interp.c @@ -283,9 +283,15 @@ attribs_update_simple(struct lp_build_interp_soa_context *bld, case LP_INTERP_LINEAR: if (attrib == 0 && chan == 0) { dadx = coeff_bld->one; + if (bld->pos_offset) { + a = lp_build_const_vec(gallivm, coeff_bld->type, bld->pos_offset); + } } else if (attrib == 0 && chan == 1) { dady = coeff_bld->one; + if (bld->pos_offset) { + a = lp_build_const_vec(gallivm, coeff_bld->type, bld->pos_offset); + } } else { dadx = lp_build_extract_broadcast(gallivm, setup_bld->type, @@ -454,12 +460,20 @@ coeffs_init(struct lp_build_interp_soa_context *bld, LLVMValueRef chan_index = lp_build_const_int32(gallivm, chan); if (attrib == 0 && chan == 0) { - a = lp_build_broadcast_scalar(coeff_bld, bld->x); + a = bld->x; + if (bld->pos_offset) { + a = LLVMBuildFAdd(builder, a, lp_build_const_float(gallivm, bld->pos_offset), ""); + } + a = lp_build_broadcast_scalar(coeff_bld, a); dadx = coeff_bld->one; dady = coeff_bld->zero; } else if (attrib == 0 && chan == 1) { - a = lp_build_broadcast_scalar(coeff_bld, bld->y); + a = bld->y; + if (bld->pos_offset) { + a = LLVMBuildFAdd(builder, a, lp_build_const_float(gallivm, bld->pos_offset), ""); + } + a = lp_build_broadcast_scalar(coeff_bld, a); dady = coeff_bld->one; dadx = coeff_bld->zero; } @@ -667,6 +681,7 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld, struct gallivm_state *gallivm, unsigned num_inputs, const struct lp_shader_input *inputs, + boolean pixel_center_integer, LLVMBuilderRef builder, struct lp_type type, LLVMValueRef a0_ptr, @@ -723,6 +738,12 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld, } } + if (pixel_center_integer) { + bld->pos_offset = 0.0; + } else { + bld->pos_offset = 0.5; + } + pos_init(bld, x0, y0); if (coeff_type.length > 4) { |