mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 02:00:12 +01:00
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>
This commit is contained in:
parent
b191be52f2
commit
a930136977
4 changed files with 28 additions and 3 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ struct lp_build_interp_soa_context
|
|||
enum lp_interp interp[1 + PIPE_MAX_SHADER_INPUTS];
|
||||
boolean simple_interp;
|
||||
|
||||
double pos_offset;
|
||||
|
||||
LLVMValueRef x;
|
||||
LLVMValueRef y;
|
||||
|
||||
|
|
@ -113,6 +115,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,
|
||||
|
|
|
|||
|
|
@ -154,9 +154,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
return 1;
|
||||
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
|
||||
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
|
||||
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
|
||||
return 1;
|
||||
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
|
||||
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
|
||||
return 0;
|
||||
case PIPE_CAP_PRIMITIVE_RESTART:
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -1919,6 +1919,7 @@ generate_fragment(struct llvmpipe_context *lp,
|
|||
gallivm,
|
||||
shader->info.base.num_inputs,
|
||||
inputs,
|
||||
shader->info.base.pixel_center_integer,
|
||||
builder, fs_type,
|
||||
a0_ptr, dadx_ptr, dady_ptr,
|
||||
x, y);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue