fix color overflow in capture blending; fixes freedom wings
This commit is contained in:
parent
3856c0c5e9
commit
c0b302f4e4
|
@ -20,7 +20,9 @@ Graphics:
|
||||||
bug: fix backdrop blending with garbage
|
bug: fix backdrop blending with garbage
|
||||||
bug: fix 256B granularity sprite addressing for sub gpu
|
bug: fix 256B granularity sprite addressing for sub gpu
|
||||||
bug: fix 128-wide captures
|
bug: fix 128-wide captures
|
||||||
bug: swrast: add clear image emulation
|
bug: fix color overflow in capture blending
|
||||||
|
bug: swrast: add clear image and scroll emulation
|
||||||
|
bug: swrast: fixes to shadow rendering
|
||||||
|
|
||||||
Windows:
|
Windows:
|
||||||
bug: improve map view tool to support more modes
|
bug: improve map view tool to support more modes
|
||||||
|
|
|
@ -545,7 +545,7 @@ static void GPU_InitFadeColors()
|
||||||
for(int eva=0;eva<=16;eva++)
|
for(int eva=0;eva<=16;eva++)
|
||||||
for(int evb=0;evb<=16;evb++)
|
for(int evb=0;evb<=16;evb++)
|
||||||
{
|
{
|
||||||
int blend = ((c0 * eva / 16) + (c1 * evb / 16) );
|
int blend = ((c0 * eva) + (c1 * evb) ) / 16;
|
||||||
int final = std::min<int>(31,blend);
|
int final = std::min<int>(31,blend);
|
||||||
gpuBlendTable555[eva][evb][c0][c1] = final;
|
gpuBlendTable555[eva][evb][c0][c1] = final;
|
||||||
}
|
}
|
||||||
|
@ -2574,6 +2574,7 @@ template<bool SKIP> static void GPU_ligne_DispCapture(u16 l)
|
||||||
if ((srcA) && (srcB))
|
if ((srcA) && (srcB))
|
||||||
{
|
{
|
||||||
const int todo = (gpu->dispCapCnt.capx==DISPCAPCNT::_128?128:256);
|
const int todo = (gpu->dispCapCnt.capx==DISPCAPCNT::_128?128:256);
|
||||||
|
|
||||||
for(u16 i = 0; i < todo; i++)
|
for(u16 i = 0; i < todo; i++)
|
||||||
{
|
{
|
||||||
u16 a,r,g,b;
|
u16 a,r,g,b;
|
||||||
|
@ -2581,7 +2582,7 @@ template<bool SKIP> static void GPU_ligne_DispCapture(u16 l)
|
||||||
u16 a_alpha = srcA[i] & 0x8000;
|
u16 a_alpha = srcA[i] & 0x8000;
|
||||||
u16 b_alpha = srcB[i] & 0x8000;
|
u16 b_alpha = srcB[i] & 0x8000;
|
||||||
|
|
||||||
if (gpu->dispCapCnt.EVA && a_alpha)
|
if(a_alpha)
|
||||||
{
|
{
|
||||||
a = 0x8000;
|
a = 0x8000;
|
||||||
r = ((srcA[i] & 0x1F) * gpu->dispCapCnt.EVA);
|
r = ((srcA[i] & 0x1F) * gpu->dispCapCnt.EVA);
|
||||||
|
@ -2591,7 +2592,7 @@ template<bool SKIP> static void GPU_ligne_DispCapture(u16 l)
|
||||||
else
|
else
|
||||||
a = r = g = b = 0;
|
a = r = g = b = 0;
|
||||||
|
|
||||||
if (gpu->dispCapCnt.EVB && b_alpha)
|
if(b_alpha)
|
||||||
{
|
{
|
||||||
a = 0x8000;
|
a = 0x8000;
|
||||||
r += ((srcB[i] & 0x1F) * gpu->dispCapCnt.EVB);
|
r += ((srcB[i] & 0x1F) * gpu->dispCapCnt.EVB);
|
||||||
|
@ -2603,6 +2604,10 @@ template<bool SKIP> static void GPU_ligne_DispCapture(u16 l)
|
||||||
g >>= 4;
|
g >>= 4;
|
||||||
b >>= 4;
|
b >>= 4;
|
||||||
|
|
||||||
|
r = std::min((u16)31,r);
|
||||||
|
g = std::min((u16)31,g);
|
||||||
|
b = std::min((u16)31,b);
|
||||||
|
|
||||||
T2WriteWord(cap_dst, i << 1, a | (b << 10) | (g << 5) | r);
|
T2WriteWord(cap_dst, i << 1, a | (b << 10) | (g << 5) | r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -345,7 +345,8 @@ struct Shader
|
||||||
{
|
{
|
||||||
mode = (polyattr>>4)&0x3;
|
mode = (polyattr>>4)&0x3;
|
||||||
//if there is no texture set, then set to the mode which doesnt even use a texture
|
//if there is no texture set, then set to the mode which doesnt even use a texture
|
||||||
if(sampler.texFormat == 0 && mode == 0)
|
//unless we're in shadow
|
||||||
|
if(sampler.texFormat == 0 && mode != 3)
|
||||||
mode = 4;
|
mode = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue