st/nine: Use TGSI_SEMANTIC_GENERIC for fog
We used TGSI_SEMANTIC_FOG for fog, however on vs/ps 3, fog is allowed to have 4 components (even on the ff pipeline according to a wine test). Since gallium's TGSI_SEMANTIC_FOG has only one component, use TGSI_SEMANTIC_GENERIC instead. Fixes: https://github.com/iXit/Mesa-3D/issues/346 Signed-off-by: Axel Davy <davyaxel0@gmail.com>
This commit is contained in:
parent
bade3bf615
commit
92117c989c
|
@ -420,7 +420,7 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
|
||||||
oCol[0] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0));
|
oCol[0] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0));
|
||||||
oCol[1] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 1));
|
oCol[1] = ureg_saturate(ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 1));
|
||||||
if (key->fog || key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
|
if (key->fog || key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
|
||||||
oFog = ureg_DECL_output(ureg, TGSI_SEMANTIC_FOG, 0);
|
oFog = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 16);
|
||||||
oFog = ureg_writemask(oFog, TGSI_WRITEMASK_X);
|
oFog = ureg_writemask(oFog, TGSI_WRITEMASK_X);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1000,35 +1000,35 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
|
||||||
struct ureg_src input;
|
struct ureg_src input;
|
||||||
struct ureg_dst output;
|
struct ureg_dst output;
|
||||||
input = vs->aWgt;
|
input = vs->aWgt;
|
||||||
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 18);
|
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 19);
|
||||||
ureg_MOV(ureg, output, input);
|
ureg_MOV(ureg, output, input);
|
||||||
}
|
}
|
||||||
if (key->passthrough & (1 << NINE_DECLUSAGE_BLENDINDICES)) {
|
if (key->passthrough & (1 << NINE_DECLUSAGE_BLENDINDICES)) {
|
||||||
struct ureg_src input;
|
struct ureg_src input;
|
||||||
struct ureg_dst output;
|
struct ureg_dst output;
|
||||||
input = vs->aInd;
|
input = vs->aInd;
|
||||||
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 19);
|
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 20);
|
||||||
ureg_MOV(ureg, output, input);
|
ureg_MOV(ureg, output, input);
|
||||||
}
|
}
|
||||||
if (key->passthrough & (1 << NINE_DECLUSAGE_NORMAL)) {
|
if (key->passthrough & (1 << NINE_DECLUSAGE_NORMAL)) {
|
||||||
struct ureg_src input;
|
struct ureg_src input;
|
||||||
struct ureg_dst output;
|
struct ureg_dst output;
|
||||||
input = vs->aNrm;
|
input = vs->aNrm;
|
||||||
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 20);
|
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 21);
|
||||||
ureg_MOV(ureg, output, input);
|
ureg_MOV(ureg, output, input);
|
||||||
}
|
}
|
||||||
if (key->passthrough & (1 << NINE_DECLUSAGE_TANGENT)) {
|
if (key->passthrough & (1 << NINE_DECLUSAGE_TANGENT)) {
|
||||||
struct ureg_src input;
|
struct ureg_src input;
|
||||||
struct ureg_dst output;
|
struct ureg_dst output;
|
||||||
input = build_vs_add_input(vs, NINE_DECLUSAGE_TANGENT);
|
input = build_vs_add_input(vs, NINE_DECLUSAGE_TANGENT);
|
||||||
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 21);
|
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 22);
|
||||||
ureg_MOV(ureg, output, input);
|
ureg_MOV(ureg, output, input);
|
||||||
}
|
}
|
||||||
if (key->passthrough & (1 << NINE_DECLUSAGE_BINORMAL)) {
|
if (key->passthrough & (1 << NINE_DECLUSAGE_BINORMAL)) {
|
||||||
struct ureg_src input;
|
struct ureg_src input;
|
||||||
struct ureg_dst output;
|
struct ureg_dst output;
|
||||||
input = build_vs_add_input(vs, NINE_DECLUSAGE_BINORMAL);
|
input = build_vs_add_input(vs, NINE_DECLUSAGE_BINORMAL);
|
||||||
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 22);
|
output = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 23);
|
||||||
ureg_MOV(ureg, output, input);
|
ureg_MOV(ureg, output, input);
|
||||||
}
|
}
|
||||||
if (key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
|
if (key->passthrough & (1 << NINE_DECLUSAGE_FOG)) {
|
||||||
|
@ -1546,7 +1546,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
|
||||||
ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
|
ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
|
||||||
} else
|
} else
|
||||||
if (key->fog) {
|
if (key->fog) {
|
||||||
struct ureg_src vFog = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_FOG, 0, TGSI_INTERPOLATE_PERSPECTIVE);
|
struct ureg_src vFog = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 16, TGSI_INTERPOLATE_PERSPECTIVE);
|
||||||
ureg_LRP(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_XYZ), _XXXX(vFog), ps.rCurSrc, _CONST(21));
|
ureg_LRP(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_XYZ), _XXXX(vFog), ps.rCurSrc, _CONST(21));
|
||||||
ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
|
ureg_MOV(ureg, ureg_writemask(oCol, TGSI_WRITEMASK_W), ps.rCurSrc);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1299,7 +1299,7 @@ _tx_dst_param(struct shader_translator *tx, const struct sm1_dst_param *param)
|
||||||
case 1:
|
case 1:
|
||||||
if (ureg_dst_is_undef(tx->regs.oFog))
|
if (ureg_dst_is_undef(tx->regs.oFog))
|
||||||
tx->regs.oFog =
|
tx->regs.oFog =
|
||||||
ureg_saturate(ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_FOG, 0));
|
ureg_saturate(ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_GENERIC, 16));
|
||||||
dst = tx->regs.oFog;
|
dst = tx->regs.oFog;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -2039,15 +2039,16 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
|
||||||
* are close together or low.
|
* are close together or low.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* POSITION >= 1: 10 * index + 6
|
* POSITION >= 1: 10 * index + 7
|
||||||
* COLOR >= 2: 10 * (index-1) + 7
|
* COLOR >= 2: 10 * (index-1) + 8
|
||||||
|
* FOG: 16
|
||||||
* TEXCOORD[0..15]: index
|
* TEXCOORD[0..15]: index
|
||||||
* BLENDWEIGHT: 10 * index + 18
|
* BLENDWEIGHT: 10 * index + 19
|
||||||
* BLENDINDICES: 10 * index + 19
|
* BLENDINDICES: 10 * index + 20
|
||||||
* NORMAL: 10 * index + 20
|
* NORMAL: 10 * index + 21
|
||||||
* TANGENT: 10 * index + 21
|
* TANGENT: 10 * index + 22
|
||||||
* BINORMAL: 10 * index + 22
|
* BINORMAL: 10 * index + 23
|
||||||
* TESSFACTOR: 10 * index + 23
|
* TESSFACTOR: 10 * index + 24
|
||||||
*/
|
*/
|
||||||
|
|
||||||
switch (dcl->usage) {
|
switch (dcl->usage) {
|
||||||
|
@ -2059,7 +2060,7 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
|
||||||
sem->Index = 0;
|
sem->Index = 0;
|
||||||
} else {
|
} else {
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 6;
|
sem->Index = 10 * index + 7;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_COLOR:
|
case D3DDECLUSAGE_COLOR:
|
||||||
|
@ -2068,13 +2069,13 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
|
||||||
sem->Index = index;
|
sem->Index = index;
|
||||||
} else {
|
} else {
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * (index-1) + 7;
|
sem->Index = 10 * (index-1) + 8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_FOG:
|
case D3DDECLUSAGE_FOG:
|
||||||
assert(index == 0);
|
assert(index == 0);
|
||||||
sem->Name = TGSI_SEMANTIC_FOG;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 0;
|
sem->Index = 16;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_PSIZE:
|
case D3DDECLUSAGE_PSIZE:
|
||||||
assert(index == 0);
|
assert(index == 0);
|
||||||
|
@ -2091,27 +2092,27 @@ sm1_declusage_to_tgsi(struct tgsi_declaration_semantic *sem,
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_BLENDWEIGHT:
|
case D3DDECLUSAGE_BLENDWEIGHT:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 18;
|
sem->Index = 10 * index + 19;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_BLENDINDICES:
|
case D3DDECLUSAGE_BLENDINDICES:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 19;
|
sem->Index = 10 * index + 20;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_NORMAL:
|
case D3DDECLUSAGE_NORMAL:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 20;
|
sem->Index = 10 * index + 21;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_TANGENT:
|
case D3DDECLUSAGE_TANGENT:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 21;
|
sem->Index = 10 * index + 22;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_BINORMAL:
|
case D3DDECLUSAGE_BINORMAL:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 22;
|
sem->Index = 10 * index + 23;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_TESSFACTOR:
|
case D3DDECLUSAGE_TESSFACTOR:
|
||||||
sem->Name = TGSI_SEMANTIC_GENERIC;
|
sem->Name = TGSI_SEMANTIC_GENERIC;
|
||||||
sem->Index = 10 * index + 23;
|
sem->Index = 10 * index + 24;
|
||||||
break;
|
break;
|
||||||
case D3DDECLUSAGE_SAMPLE:
|
case D3DDECLUSAGE_SAMPLE:
|
||||||
sem->Name = TGSI_SEMANTIC_COUNT;
|
sem->Name = TGSI_SEMANTIC_COUNT;
|
||||||
|
@ -3735,7 +3736,7 @@ shader_add_ps_fog_stage(struct shader_translator *tx, struct ureg_src src_col)
|
||||||
ureg_MUL(ureg, fog_factor, tx_src_scalar(fog_factor), ureg_imm1f(ureg, -1.442695f));
|
ureg_MUL(ureg, fog_factor, tx_src_scalar(fog_factor), ureg_imm1f(ureg, -1.442695f));
|
||||||
ureg_EX2(ureg, fog_factor, tx_src_scalar(fog_factor));
|
ureg_EX2(ureg, fog_factor, tx_src_scalar(fog_factor));
|
||||||
} else {
|
} else {
|
||||||
fog_vs = ureg_scalar(ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_FOG, 0,
|
fog_vs = ureg_scalar(ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 16,
|
||||||
TGSI_INTERPOLATE_PERSPECTIVE),
|
TGSI_INTERPOLATE_PERSPECTIVE),
|
||||||
TGSI_SWIZZLE_X);
|
TGSI_SWIZZLE_X);
|
||||||
ureg_MOV(ureg, fog_factor, fog_vs);
|
ureg_MOV(ureg, fog_factor, fog_vs);
|
||||||
|
@ -3768,7 +3769,7 @@ static void parse_shader(struct shader_translator *tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_VS && tx->version.major < 3 && ureg_dst_is_undef(tx->regs.oFog) && info->fog_enable) {
|
if (IS_VS && tx->version.major < 3 && ureg_dst_is_undef(tx->regs.oFog) && info->fog_enable) {
|
||||||
tx->regs.oFog = ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_FOG, 0);
|
tx->regs.oFog = ureg_DECL_output(tx->ureg, TGSI_SEMANTIC_GENERIC, 16);
|
||||||
ureg_MOV(tx->ureg, ureg_writemask(tx->regs.oFog, TGSI_WRITEMASK_X), ureg_imm1f(tx->ureg, 0.0f));
|
ureg_MOV(tx->ureg, ureg_writemask(tx->regs.oFog, TGSI_WRITEMASK_X), ureg_imm1f(tx->ureg, 0.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue