frontend/nine: Get rid of INTERPOLATE_COLOR
Some drivers don't handle it, and those who do replace it anyway depending on the rasterizer setting. Keep the rasterizer setting but replace the interpolation flag accordingly. Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Signed-off-by: Axel Davy <davyaxel0@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22644>
This commit is contained in:
@@ -114,7 +114,8 @@ struct nine_ff_ps_key
|
||||
uint32_t fog_source : 1; /* 0: Z, 1: W */
|
||||
uint32_t specular : 1;
|
||||
uint32_t alpha_test_emulation : 3;
|
||||
uint32_t pad1 : 8; /* 9 32-bit words with this */
|
||||
uint32_t flatshade : 1;
|
||||
uint32_t pad1 : 7; /* 9 32-bit words with this */
|
||||
uint8_t colorarg_b4[3];
|
||||
uint8_t colorarg_b5[3];
|
||||
uint8_t alphaarg_b4[3]; /* 11 32-bit words plus a byte */
|
||||
@@ -1089,6 +1090,7 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
|
||||
struct ps_build_ctx
|
||||
{
|
||||
struct ureg_program *ureg;
|
||||
unsigned color_interpolate_flag;
|
||||
|
||||
struct ureg_src vC[2]; /* DIFFUSE, SPECULAR */
|
||||
struct ureg_src vT[8]; /* TEXCOORD[i] */
|
||||
@@ -1121,10 +1123,10 @@ ps_get_ts_arg(struct ps_build_ctx *ps, unsigned ta)
|
||||
reg = (ps->stage.index == ps->stage.index_pre_mod) ? ureg_src(ps->rMod) : ps->rCurSrc;
|
||||
break;
|
||||
case D3DTA_DIFFUSE:
|
||||
reg = ureg_DECL_fs_input(ps->ureg, TGSI_SEMANTIC_COLOR, 0, TGSI_INTERPOLATE_COLOR);
|
||||
reg = ureg_DECL_fs_input(ps->ureg, TGSI_SEMANTIC_COLOR, 0, ps->color_interpolate_flag);
|
||||
break;
|
||||
case D3DTA_SPECULAR:
|
||||
reg = ureg_DECL_fs_input(ps->ureg, TGSI_SEMANTIC_COLOR, 1, TGSI_INTERPOLATE_COLOR);
|
||||
reg = ureg_DECL_fs_input(ps->ureg, TGSI_SEMANTIC_COLOR, 1, ps->color_interpolate_flag);
|
||||
break;
|
||||
case D3DTA_TEMP:
|
||||
reg = ps->rTmpSrc;
|
||||
@@ -1331,9 +1333,10 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
|
||||
|
||||
memset(&ps, 0, sizeof(ps));
|
||||
ps.ureg = ureg;
|
||||
ps.color_interpolate_flag = key->flatshade ? TGSI_INTERPOLATE_CONSTANT : TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
ps.stage.index_pre_mod = -1;
|
||||
|
||||
ps.vC[0] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 0, TGSI_INTERPOLATE_COLOR);
|
||||
ps.vC[0] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 0, ps.color_interpolate_flag);
|
||||
|
||||
ps.rCur = ureg_DECL_temporary(ureg);
|
||||
ps.rTmp = ureg_DECL_temporary(ureg);
|
||||
@@ -1354,7 +1357,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
|
||||
if (key->ts[s].colorarg0 == D3DTA_SPECULAR ||
|
||||
key->ts[s].colorarg1 == D3DTA_SPECULAR ||
|
||||
key->ts[s].colorarg2 == D3DTA_SPECULAR)
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, TGSI_INTERPOLATE_COLOR);
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, ps.color_interpolate_flag);
|
||||
|
||||
if (key->ts[s].colorarg0 == D3DTA_TEXTURE ||
|
||||
key->ts[s].colorarg1 == D3DTA_TEXTURE ||
|
||||
@@ -1373,7 +1376,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
|
||||
if (key->ts[s].alphaarg0 == D3DTA_SPECULAR ||
|
||||
key->ts[s].alphaarg1 == D3DTA_SPECULAR ||
|
||||
key->ts[s].alphaarg2 == D3DTA_SPECULAR)
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, TGSI_INTERPOLATE_COLOR);
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, ps.color_interpolate_flag);
|
||||
|
||||
if (key->ts[s].alphaarg0 == D3DTA_TEXTURE ||
|
||||
key->ts[s].alphaarg1 == D3DTA_TEXTURE ||
|
||||
@@ -1386,7 +1389,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
|
||||
}
|
||||
}
|
||||
if (key->specular)
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, TGSI_INTERPOLATE_COLOR);
|
||||
ps.vC[1] = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_COLOR, 1, ps.color_interpolate_flag);
|
||||
|
||||
oCol = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
|
||||
|
||||
@@ -1834,6 +1837,7 @@ nine_ff_get_ps(struct NineDevice9 *device)
|
||||
|
||||
key.projected = nine_ff_get_projected_key_ff(context);
|
||||
key.specular = !!context->rs[D3DRS_SPECULARENABLE];
|
||||
key.flatshade = context->rs[D3DRS_SHADEMODE] == D3DSHADE_FLAT;
|
||||
|
||||
for (; s < 8; ++s)
|
||||
key.ts[s].colorop = key.ts[s].alphaop = D3DTOP_DISABLE;
|
||||
|
||||
@@ -1074,7 +1074,7 @@ tx_src_param(struct shader_translator *tx, const struct sm1_src_param *param)
|
||||
if (tx->version.major < 3) {
|
||||
src = ureg_DECL_fs_input_centroid(
|
||||
ureg, TGSI_SEMANTIC_COLOR, param->idx,
|
||||
TGSI_INTERPOLATE_COLOR,
|
||||
tx->info->color_flatshade ? TGSI_INTERPOLATE_CONSTANT : TGSI_INTERPOLATE_PERSPECTIVE,
|
||||
tx->info->force_color_in_centroid ?
|
||||
TGSI_INTERPOLATE_LOC_CENTROID : 0,
|
||||
0, 1);
|
||||
@@ -2340,6 +2340,7 @@ DECL_SPECIAL(DCL)
|
||||
}
|
||||
} else {
|
||||
if (is_input && tx->version.major >= 3) {
|
||||
unsigned interp_flag;
|
||||
unsigned interp_location = 0;
|
||||
/* SM3 only, SM2 input semantic determined by file */
|
||||
assert(sem.reg.idx < ARRAY_SIZE(tx->regs.v));
|
||||
@@ -2360,10 +2361,15 @@ DECL_SPECIAL(DCL)
|
||||
if (sem.reg.mod & NINED3DSPDM_CENTROID ||
|
||||
(tgsi.Name == TGSI_SEMANTIC_COLOR && tx->info->force_color_in_centroid))
|
||||
interp_location = TGSI_INTERPOLATE_LOC_CENTROID;
|
||||
interp_flag = nine_tgsi_to_interp_mode(&tgsi);
|
||||
/* We replace TGSI_INTERPOLATE_COLOR because some drivers don't support it,
|
||||
* and those who support it do the same replacement we do */
|
||||
if (interp_flag == TGSI_INTERPOLATE_COLOR)
|
||||
interp_flag = tx->info->color_flatshade ? TGSI_INTERPOLATE_CONSTANT : TGSI_INTERPOLATE_PERSPECTIVE;
|
||||
|
||||
tx->regs.v[sem.reg.idx] = ureg_DECL_fs_input_centroid(
|
||||
ureg, tgsi.Name, tgsi.Index,
|
||||
nine_tgsi_to_interp_mode(&tgsi),
|
||||
interp_flag,
|
||||
interp_location, 0, 1);
|
||||
} else
|
||||
if (!is_input && 0) { /* declare in COLOROUT/DEPTHOUT case */
|
||||
|
||||
@@ -72,6 +72,7 @@ struct nine_shader_info
|
||||
uint8_t fog_mode;
|
||||
uint8_t zfog;
|
||||
uint8_t force_color_in_centroid;
|
||||
uint8_t color_flatshade;
|
||||
uint8_t projected; /* ps 1.1 to 1.3 */
|
||||
uint16_t fetch4;
|
||||
uint8_t alpha_test_emulation;
|
||||
|
||||
@@ -3498,7 +3498,7 @@ const uint32_t nine_render_state_group[NINED3DRS_LAST + 1] =
|
||||
{
|
||||
[D3DRS_ZENABLE] = NINE_STATE_DSA | NINE_STATE_MULTISAMPLE,
|
||||
[D3DRS_FILLMODE] = NINE_STATE_RASTERIZER,
|
||||
[D3DRS_SHADEMODE] = NINE_STATE_RASTERIZER,
|
||||
[D3DRS_SHADEMODE] = NINE_STATE_RASTERIZER | NINE_STATE_PS_PARAMS_MISC,
|
||||
[D3DRS_ZWRITEENABLE] = NINE_STATE_DSA,
|
||||
[D3DRS_ALPHATESTENABLE] = NINE_STATE_DSA,
|
||||
[D3DRS_LASTPIXEL] = NINE_STATE_RASTERIZER,
|
||||
|
||||
@@ -62,6 +62,7 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
|
||||
info.fog_enable = 0;
|
||||
info.projected = 0;
|
||||
info.alpha_test_emulation = 0;
|
||||
info.color_flatshade = 0;
|
||||
info.add_constants_defs.c_combination = NULL;
|
||||
info.add_constants_defs.int_const_added = NULL;
|
||||
info.add_constants_defs.bool_const_added = NULL;
|
||||
@@ -220,6 +221,8 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This,
|
||||
info.fetch4 = (key >> 32) & 0xffff;
|
||||
info.force_color_in_centroid = (key >> 48) & 1;
|
||||
info.alpha_test_emulation = (key >> 49) & 0x7;
|
||||
info.color_flatshade = (key >> 52) & 1;
|
||||
info.force_color_in_centroid &= !info.color_flatshade; /* centroid doesn't make sense with flatshade */
|
||||
info.process_vertices = false;
|
||||
info.swvp_on = false;
|
||||
|
||||
|
||||
@@ -130,6 +130,8 @@ NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
|
||||
if (context->rt[0]->base.info.nr_samples)
|
||||
key |= ((uint64_t)1) << 48;
|
||||
key |= ((uint64_t)(context->rs[NINED3DRS_EMULATED_ALPHATEST] & 0x7)) << 49; /* 3 bits */
|
||||
if (context->rs[D3DRS_SHADEMODE] == D3DSHADE_FLAT)
|
||||
key |= ((uint64_t)1) << 52;
|
||||
|
||||
res = ps->last_key != key;
|
||||
if (res)
|
||||
|
||||
Reference in New Issue
Block a user