radeonsi: Flesh out shader interpolation related code.
Handle perspective interpolation and ceontroid vs. center.
This commit is contained in:
parent
de52a56a0e
commit
1deb2be2b7
|
@ -934,6 +934,24 @@ def : Pat <
|
||||||
imm:$attr, SReg_32:$params)
|
imm:$attr, SReg_32:$params)
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
def : Pat <
|
||||||
|
(int_SI_fs_interp_linear_centroid imm:$attr_chan, imm:$attr, SReg_32:$params),
|
||||||
|
(SI_INTERP (f32 LINEAR_CENTROID_I), (f32 LINEAR_CENTROID_J), imm:$attr_chan,
|
||||||
|
imm:$attr, SReg_32:$params)
|
||||||
|
>;
|
||||||
|
|
||||||
|
def : Pat <
|
||||||
|
(int_SI_fs_interp_persp_center imm:$attr_chan, imm:$attr, SReg_32:$params),
|
||||||
|
(SI_INTERP (f32 PERSP_CENTER_I), (f32 PERSP_CENTER_J), imm:$attr_chan,
|
||||||
|
imm:$attr, SReg_32:$params)
|
||||||
|
>;
|
||||||
|
|
||||||
|
def : Pat <
|
||||||
|
(int_SI_fs_interp_persp_centroid imm:$attr_chan, imm:$attr, SReg_32:$params),
|
||||||
|
(SI_INTERP (f32 PERSP_CENTROID_I), (f32 PERSP_CENTROID_J), imm:$attr_chan,
|
||||||
|
imm:$attr, SReg_32:$params)
|
||||||
|
>;
|
||||||
|
|
||||||
/********** ================== **********/
|
/********** ================== **********/
|
||||||
/********** Intrinsic Patterns **********/
|
/********** Intrinsic Patterns **********/
|
||||||
/********** ================== **********/
|
/********** ================== **********/
|
||||||
|
|
|
@ -30,5 +30,8 @@ let TargetPrefix = "SI", isTarget = 1 in {
|
||||||
class Interp : Intrinsic <[llvm_float_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
|
class Interp : Intrinsic <[llvm_float_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], []>;
|
||||||
|
|
||||||
def int_SI_fs_interp_linear_center : Interp;
|
def int_SI_fs_interp_linear_center : Interp;
|
||||||
|
def int_SI_fs_interp_linear_centroid : Interp;
|
||||||
|
def int_SI_fs_interp_persp_center : Interp;
|
||||||
|
def int_SI_fs_interp_persp_centroid : Interp;
|
||||||
def int_SI_fs_interp_constant : Interp;
|
def int_SI_fs_interp_constant : Interp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,16 +201,29 @@ static void declare_input_fs(
|
||||||
/* XXX: Handle all possible interpolation modes */
|
/* XXX: Handle all possible interpolation modes */
|
||||||
switch (decl->Interp.Interpolate) {
|
switch (decl->Interp.Interpolate) {
|
||||||
case TGSI_INTERPOLATE_COLOR:
|
case TGSI_INTERPOLATE_COLOR:
|
||||||
if (si_shader_ctx->rctx->rasterizer->flatshade)
|
if (si_shader_ctx->rctx->rasterizer->flatshade) {
|
||||||
intr_name = "llvm.SI.fs.interp.constant";
|
intr_name = "llvm.SI.fs.interp.constant";
|
||||||
else
|
} else {
|
||||||
intr_name = "llvm.SI.fs.interp.linear.center";
|
if (decl->Interp.Centroid)
|
||||||
|
intr_name = "llvm.SI.fs.interp.persp.centroid";
|
||||||
|
else
|
||||||
|
intr_name = "llvm.SI.fs.interp.persp.center";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case TGSI_INTERPOLATE_CONSTANT:
|
case TGSI_INTERPOLATE_CONSTANT:
|
||||||
intr_name = "llvm.SI.fs.interp.constant";
|
intr_name = "llvm.SI.fs.interp.constant";
|
||||||
break;
|
break;
|
||||||
case TGSI_INTERPOLATE_LINEAR:
|
case TGSI_INTERPOLATE_LINEAR:
|
||||||
intr_name = "llvm.SI.fs.interp.linear.center";
|
if (decl->Interp.Centroid)
|
||||||
|
intr_name = "llvm.SI.fs.interp.linear.centroid";
|
||||||
|
else
|
||||||
|
intr_name = "llvm.SI.fs.interp.linear.center";
|
||||||
|
break;
|
||||||
|
case TGSI_INTERPOLATE_PERSPECTIVE:
|
||||||
|
if (decl->Interp.Centroid)
|
||||||
|
intr_name = "llvm.SI.fs.interp.persp.centroid";
|
||||||
|
else
|
||||||
|
intr_name = "llvm.SI.fs.interp.persp.center";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Warning: Unhandled interpolation mode.\n");
|
fprintf(stderr, "Warning: Unhandled interpolation mode.\n");
|
||||||
|
|
Loading…
Reference in New Issue