From 2f5f388a2cabbdcb73f9cccf29b70d1a5045cbf4 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Fri, 29 Jul 2022 18:02:26 +0200 Subject: [PATCH] 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 Signed-off-by: Axel Davy Part-of: --- src/gallium/frontends/nine/nine_ff.c | 18 +++++++++++------- src/gallium/frontends/nine/nine_shader.c | 10 ++++++++-- src/gallium/frontends/nine/nine_shader.h | 1 + src/gallium/frontends/nine/nine_state.c | 2 +- src/gallium/frontends/nine/pixelshader9.c | 3 +++ src/gallium/frontends/nine/pixelshader9.h | 2 ++ 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/gallium/frontends/nine/nine_ff.c b/src/gallium/frontends/nine/nine_ff.c index 682c1e7fd9d..1ab0fb3c2cf 100644 --- a/src/gallium/frontends/nine/nine_ff.c +++ b/src/gallium/frontends/nine/nine_ff.c @@ -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; diff --git a/src/gallium/frontends/nine/nine_shader.c b/src/gallium/frontends/nine/nine_shader.c index ba68488adf3..93052fee939 100644 --- a/src/gallium/frontends/nine/nine_shader.c +++ b/src/gallium/frontends/nine/nine_shader.c @@ -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 */ diff --git a/src/gallium/frontends/nine/nine_shader.h b/src/gallium/frontends/nine/nine_shader.h index e3fb0df347c..2879fa17c52 100644 --- a/src/gallium/frontends/nine/nine_shader.h +++ b/src/gallium/frontends/nine/nine_shader.h @@ -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; diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index d1f08b18b38..6ecbe7a9289 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -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, diff --git a/src/gallium/frontends/nine/pixelshader9.c b/src/gallium/frontends/nine/pixelshader9.c index 2542a2775ef..03402a27bf2 100644 --- a/src/gallium/frontends/nine/pixelshader9.c +++ b/src/gallium/frontends/nine/pixelshader9.c @@ -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; diff --git a/src/gallium/frontends/nine/pixelshader9.h b/src/gallium/frontends/nine/pixelshader9.h index 95a2ee5d653..7388342f1d5 100644 --- a/src/gallium/frontends/nine/pixelshader9.h +++ b/src/gallium/frontends/nine/pixelshader9.h @@ -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)