as sl1nk3.s say make the updates directly to the viewport and let the scale fixed in 2^24.
please test specially in paper mario and Killer 7 that where games where supposedly this was used. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4470 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
264992456a
commit
08b2686d90
|
@ -31,7 +31,7 @@ static bool s_bZTextureTypeChanged;
|
||||||
static bool s_bDepthRangeChanged;
|
static bool s_bDepthRangeChanged;
|
||||||
static bool s_bFogColorChanged;
|
static bool s_bFogColorChanged;
|
||||||
static bool s_bFogParamChanged;
|
static bool s_bFogParamChanged;
|
||||||
static float lastDepthRange[4]; // 0 = far z, 1 = far - near, 2 = scale , 3 = offset
|
static float lastDepthRange[2]; // 0 = far z, 1 = far - near
|
||||||
static float lastRGBAfull[2][4][4];
|
static float lastRGBAfull[2][4][4];
|
||||||
static float lastCustomTexScale[8][2];
|
static float lastCustomTexScale[8][2];
|
||||||
static u8 s_nTexDimsChanged;
|
static u8 s_nTexDimsChanged;
|
||||||
|
@ -54,10 +54,6 @@ void PixelShaderManager::Init()
|
||||||
lastZBias = 0;
|
lastZBias = 0;
|
||||||
s_texturemask = 0;
|
s_texturemask = 0;
|
||||||
memset(lastRGBAfull, 0, sizeof(lastRGBAfull));
|
memset(lastRGBAfull, 0, sizeof(lastRGBAfull));
|
||||||
lastDepthRange[0]=16777216.0f;
|
|
||||||
lastDepthRange[1]=16777216.0f;
|
|
||||||
lastDepthRange[2]=16777216.0f;
|
|
||||||
lastDepthRange[3]=0.0f;
|
|
||||||
Dirty();
|
Dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +132,7 @@ void PixelShaderManager::SetConstants()
|
||||||
if (s_bZBiasChanged || s_bDepthRangeChanged)
|
if (s_bZBiasChanged || s_bDepthRangeChanged)
|
||||||
{
|
{
|
||||||
//ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias);
|
//ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias);
|
||||||
SetPSConstant4f(C_ZBIAS+1, (lastDepthRange[0] + lastDepthRange[3]) / lastDepthRange[2], (lastDepthRange[1] + lastDepthRange[3]) / lastDepthRange[2], 0, (float)( (((int)lastZBias<<8)>>8))/16777215.0f);
|
SetPSConstant4f(C_ZBIAS+1, lastDepthRange[0] / 16777216.0f, lastDepthRange[1] / 16777216.0f, 0, (float)( (((int)lastZBias<<8)>>8))/16777216.0f);
|
||||||
s_bZBiasChanged = s_bDepthRangeChanged = false;
|
s_bZBiasChanged = s_bDepthRangeChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,18 +328,18 @@ void PixelShaderManager::SetViewport(float* viewport)
|
||||||
|
|
||||||
void PixelShaderManager::SetZScale(float data)
|
void PixelShaderManager::SetZScale(float data)
|
||||||
{
|
{
|
||||||
if (lastDepthRange[2] != data)
|
if (lastDepthRange[0] != data)
|
||||||
{
|
{
|
||||||
lastDepthRange[2] = data;
|
lastDepthRange[0] = data;
|
||||||
s_bDepthRangeChanged = true;
|
s_bDepthRangeChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelShaderManager::SetZOffset(float data)
|
void PixelShaderManager::SetZOffset(float data)
|
||||||
{
|
{
|
||||||
if (lastDepthRange[3] != data)
|
if (lastDepthRange[1] != data)
|
||||||
{
|
{
|
||||||
lastDepthRange[3] = data;
|
lastDepthRange[1] = data;
|
||||||
s_bDepthRangeChanged = true;
|
s_bDepthRangeChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,9 +61,7 @@ void VertexShaderManager::Init()
|
||||||
Dirty();
|
Dirty();
|
||||||
|
|
||||||
memset(&xfregs, 0, sizeof(xfregs));
|
memset(&xfregs, 0, sizeof(xfregs));
|
||||||
memset(xfmem, 0, sizeof(xfmem));
|
memset(xfmem, 0, sizeof(xfmem));
|
||||||
xfregs.ZScale = 16777216.0f;
|
|
||||||
xfregs.Zoffset = 0.0f;
|
|
||||||
ResetView();
|
ResetView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,13 +452,13 @@ void VertexShaderManager::SetViewport(float* _Viewport)
|
||||||
|
|
||||||
void VertexShaderManager::SetZScale(float data)
|
void VertexShaderManager::SetZScale(float data)
|
||||||
{
|
{
|
||||||
xfregs.ZScale = data;
|
xfregs.rawViewport[5] = data;
|
||||||
bViewportChanged = true;
|
bViewportChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexShaderManager::SetZOffset(float data)
|
void VertexShaderManager::SetZOffset(float data)
|
||||||
{
|
{
|
||||||
xfregs.Zoffset = data;
|
xfregs.rawViewport[2] = data;
|
||||||
bViewportChanged = true;
|
bViewportChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,9 +227,7 @@ struct XFRegisters
|
||||||
TexCoordInfo texcoords[8];
|
TexCoordInfo texcoords[8];
|
||||||
bool bEnableDualTexTransform;
|
bool bEnableDualTexTransform;
|
||||||
float rawViewport[6];
|
float rawViewport[6];
|
||||||
float rawProjection[7];
|
float rawProjection[7];
|
||||||
float ZScale;
|
|
||||||
float Zoffset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -611,8 +611,8 @@ void UpdateViewport()
|
||||||
vp.Width = (int)ceil(abs((int)(2 * xfregs.rawViewport[0])) * MValueX);
|
vp.Width = (int)ceil(abs((int)(2 * xfregs.rawViewport[0])) * MValueX);
|
||||||
vp.Height = (int)ceil(abs((int)(2 * xfregs.rawViewport[1])) * MValueY);
|
vp.Height = (int)ceil(abs((int)(2 * xfregs.rawViewport[1])) * MValueY);
|
||||||
//new depth equation , don't know if is correct but...
|
//new depth equation , don't know if is correct but...
|
||||||
vp.MinZ = (xfregs.rawViewport[5] - xfregs.rawViewport[2]+xfregs.Zoffset) / xfregs.ZScale;
|
vp.MinZ = (xfregs.rawViewport[5] - xfregs.rawViewport[2]) / 16777216.0f;
|
||||||
vp.MaxZ = (xfregs.rawViewport[5] + xfregs.Zoffset) / xfregs.ZScale;
|
vp.MaxZ = xfregs.rawViewport[5] / 16777216.0f;
|
||||||
|
|
||||||
// This seems to happen a lot - the above calc is probably wrong.
|
// This seems to happen a lot - the above calc is probably wrong.
|
||||||
if (vp.MinZ < 0.0f) vp.MinZ = 0.0f;
|
if (vp.MinZ < 0.0f) vp.MinZ = 0.0f;
|
||||||
|
|
|
@ -1345,8 +1345,8 @@ void UpdateViewport()
|
||||||
int GLWidth = (int)ceil(abs((int)(2 * xfregs.rawViewport[0])) * MValueX);
|
int GLWidth = (int)ceil(abs((int)(2 * xfregs.rawViewport[0])) * MValueX);
|
||||||
int GLHeight = (int)ceil(abs((int)(2 * xfregs.rawViewport[1])) * MValueY);
|
int GLHeight = (int)ceil(abs((int)(2 * xfregs.rawViewport[1])) * MValueY);
|
||||||
//new dept equation , don't know if is correct but...
|
//new dept equation , don't know if is correct but...
|
||||||
double GLNear = (xfregs.rawViewport[5] - xfregs.rawViewport[2] + xfregs.Zoffset) / xfregs.ZScale;
|
double GLNear = (xfregs.rawViewport[5] - xfregs.rawViewport[2]) / 16777216.0f;
|
||||||
double GLFar = (xfregs.rawViewport[5] + xfregs.Zoffset) / xfregs.ZScale;
|
double GLFar = xfregs.rawViewport[5] / 16777216.0f;
|
||||||
|
|
||||||
// Update the view port
|
// Update the view port
|
||||||
glViewport(GLx, GLy, GLWidth, GLHeight);
|
glViewport(GLx, GLy, GLWidth, GLHeight);
|
||||||
|
|
Loading…
Reference in New Issue