mirror of https://github.com/PCSX2/pcsx2.git
GSdx: just squeezing a few more fps.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1534 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
800039c829
commit
e58776e095
|
@ -162,7 +162,7 @@ void GPURenderer::VSync()
|
|||
|
||||
GetClientRect(m_hWnd, r);
|
||||
|
||||
m_dev->Present(r.fit(m_aspectratio), 0);
|
||||
m_dev->Present(r.fit(m_aspectratio), 0, true);
|
||||
}
|
||||
|
||||
bool GPURenderer::MakeSnapshot(const string& path)
|
||||
|
|
|
@ -303,7 +303,7 @@ EXPORT_C GSsetFrameSkip(int frameskip)
|
|||
|
||||
EXPORT_C GSsetFrameLimit(int limit)
|
||||
{
|
||||
s_gs->SetFrameLimit(limit);
|
||||
s_gs->SetFrameLimit(limit != 0);
|
||||
}
|
||||
|
||||
#ifdef _WINDOWS
|
||||
|
|
|
@ -815,7 +815,7 @@ REG64_(GIFReg, TEX1)
|
|||
uint32 _PAD2:9;
|
||||
uint32 L:2;
|
||||
uint32 _PAD3:11;
|
||||
uint32 K:12;
|
||||
uint32 K:12; // TODO: 1:7:4 (signed? 16x scaled?)
|
||||
uint32 _PAD4:20;
|
||||
REG_END2
|
||||
|
||||
|
|
|
@ -314,43 +314,56 @@ void GSClut::GetAlphaMinMax32(int& amin, int& amax)
|
|||
{
|
||||
m_read.adirty = false;
|
||||
|
||||
// uint32 bpp = GSLocalMemory::m_psm[m_read.TEX0.PSM].trbpp;
|
||||
uint32 cbpp = GSLocalMemory::m_psm[m_read.TEX0.CPSM].trbpp;
|
||||
uint32 pal = GSLocalMemory::m_psm[m_read.TEX0.PSM].pal;
|
||||
|
||||
if(cbpp == 24 && m_read.TEXA.AEM == 0)
|
||||
if(GSLocalMemory::m_psm[m_read.TEX0.CPSM].trbpp == 24 && m_read.TEXA.AEM == 0)
|
||||
{
|
||||
m_read.amin = m_read.TEXA.TA0;
|
||||
m_read.amax = m_read.TEXA.TA0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int amin = 255;
|
||||
int amax = 0;
|
||||
|
||||
const GSVector4i* p = (const GSVector4i*)m_buff32;
|
||||
|
||||
for(int i = 0, j = pal >> 4; i < j; i++)
|
||||
GSVector4i amin, amax;
|
||||
|
||||
if(GSLocalMemory::m_psm[m_read.TEX0.PSM].pal == 256)
|
||||
{
|
||||
GSVector4i v0 = (p[i * 4 + 0] >> 24).ps32(p[i * 4 + 1] >> 24);
|
||||
GSVector4i v1 = (p[i * 4 + 2] >> 24).ps32(p[i * 4 + 3] >> 24);
|
||||
amin = GSVector4i::xffffffff();
|
||||
amax = GSVector4i::zero();
|
||||
|
||||
GSVector4i v2 = v0.min_i16(v1);
|
||||
GSVector4i v3 = v0.max_i16(v1);
|
||||
for(int i = 0; i < 16; i++)
|
||||
{
|
||||
GSVector4i v0 = (p[i * 4 + 0] >> 24).ps32(p[i * 4 + 1] >> 24);
|
||||
GSVector4i v1 = (p[i * 4 + 2] >> 24).ps32(p[i * 4 + 3] >> 24);
|
||||
GSVector4i v2 = v0.pu16(v1);
|
||||
|
||||
v2 = v2.min_i16(v2.zwxy());
|
||||
v3 = v3.max_i16(v3.zwxy());
|
||||
v2 = v2.min_i16(v2.zwxyl());
|
||||
v3 = v3.max_i16(v3.zwxyl());
|
||||
v2 = v2.min_i16(v2.yxwzl());
|
||||
v3 = v3.max_i16(v3.yxwzl());
|
||||
amin = amin.min_u8(v2);
|
||||
amax = amax.max_u8(v2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(GSLocalMemory::m_psm[m_read.TEX0.PSM].pal == 16);
|
||||
|
||||
amin = min(amin, v2.extract16<0>());
|
||||
amax = max(amax, v3.extract16<0>());
|
||||
GSVector4i v0 = (p[0] >> 24).ps32(p[1] >> 24);
|
||||
GSVector4i v1 = (p[2] >> 24).ps32(p[3] >> 24);
|
||||
GSVector4i v2 = v0.pu16(v1);
|
||||
|
||||
amin = v2;
|
||||
amax = v2;
|
||||
}
|
||||
|
||||
m_read.amin = amin;
|
||||
m_read.amax = amax;
|
||||
amin = amin.min_u8(amin.zwxy());
|
||||
amax = amax.max_u8(amax.zwxy());
|
||||
amin = amin.min_u8(amin.zwxyl());
|
||||
amax = amax.max_u8(amax.zwxyl());
|
||||
amin = amin.min_u8(amin.yxwzl());
|
||||
amax = amax.max_u8(amax.yxwzl());
|
||||
|
||||
GSVector4i v0 = amin.upl8(amax).u8to16();
|
||||
GSVector4i v1 = v0.yxwz();
|
||||
|
||||
m_read.amin = v0.min_i16(v1).extract16<0>();
|
||||
m_read.amax = v0.max_i16(v1).extract16<1>();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -89,6 +89,7 @@ CRC::Game CRC::m_games[] =
|
|||
{0x7D8F539A, SoTC, EU, 0},
|
||||
{0x3122B508, OnePieceGrandAdventure, US, 0},
|
||||
{0x8DF14A24, OnePieceGrandAdventure, Unknown, 0},
|
||||
{0xB049DD5E, OnePieceGrandBattle, US, 0},
|
||||
{0x5D02CC5B, OnePieceGrandBattle, Unknown, 0},
|
||||
{0x6F8545DB, ICO, US, 0},
|
||||
{0xB01A4C95, ICO, JP, 0},
|
||||
|
|
|
@ -75,14 +75,14 @@ bool GSDevice::Reset(int w, int h, int mode)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GSDevice::Present(const GSVector4i& r, int shader)
|
||||
void GSDevice::Present(const GSVector4i& r, int shader, bool limit)
|
||||
{
|
||||
GSVector4i cr = m_wnd->GetClientRect();
|
||||
|
||||
int w = std::max(cr.width(), 1);
|
||||
int h = std::max(cr.height(), 1);
|
||||
|
||||
if(!m_backbuffer || m_backbuffer->GetWidth() != w || m_backbuffer->GetHeight() != h)
|
||||
if(!m_backbuffer || m_backbuffer->m_size.x != w || m_backbuffer->m_size.y != h)
|
||||
{
|
||||
if(!Reset(w, h, DontCare))
|
||||
{
|
||||
|
@ -99,7 +99,7 @@ void GSDevice::Present(const GSVector4i& r, int shader)
|
|||
StretchRect(m_current, m_backbuffer, GSVector4(r), s_shader[shader]);
|
||||
}
|
||||
|
||||
Flip();
|
||||
Flip(limit);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::Fetch(int type, int w, int h, int format)
|
||||
|
@ -240,7 +240,7 @@ bool GSDevice::ResizeTexture(GSTexture** t, int w, int h)
|
|||
|
||||
GSTexture* t2 = *t;
|
||||
|
||||
if(t2 == NULL || t2->GetWidth() != w || t2->GetHeight() != h)
|
||||
if(t2 == NULL || t2->m_size.x != w || t2->m_size.y != h)
|
||||
{
|
||||
delete t2;
|
||||
|
||||
|
@ -251,8 +251,3 @@ bool GSDevice::ResizeTexture(GSTexture** t, int w, int h)
|
|||
|
||||
return t2 != NULL;
|
||||
}
|
||||
|
||||
void GSDevice::SetVSync(bool vsync)
|
||||
{
|
||||
m_vsync = vsync;
|
||||
}
|
||||
|
|
|
@ -79,8 +79,8 @@ public:
|
|||
virtual bool Create(GSWnd* wnd, bool vsync);
|
||||
virtual bool Reset(int w, int h, int mode);
|
||||
virtual bool IsLost(bool update = false) {return false;}
|
||||
virtual void Present(const GSVector4i& r, int shader);
|
||||
virtual void Flip() {}
|
||||
virtual void Present(const GSVector4i& r, int shader, bool limit);
|
||||
virtual void Flip(bool limit) {}
|
||||
|
||||
virtual void BeginScene() {}
|
||||
virtual void DrawPrimitive() {};
|
||||
|
@ -103,8 +103,6 @@ public:
|
|||
virtual void StretchRect(GSTexture* st, GSTexture* dt, const GSVector4& dr, int shader = 0, bool linear = true);
|
||||
virtual void StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt, const GSVector4& dr, int shader = 0, bool linear = true) {}
|
||||
|
||||
virtual void SetVSync(bool vsync);
|
||||
|
||||
GSTexture* GetCurrent();
|
||||
|
||||
void Merge(GSTexture* st[2], GSVector4* sr, GSVector4* dr, const GSVector2i& fs, bool slbg, bool mmod, const GSVector4& c);
|
||||
|
|
|
@ -231,9 +231,9 @@ bool GSDevice10::Reset(int w, int h, int mode)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GSDevice10::Flip()
|
||||
void GSDevice10::Flip(bool limit)
|
||||
{
|
||||
m_swapchain->Present(m_vsync ? 1 : 0, 0);
|
||||
m_swapchain->Present(m_vsync && limit ? 1 : 0, 0);
|
||||
}
|
||||
|
||||
void GSDevice10::BeginScene()
|
||||
|
@ -456,7 +456,7 @@ void GSDevice10::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt,
|
|||
|
||||
// rs
|
||||
|
||||
RSSet(ds.x, ds.y);
|
||||
RSSet(ds);
|
||||
|
||||
//
|
||||
|
||||
|
@ -665,9 +665,9 @@ void GSDevice10::PSSetSamplerState(ID3D10SamplerState* ss0, ID3D10SamplerState*
|
|||
}
|
||||
}
|
||||
|
||||
void GSDevice10::RSSet(int width, int height, const GSVector4i* scissor)
|
||||
void GSDevice10::RSSet(const GSVector2i& size, const GSVector4i* scissor)
|
||||
{
|
||||
if(m_viewport.x != width || m_viewport.y != height)
|
||||
if(m_viewport != size)
|
||||
{
|
||||
D3D10_VIEWPORT vp;
|
||||
|
||||
|
@ -675,17 +675,17 @@ void GSDevice10::RSSet(int width, int height, const GSVector4i* scissor)
|
|||
|
||||
vp.TopLeftX = 0;
|
||||
vp.TopLeftY = 0;
|
||||
vp.Width = width;
|
||||
vp.Height = height;
|
||||
vp.Width = size.x;
|
||||
vp.Height = size.y;
|
||||
vp.MinDepth = 0.0f;
|
||||
vp.MaxDepth = 1.0f;
|
||||
|
||||
m_dev->RSSetViewports(1, &vp);
|
||||
|
||||
m_viewport = GSVector2i(width, height);
|
||||
m_viewport = size;
|
||||
}
|
||||
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(0, 0, width, height);
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(size).zwxy();
|
||||
|
||||
if(!m_scissor.eq(r))
|
||||
{
|
||||
|
|
|
@ -97,7 +97,7 @@ public:
|
|||
|
||||
bool Create(GSWnd* wnd, bool vsync);
|
||||
bool Reset(int w, int h, int mode);
|
||||
void Flip();
|
||||
void Flip(bool limit);
|
||||
|
||||
void BeginScene();
|
||||
void DrawPrimitive();
|
||||
|
@ -130,7 +130,7 @@ public:
|
|||
void PSSetShaderResources(GSTexture* sr0, GSTexture* sr1);
|
||||
void PSSetShader(ID3D10PixelShader* ps, ID3D10Buffer* ps_cb);
|
||||
void PSSetSamplerState(ID3D10SamplerState* ss0, ID3D10SamplerState* ss1);
|
||||
void RSSet(int width, int height, const GSVector4i* scissor = NULL);
|
||||
void RSSet(const GSVector2i& size, const GSVector4i* scissor = NULL);
|
||||
void OMSetDepthStencilState(ID3D10DepthStencilState* dss, uint8 sref);
|
||||
void OMSetBlendState(ID3D10BlendState* bs, float bf);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds);
|
||||
|
|
|
@ -268,9 +268,9 @@ bool GSDevice11::Reset(int w, int h, int mode)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GSDevice11::Flip()
|
||||
void GSDevice11::Flip(bool limit)
|
||||
{
|
||||
m_swapchain->Present(m_vsync ? 1 : 0, 0);
|
||||
m_swapchain->Present(m_vsync && limit ? 1 : 0, 0);
|
||||
}
|
||||
|
||||
void GSDevice11::BeginScene()
|
||||
|
@ -493,7 +493,7 @@ void GSDevice11::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt,
|
|||
|
||||
// rs
|
||||
|
||||
RSSet(ds.x, ds.y);
|
||||
RSSet(ds);
|
||||
|
||||
//
|
||||
|
||||
|
@ -702,9 +702,9 @@ void GSDevice11::PSSetSamplerState(ID3D11SamplerState* ss0, ID3D11SamplerState*
|
|||
}
|
||||
}
|
||||
|
||||
void GSDevice11::RSSet(int width, int height, const GSVector4i* scissor)
|
||||
void GSDevice11::RSSet(const GSVector2i& size, const GSVector4i* scissor)
|
||||
{
|
||||
if(m_viewport.x != width || m_viewport.y != height)
|
||||
if(m_viewport != size)
|
||||
{
|
||||
D3D11_VIEWPORT vp;
|
||||
|
||||
|
@ -712,17 +712,17 @@ void GSDevice11::RSSet(int width, int height, const GSVector4i* scissor)
|
|||
|
||||
vp.TopLeftX = 0;
|
||||
vp.TopLeftY = 0;
|
||||
vp.Width = width;
|
||||
vp.Height = height;
|
||||
vp.Width = size.x;
|
||||
vp.Height = size.y;
|
||||
vp.MinDepth = 0.0f;
|
||||
vp.MaxDepth = 1.0f;
|
||||
|
||||
m_ctx->RSSetViewports(1, &vp);
|
||||
|
||||
m_viewport = GSVector2i(width, height);
|
||||
m_viewport = size;
|
||||
}
|
||||
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(0, 0, width, height);
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(size).zwxy();
|
||||
|
||||
if(!m_scissor.eq(r))
|
||||
{
|
||||
|
|
|
@ -100,7 +100,7 @@ public:
|
|||
|
||||
bool Create(GSWnd* wnd, bool vsync);
|
||||
bool Reset(int w, int h, int mode);
|
||||
void Flip();
|
||||
void Flip(bool limit);
|
||||
|
||||
void BeginScene();
|
||||
void DrawPrimitive();
|
||||
|
@ -133,7 +133,7 @@ public:
|
|||
void PSSetShaderResources(GSTexture* sr0, GSTexture* sr1);
|
||||
void PSSetShader(ID3D11PixelShader* ps, ID3D11Buffer* ps_cb);
|
||||
void PSSetSamplerState(ID3D11SamplerState* ss0, ID3D11SamplerState* ss1);
|
||||
void RSSet(int width, int height, const GSVector4i* scissor = NULL);
|
||||
void RSSet(const GSVector2i& size, const GSVector4i* scissor = NULL);
|
||||
void OMSetDepthStencilState(ID3D11DepthStencilState* dss, uint8 sref);
|
||||
void OMSetBlendState(ID3D11BlendState* bs, float bf);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds);
|
||||
|
|
|
@ -136,7 +136,7 @@ bool GSDevice7::Reset(int w, int h, int mode)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GSDevice7::Present(const GSVector4i& r, int shader)
|
||||
void GSDevice7::Present(const GSVector4i& r, int shader, bool limit)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
|
@ -145,7 +145,7 @@ void GSDevice7::Present(const GSVector4i& r, int shader)
|
|||
int w = std::max(cr.width(), 1);
|
||||
int h = std::max(cr.height(), 1);
|
||||
|
||||
if(!m_backbuffer || m_backbuffer->GetWidth() != w || m_backbuffer->GetHeight() != h)
|
||||
if(!m_backbuffer || m_backbuffer->m_size.x != w || m_backbuffer->m_size.y != h)
|
||||
{
|
||||
if(!Reset(w, h, DontCare))
|
||||
{
|
||||
|
@ -177,7 +177,7 @@ void GSDevice7::Present(const GSVector4i& r, int shader)
|
|||
|
||||
MapWindowPoints((HWND)m_wnd->GetHandle(), HWND_DESKTOP, (POINT*)&r2, 2);
|
||||
|
||||
if(m_vsync)
|
||||
if(m_vsync && limit)
|
||||
{
|
||||
hr = m_dd->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL);
|
||||
}
|
||||
|
|
|
@ -43,5 +43,5 @@ public:
|
|||
bool Create(GSWnd* wnd, bool vsync);
|
||||
bool Reset(int w, int h, int mode);
|
||||
bool IsLost(bool update) {return m_lost;}
|
||||
void Present(const GSVector4i& r, int shader);
|
||||
void Present(const GSVector4i& r, int shader, bool limit);
|
||||
};
|
||||
|
|
|
@ -348,7 +348,7 @@ bool GSDevice9::IsLost(bool update)
|
|||
return m_lost;
|
||||
}
|
||||
|
||||
void GSDevice9::Flip()
|
||||
void GSDevice9::Flip(bool limit)
|
||||
{
|
||||
m_dev->EndScene();
|
||||
|
||||
|
@ -427,7 +427,7 @@ void GSDevice9::ClearRenderTarget(GSTexture* rt, uint32 c)
|
|||
|
||||
void GSDevice9::ClearDepth(GSTexture* t, float c)
|
||||
{
|
||||
GSTexture* rt = CreateRenderTarget(t->GetWidth(), t->GetHeight());
|
||||
GSTexture* rt = CreateRenderTarget(t->m_size.x, t->m_size.y);
|
||||
|
||||
CComPtr<IDirect3DSurface9> rtsurface;
|
||||
CComPtr<IDirect3DSurface9> dssurface;
|
||||
|
@ -448,7 +448,7 @@ void GSDevice9::ClearDepth(GSTexture* t, float c)
|
|||
|
||||
void GSDevice9::ClearStencil(GSTexture* t, uint8 c)
|
||||
{
|
||||
GSTexture* rt = CreateRenderTarget(t->GetWidth(), t->GetHeight());
|
||||
GSTexture* rt = CreateRenderTarget(t->m_size.x, t->m_size.y);
|
||||
|
||||
CComPtr<IDirect3DSurface9> rtsurface;
|
||||
CComPtr<IDirect3DSurface9> dssurface;
|
||||
|
@ -637,7 +637,7 @@ void GSDevice9::StretchRect(GSTexture* st, const GSVector4& sr, GSTexture* dt, c
|
|||
|
||||
// rs
|
||||
|
||||
RSSet(ds.x, ds.y);
|
||||
RSSet(ds);
|
||||
|
||||
//
|
||||
|
||||
|
@ -865,9 +865,9 @@ void GSDevice9::PSSetSamplerState(Direct3DSamplerState9* ss)
|
|||
}
|
||||
}
|
||||
|
||||
void GSDevice9::RSSet(int width, int height, const GSVector4i* scissor)
|
||||
void GSDevice9::RSSet(const GSVector2i& size, const GSVector4i* scissor)
|
||||
{
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(0, 0, width, height);
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(size).zwxy();
|
||||
|
||||
if(!m_scissor.eq(r))
|
||||
{
|
||||
|
|
|
@ -135,7 +135,7 @@ public:
|
|||
bool Create(GSWnd* wnd, bool vsync);
|
||||
bool Reset(int w, int h, int mode);
|
||||
bool IsLost(bool update);
|
||||
void Flip();
|
||||
void Flip(bool limit);
|
||||
|
||||
void BeginScene();
|
||||
void DrawPrimitive();
|
||||
|
@ -167,7 +167,7 @@ public:
|
|||
void PSSetShaderResources(GSTexture* sr0, GSTexture* sr1);
|
||||
void PSSetShader(IDirect3DPixelShader9* ps, const float* ps_cb, int ps_cb_len);
|
||||
void PSSetSamplerState(Direct3DSamplerState9* ss);
|
||||
void RSSet(int width, int height, const GSVector4i* scissor = NULL);
|
||||
void RSSet(const GSVector2i& size, const GSVector4i* scissor = NULL);
|
||||
void OMSetDepthStencilState(Direct3DDepthStencilState9* dss);
|
||||
void OMSetBlendState(Direct3DBlendState9* bs, uint32 bf);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds);
|
||||
|
|
|
@ -185,16 +185,16 @@ bool GSDeviceOGL::Reset(int w, int h, int mode)
|
|||
return true;
|
||||
}
|
||||
|
||||
void GSDeviceOGL::Present(const GSVector4i& r, int shader)
|
||||
void GSDeviceOGL::Present(const GSVector4i& r, int shader, bool limit)
|
||||
{
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, 0); CheckError();
|
||||
|
||||
// TODO: m_current => backbuffer
|
||||
|
||||
Flip();
|
||||
Flip(limit);
|
||||
}
|
||||
|
||||
void GSDeviceOGL::Flip()
|
||||
void GSDeviceOGL::Flip(bool limit)
|
||||
{
|
||||
#ifdef _WINDOWS
|
||||
|
||||
|
@ -438,16 +438,16 @@ void GSDeviceOGL::PSSetSamplerState(SamplerStateOGL* ss)
|
|||
}
|
||||
}
|
||||
|
||||
void GSDeviceOGL::RSSet(int width, int height, const GSVector4i* scissor)
|
||||
void GSDeviceOGL::RSSet(const GSVector2i& size, const GSVector4i* scissor)
|
||||
{
|
||||
if(m_viewport.x != width || m_viewport.y != height)
|
||||
if(m_viewport != size)
|
||||
{
|
||||
glViewport(0, 0, width, height); CheckError();
|
||||
glViewport(0, 0, size.x, size.y); CheckError();
|
||||
|
||||
m_viewport = GSVector2i(width, height);
|
||||
m_viewport = size;
|
||||
}
|
||||
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(0, 0, width, height);
|
||||
GSVector4i r = scissor ? *scissor : GSVector4i(size).zwxy();
|
||||
|
||||
if(!m_scissor.eq(r))
|
||||
{
|
||||
|
|
|
@ -111,8 +111,8 @@ public:
|
|||
|
||||
bool Create(GSWnd* wnd, bool vsync);
|
||||
bool Reset(int w, int h, int mode);
|
||||
void Present(const GSVector4i& r, int shader);
|
||||
void Flip();
|
||||
void Present(const GSVector4i& r, int shader, bool limit);
|
||||
void Flip(bool limit);
|
||||
|
||||
void BeginScene();
|
||||
void DrawPrimitive();
|
||||
|
@ -139,7 +139,7 @@ public:
|
|||
void IASetPrimitiveTopology(int topology);
|
||||
|
||||
void PSSetSamplerState(SamplerStateOGL* ss);
|
||||
void RSSet(int width, int height, const GSVector4i* scissor);
|
||||
void RSSet(const GSVector2i& size, const GSVector4i* scissor);
|
||||
void OMSetDepthStencilState(DepthStencilStateOGL* dss);
|
||||
void OMSetBlendState(BlendStateOGL* bs, float bf);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds);
|
||||
|
|
|
@ -66,14 +66,14 @@ int GSLocalMemory::rowOffset16SZ[2048];
|
|||
int GSLocalMemory::rowOffset8[2][2048];
|
||||
int GSLocalMemory::rowOffset4[2][2048];
|
||||
|
||||
int GSLocalMemory::blockOffset32[256];
|
||||
int GSLocalMemory::blockOffset32Z[256];
|
||||
int GSLocalMemory::blockOffset16[256];
|
||||
int GSLocalMemory::blockOffset16S[256];
|
||||
int GSLocalMemory::blockOffset16Z[256];
|
||||
int GSLocalMemory::blockOffset16SZ[256];
|
||||
int GSLocalMemory::blockOffset8[256];
|
||||
int GSLocalMemory::blockOffset4[256];
|
||||
short GSLocalMemory::blockOffset32[256];
|
||||
short GSLocalMemory::blockOffset32Z[256];
|
||||
short GSLocalMemory::blockOffset16[256];
|
||||
short GSLocalMemory::blockOffset16S[256];
|
||||
short GSLocalMemory::blockOffset16Z[256];
|
||||
short GSLocalMemory::blockOffset16SZ[256];
|
||||
short GSLocalMemory::blockOffset8[256];
|
||||
short GSLocalMemory::blockOffset4[256];
|
||||
|
||||
//
|
||||
|
||||
|
@ -159,42 +159,42 @@ GSLocalMemory::GSLocalMemory()
|
|||
|
||||
for(int x = 0; x < countof(blockOffset32); x++)
|
||||
{
|
||||
blockOffset32[x] = (int)BlockNumber32(x << 3, 0, 0, 32) - (int)BlockNumber32(0, 0, 0, 32);
|
||||
blockOffset32[x] = (short)((int)BlockNumber32(x << 3, 0, 0, 32) - (int)BlockNumber32(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset32Z); x++)
|
||||
{
|
||||
blockOffset32Z[x] = (int)BlockNumber32Z(x << 3, 0, 0, 32) - (int)BlockNumber32Z(0, 0, 0, 32);
|
||||
blockOffset32Z[x] = (short)((int)BlockNumber32Z(x << 3, 0, 0, 32) - (int)BlockNumber32Z(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset16); x++)
|
||||
{
|
||||
blockOffset16[x] = (int)BlockNumber16(x << 3, 0, 0, 32) - (int)BlockNumber16(0, 0, 0, 32);
|
||||
blockOffset16[x] = (short)((int)BlockNumber16(x << 3, 0, 0, 32) - (int)BlockNumber16(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset16S); x++)
|
||||
{
|
||||
blockOffset16S[x] = (int)BlockNumber16S(x << 3, 0, 0, 32) - (int)BlockNumber16S(0, 0, 0, 32);
|
||||
blockOffset16S[x] = (short)((int)BlockNumber16S(x << 3, 0, 0, 32) - (int)BlockNumber16S(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset16Z); x++)
|
||||
{
|
||||
blockOffset16Z[x] = (int)BlockNumber16Z(x << 3, 0, 0, 32) - (int)BlockNumber16Z(0, 0, 0, 32);
|
||||
blockOffset16Z[x] = (short)((int)BlockNumber16Z(x << 3, 0, 0, 32) - (int)BlockNumber16Z(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset16SZ); x++)
|
||||
{
|
||||
blockOffset16SZ[x] = (int)BlockNumber16SZ(x << 3, 0, 0, 32) - (int)BlockNumber16SZ(0, 0, 0, 32);
|
||||
blockOffset16SZ[x] = (short)((int)BlockNumber16SZ(x << 3, 0, 0, 32) - (int)BlockNumber16SZ(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset8); x++)
|
||||
{
|
||||
blockOffset8[x] = (int)BlockNumber8(x << 3, 0, 0, 32) - (int)BlockNumber8(0, 0, 0, 32);
|
||||
blockOffset8[x] = (short)((int)BlockNumber8(x << 3, 0, 0, 32) - (int)BlockNumber8(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int x = 0; x < countof(blockOffset4); x++)
|
||||
{
|
||||
blockOffset4[x] = (int)BlockNumber4(x << 3, 0, 0, 32) - (int)BlockNumber4(0, 0, 0, 32);
|
||||
blockOffset4[x] = (short)((int)BlockNumber4(x << 3, 0, 0, 32) - (int)BlockNumber4(0, 0, 0, 32));
|
||||
}
|
||||
|
||||
for(int i = 0; i < countof(m_psm); i++)
|
||||
|
@ -417,9 +417,6 @@ GSLocalMemory::GSLocalMemory()
|
|||
m_psm[PSM_PSMZ16].rtxbP = &GSLocalMemory::ReadTextureBlock16Z;
|
||||
m_psm[PSM_PSMZ16S].rtxbP = &GSLocalMemory::ReadTextureBlock16SZ;
|
||||
|
||||
m_psm[PSM_PSMT8].pal = m_psm[PSM_PSMT8H].pal = 256;
|
||||
m_psm[PSM_PSMT4].pal = m_psm[PSM_PSMT4HL].pal = m_psm[PSM_PSMT4HH].pal = 16;
|
||||
|
||||
m_psm[PSM_PSMCT16].bpp = m_psm[PSM_PSMCT16S].bpp = 16;
|
||||
m_psm[PSM_PSMT8].bpp = 8;
|
||||
m_psm[PSM_PSMT4].bpp = 4;
|
||||
|
@ -432,6 +429,15 @@ GSLocalMemory::GSLocalMemory()
|
|||
m_psm[PSM_PSMZ24].trbpp = 24;
|
||||
m_psm[PSM_PSMZ16].trbpp = m_psm[PSM_PSMZ16S].trbpp = 16;
|
||||
|
||||
m_psm[PSM_PSMT8].pal = m_psm[PSM_PSMT8H].pal = 256;
|
||||
m_psm[PSM_PSMT4].pal = m_psm[PSM_PSMT4HL].pal = m_psm[PSM_PSMT4HH].pal = 16;
|
||||
|
||||
for(int i = 0; i < countof(m_psm); i++) m_psm[i].fmt = 3;
|
||||
m_psm[PSM_PSMCT32].fmt = m_psm[PSM_PSMZ32].fmt = 0;
|
||||
m_psm[PSM_PSMCT24].fmt = m_psm[PSM_PSMZ24].fmt = 1;
|
||||
m_psm[PSM_PSMCT16].fmt = m_psm[PSM_PSMZ16].fmt = 2;
|
||||
m_psm[PSM_PSMCT16S].fmt = m_psm[PSM_PSMZ16S].fmt = 2;
|
||||
|
||||
m_psm[PSM_PSMCT16].bs = m_psm[PSM_PSMCT16S].bs = GSVector2i(16, 8);
|
||||
m_psm[PSM_PSMT8].bs = GSVector2i(16, 16);
|
||||
m_psm[PSM_PSMT4].bs = GSVector2i(32, 16);
|
||||
|
@ -489,7 +495,7 @@ GSLocalMemory::BlockOffset* GSLocalMemory::GetBlockOffset(uint32 bp, uint32 bw,
|
|||
|
||||
for(int i = 0; i < 256; i++)
|
||||
{
|
||||
o->row[i] = (int)bn(0, i << 3, bp, bw);
|
||||
o->row[i] = (short)bn(0, i << 3, bp, bw);
|
||||
}
|
||||
|
||||
o->col = m_psm[psm].blockOffset;
|
||||
|
|
|
@ -62,11 +62,10 @@ public:
|
|||
readImage ri;
|
||||
readTexture rtx, rtxNP, rtxP;
|
||||
readTextureBlock rtxb, rtxbP;
|
||||
short bpp, trbpp;
|
||||
int pal;
|
||||
uint16 bpp, trbpp, pal, fmt;
|
||||
GSVector2i bs, pgs;
|
||||
int* rowOffset[8];
|
||||
int* blockOffset;
|
||||
short* blockOffset;
|
||||
};
|
||||
|
||||
uint8 dummy[128];
|
||||
|
@ -83,8 +82,8 @@ public:
|
|||
|
||||
struct BlockOffset
|
||||
{
|
||||
int row[256]; // yn (n = 0 8 16 ...)
|
||||
int* col; // blockOffset*
|
||||
short row[256]; // yn (n = 0 8 16 ...)
|
||||
short* col; // blockOffset*
|
||||
uint32 hash;
|
||||
};
|
||||
|
||||
|
@ -123,14 +122,14 @@ protected:
|
|||
static int rowOffset8[2][2048];
|
||||
static int rowOffset4[2][2048];
|
||||
|
||||
static int blockOffset32[256];
|
||||
static int blockOffset32Z[256];
|
||||
static int blockOffset16[256];
|
||||
static int blockOffset16S[256];
|
||||
static int blockOffset16Z[256];
|
||||
static int blockOffset16SZ[256];
|
||||
static int blockOffset8[256];
|
||||
static int blockOffset4[256];
|
||||
static short blockOffset32[256];
|
||||
static short blockOffset32Z[256];
|
||||
static short blockOffset16[256];
|
||||
static short blockOffset16S[256];
|
||||
static short blockOffset16Z[256];
|
||||
static short blockOffset16SZ[256];
|
||||
static short blockOffset8[256];
|
||||
static short blockOffset4[256];
|
||||
|
||||
__forceinline static uint32 Expand24To32(uint32 c, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
|
@ -701,7 +700,7 @@ public:
|
|||
uint32 rb = s[x] & 0x00f800f8;
|
||||
uint32 ga = s[x] & 0x8000f800;
|
||||
|
||||
d[o[x]] = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3);
|
||||
d[o[x]] = (uint16)((ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -325,7 +325,7 @@ void GSRenderer::VSync(int field)
|
|||
|
||||
// present
|
||||
|
||||
m_dev->Present(m_wnd.GetClientRect().fit(m_aspectratio), m_shader);
|
||||
m_dev->Present(m_wnd.GetClientRect().fit(m_aspectratio), m_shader, m_framelimit);
|
||||
|
||||
// snapshot
|
||||
|
||||
|
@ -435,12 +435,6 @@ void GSRenderer::KeyEvent(GSKeyEventData* e)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void GSRenderer::SetFrameLimit(bool limit)
|
||||
{
|
||||
m_dev->SetVSync(m_vsync && limit);
|
||||
}
|
||||
|
||||
void GSRenderer::GetTextureMinMax(GSVector4i& r, bool linear)
|
||||
{
|
||||
const GSDrawingContext* context = m_context;
|
||||
|
@ -579,28 +573,25 @@ void GSRenderer::GetAlphaMinMax()
|
|||
|
||||
if(PRIM->TME && context->TEX0.TCC)
|
||||
{
|
||||
uint32 bpp = GSLocalMemory::m_psm[context->TEX0.PSM].trbpp;
|
||||
uint32 cbpp = GSLocalMemory::m_psm[context->TEX0.CPSM].trbpp;
|
||||
uint32 pal = GSLocalMemory::m_psm[context->TEX0.PSM].pal;
|
||||
|
||||
if(bpp == 32)
|
||||
switch(GSLocalMemory::m_psm[context->TEX0.PSM].fmt)
|
||||
{
|
||||
case 0:
|
||||
a.y = 0;
|
||||
a.w = 0xff;
|
||||
}
|
||||
else if(bpp == 24)
|
||||
{
|
||||
break;
|
||||
case 1:
|
||||
a.y = env.TEXA.AEM ? 0 : env.TEXA.TA0;
|
||||
a.w = env.TEXA.TA0;
|
||||
}
|
||||
else if(bpp == 16)
|
||||
{
|
||||
break;
|
||||
case 2:
|
||||
a.y = env.TEXA.AEM ? 0 : min(env.TEXA.TA0, env.TEXA.TA1);
|
||||
a.w = max(env.TEXA.TA0, env.TEXA.TA1);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
case 3:
|
||||
m_mem.m_clut.GetAlphaMinMax32(a.y, a.w);
|
||||
break;
|
||||
default:
|
||||
__assume(0);
|
||||
}
|
||||
|
||||
switch(context->TEX0.TFX)
|
||||
|
@ -714,17 +705,25 @@ bool GSRenderer::TryAlphaTest(uint32& fm, uint32& zm)
|
|||
|
||||
bool GSRenderer::IsLinear()
|
||||
{
|
||||
float qmin = m_vt.m_min.t.z;
|
||||
float qmax = m_vt.m_max.t.z;
|
||||
const GIFRegTEX1& TEX1 = m_context->TEX1;
|
||||
|
||||
if(PRIM->FST)
|
||||
bool mmin = TEX1.IsMinLinear();
|
||||
bool mmag = TEX1.IsMagLinear();
|
||||
|
||||
if(mmag == mmin) return mmag;
|
||||
|
||||
float LODmin = (float)TEX1.K;
|
||||
float LODmax = (float)TEX1.K;
|
||||
|
||||
if(!TEX1.LCM && !PRIM->FST) // if FST => assume Q = 1.0f (should not, but Q is very often bogus, 0 or DEN)
|
||||
{
|
||||
// assume Q = 1.0f => LOD > 0 (should not, but Q is very often bogus, 0 or DEN)
|
||||
float f = (float)(1 << TEX1.L) / log(2.0f);
|
||||
|
||||
qmin = qmax = 1.0f;
|
||||
LODmin += log(1.0f / abs(m_vt.m_min.t.z)) * f;
|
||||
LODmax += log(1.0f / abs(m_vt.m_max.t.z)) * f;
|
||||
}
|
||||
|
||||
return m_context->TEX1.IsLinear(qmin, qmax);
|
||||
return LODmax <= 0 ? mmag : LODmin > 0 ? mmin : mmag || mmin;
|
||||
}
|
||||
|
||||
bool GSRenderer::IsOpaque()
|
||||
|
|
|
@ -77,7 +77,6 @@ public:
|
|||
virtual void VSync(int field);
|
||||
virtual bool MakeSnapshot(const string& path);
|
||||
virtual void KeyEvent(GSKeyEventData* e);
|
||||
virtual void SetFrameLimit(bool limit);
|
||||
|
||||
virtual bool CanUpscale()
|
||||
{
|
||||
|
@ -125,7 +124,7 @@ protected:
|
|||
PRIM->TME ? (int)m_context->TEX0.PSM : 0xff);
|
||||
*/
|
||||
|
||||
if(GSUtil::EncodePSM(m_context->FRAME.PSM) != 3 && GSUtil::EncodePSM(m_context->ZBUF.PSM) != 3)
|
||||
if(GSLocalMemory::m_psm[m_context->FRAME.PSM].fmt < 3 && GSLocalMemory::m_psm[m_context->ZBUF.PSM].fmt < 3)
|
||||
{
|
||||
// FIXME: berserk fpsm = 27 (8H)
|
||||
|
||||
|
|
|
@ -82,9 +82,21 @@ public:
|
|||
|
||||
GSTextureFX::OMDepthStencilSelector om_dssel;
|
||||
|
||||
if(context->TEST.ZTE)
|
||||
{
|
||||
om_dssel.ztst = context->TEST.ZTST;
|
||||
om_dssel.zwe = !context->ZBUF.ZMSK;
|
||||
}
|
||||
else
|
||||
{
|
||||
om_dssel.ztst = ZTST_ALWAYS;
|
||||
om_dssel.zwe = 0;
|
||||
}
|
||||
/*
|
||||
om_dssel.zte = context->TEST.ZTE;
|
||||
om_dssel.ztst = context->TEST.ZTST;
|
||||
om_dssel.zwe = !context->ZBUF.ZMSK;
|
||||
*/
|
||||
om_dssel.date = context->FRAME.PSM != PSM_PSMCT24 ? context->TEST.DATE : 0;
|
||||
om_dssel.fba = m_fba ? context->FBA.FBA : 0;
|
||||
|
||||
|
@ -115,22 +127,17 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
om_bsel.wr = (context->FRAME.FBMSK & 0x000000ff) != 0x000000ff;
|
||||
om_bsel.wg = (context->FRAME.FBMSK & 0x0000ff00) != 0x0000ff00;
|
||||
om_bsel.wb = (context->FRAME.FBMSK & 0x00ff0000) != 0x00ff0000;
|
||||
om_bsel.wa = (context->FRAME.FBMSK & 0xff000000) != 0xff000000;
|
||||
om_bsel.wrgba = ~GSVector4i::load((int)context->FRAME.FBMSK).eq8(GSVector4i::xffffffff()).mask();
|
||||
|
||||
// vs
|
||||
|
||||
GSTextureFX::VSSelector vs_sel;
|
||||
|
||||
vs_sel.bppz = 0;
|
||||
vs_sel.tme = PRIM->TME;
|
||||
vs_sel.fst = PRIM->FST;
|
||||
vs_sel.logz = m_logz ? 1 : 0;
|
||||
vs_sel.prim = primclass;
|
||||
|
||||
if(om_dssel.zte && om_dssel.ztst > 0 && om_dssel.zwe)
|
||||
if(om_dssel.ztst >= ZTST_ALWAYS && om_dssel.zwe)
|
||||
{
|
||||
if(context->ZBUF.PSM == PSM_PSMZ24)
|
||||
{
|
||||
|
@ -139,7 +146,7 @@ public:
|
|||
ASSERT(m_vt.m_min.p.z > 0xffffff);
|
||||
|
||||
vs_sel.bppz = 1;
|
||||
om_dssel.ztst = 1;
|
||||
om_dssel.ztst = ZTST_ALWAYS;
|
||||
}
|
||||
}
|
||||
else if(context->ZBUF.PSM == PSM_PSMZ16 || context->ZBUF.PSM == PSM_PSMZ16S)
|
||||
|
@ -149,36 +156,23 @@ public:
|
|||
ASSERT(m_vt.m_min.p.z > 0xffff); // sfex capcom logo
|
||||
|
||||
vs_sel.bppz = 2;
|
||||
om_dssel.ztst = 1;
|
||||
om_dssel.ztst = ZTST_ALWAYS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GSTextureFX::VSConstantBuffer vs_cb;
|
||||
|
||||
float sx = 2.0f * rt->m_scale.x / (rt->GetWidth() * 16);
|
||||
float sy = 2.0f * rt->m_scale.y / (rt->GetHeight() * 16);
|
||||
float sx = 2.0f * rt->m_scale.x / (rt->m_size.x << 4);
|
||||
float sy = 2.0f * rt->m_scale.y / (rt->m_size.y << 4);
|
||||
float ox = (float)(int)context->XYOFFSET.OFX;
|
||||
float oy = (float)(int)context->XYOFFSET.OFY;
|
||||
float ox2 = 2.0f * m_pixelcenter.x / rt->GetWidth();
|
||||
float oy2 = 2.0f * m_pixelcenter.y / rt->GetHeight();
|
||||
float ox2 = 2.0f * m_pixelcenter.x / rt->m_size.x;
|
||||
float oy2 = 2.0f * m_pixelcenter.y / rt->m_size.y;
|
||||
|
||||
vs_cb.VertexScale = GSVector4(sx, -sy, 1.0f / UINT_MAX, 0.0f);
|
||||
vs_cb.VertexOffset = GSVector4(ox * sx + ox2 + 1, -(oy * sy + oy2 + 1), 0.0f, -1.0f);
|
||||
|
||||
if(PRIM->TME)
|
||||
{
|
||||
if(PRIM->FST)
|
||||
{
|
||||
vs_cb.TextureScale.x = 1.0f / (16 << context->TEX0.TW);
|
||||
vs_cb.TextureScale.y = 1.0f / (16 << context->TEX0.TH);
|
||||
}
|
||||
else
|
||||
{
|
||||
vs_cb.TextureScale = GSVector2(1.0f, 1.0f);
|
||||
}
|
||||
}
|
||||
|
||||
// gs
|
||||
|
||||
GSTextureFX::GSSelector gs_sel;
|
||||
|
@ -224,7 +218,6 @@ public:
|
|||
|
||||
if(tex)
|
||||
{
|
||||
ps_sel.fst = PRIM->FST;
|
||||
ps_sel.wms = context->CLAMP.WMS;
|
||||
ps_sel.wmt = context->CLAMP.WMT;
|
||||
ps_sel.fmt = tex->m_fmt;
|
||||
|
@ -234,46 +227,34 @@ public:
|
|||
ps_sel.ltf = m_filter == 2 ? IsLinear() : m_filter;
|
||||
ps_sel.rt = tex->m_target;
|
||||
|
||||
int w = tex->m_texture->GetWidth();
|
||||
int h = tex->m_texture->GetHeight();
|
||||
int w = tex->m_texture->m_size.x;
|
||||
int h = tex->m_texture->m_size.y;
|
||||
|
||||
int tw = (int)(1 << context->TEX0.TW);
|
||||
int th = (int)(1 << context->TEX0.TH);
|
||||
|
||||
ps_cb.WH = GSVector4(tw, th, w, h);
|
||||
ps_cb.HalfTexel = GSVector4(-0.5f, 0.5f).xxyy() / GSVector4(w, h).xyxy();
|
||||
ps_cb.MinF_TA.z = (float)(int)env.TEXA.TA0 / 255;
|
||||
ps_cb.MinF_TA.w = (float)(int)env.TEXA.TA1 / 255;
|
||||
GSVector4 WH(tw, th, w, h);
|
||||
|
||||
if(PRIM->FST)
|
||||
{
|
||||
vs_cb.TextureScale = GSVector4(1.0f / 16) / WH.xyxy();
|
||||
|
||||
ps_sel.fst = 1;
|
||||
}
|
||||
|
||||
ps_cb.WH = WH;
|
||||
ps_cb.HalfTexel = GSVector4(-0.5f, 0.5f).xxyy() / WH.zwzw();
|
||||
ps_cb.MskFix = GSVector4i(context->CLAMP.MINU, context->CLAMP.MINV, context->CLAMP.MAXU, context->CLAMP.MAXV);
|
||||
|
||||
GSVector4 clamp(ps_cb.MskFix);
|
||||
GSVector4 ta(env.TEXA & GSVector4i::x000000ff());
|
||||
|
||||
ps_cb.MinMax = clamp / WH.xyxy();
|
||||
ps_cb.MinF_TA = (clamp + 0.5f).xyxy(ta) / WH.xyxy(GSVector4(255, 255));
|
||||
|
||||
ps_ssel.tau = (context->CLAMP.WMS + 3) >> 1;
|
||||
ps_ssel.tav = (context->CLAMP.WMT + 3) >> 1;
|
||||
ps_ssel.ltf = ps_sel.ltf;
|
||||
|
||||
switch(ps_sel.wms)
|
||||
{
|
||||
case CLAMP_REGION_CLAMP:
|
||||
ps_cb.MinMax.x = (float)(int)context->CLAMP.MINU / tw;
|
||||
ps_cb.MinMax.z = (float)(int)context->CLAMP.MAXU / tw;
|
||||
ps_cb.MinF_TA.x = ((float)(int)context->CLAMP.MINU + 0.5f) / tw;
|
||||
break;
|
||||
case CLAMP_REGION_REPEAT:
|
||||
ps_cb.MskFix.x = context->CLAMP.MINU;
|
||||
ps_cb.MskFix.z = context->CLAMP.MAXU;
|
||||
break;
|
||||
}
|
||||
|
||||
switch(ps_sel.wmt)
|
||||
{
|
||||
case CLAMP_REGION_CLAMP:
|
||||
ps_cb.MinMax.y = (float)(int)context->CLAMP.MINV / th;
|
||||
ps_cb.MinMax.w = (float)(int)context->CLAMP.MAXV / th;
|
||||
ps_cb.MinF_TA.y = ((float)(int)context->CLAMP.MINV + 0.5f) / th;
|
||||
break;
|
||||
case CLAMP_REGION_REPEAT:
|
||||
ps_cb.MskFix.y = context->CLAMP.MINV;
|
||||
ps_cb.MskFix.w = context->CLAMP.MAXV;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -282,10 +263,7 @@ public:
|
|||
|
||||
// rs
|
||||
|
||||
int w = rt->GetWidth();
|
||||
int h = rt->GetHeight();
|
||||
|
||||
GSVector4i scissor = GSVector4i(GSVector4(rt->m_scale).xyxy() * context->scissor.in).rintersect(GSVector4i(0, 0, w, h));
|
||||
GSVector4i scissor = GSVector4i(GSVector4(rt->m_scale).xyxy() * context->scissor.in).rintersect(GSVector4i(rt->GetSize()).zwxy());
|
||||
|
||||
//
|
||||
|
||||
|
@ -296,7 +274,7 @@ public:
|
|||
m_tfx->SetupVS(vs_sel, &vs_cb);
|
||||
m_tfx->SetupGS(gs_sel);
|
||||
m_tfx->SetupPS(ps_sel, &ps_cb, ps_ssel, tex ? tex->m_texture : NULL, tex ? tex->m_palette : NULL);
|
||||
m_tfx->SetupRS(w, h, scissor);
|
||||
m_tfx->SetupRS(rt->m_size, scissor);
|
||||
|
||||
// draw
|
||||
|
||||
|
|
|
@ -86,9 +86,11 @@ void GSRendererDX10::VertexKick(bool skip)
|
|||
{
|
||||
GSVector4i scissor = m_context->scissor.dx10;
|
||||
|
||||
GSVector4i pmin, pmax;
|
||||
|
||||
#if _M_SSE >= 0x401
|
||||
|
||||
GSVector4i pmin, pmax, v0, v1, v2;
|
||||
GSVector4i v0, v1, v2;
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
|
@ -116,52 +118,53 @@ void GSRendererDX10::VertexKick(bool skip)
|
|||
break;
|
||||
}
|
||||
|
||||
GSVector4i test = (pmax < scissor) | (pmin > scissor.zwxy());
|
||||
|
||||
if(test.mask() & 0xff)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
case GS_POINTLIST:
|
||||
if(v[0].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = v[0].p.x;
|
||||
pmin.y = v[0].p.y;
|
||||
pmax.x = v[0].p.x;
|
||||
pmax.y = v[0].p.y;
|
||||
break;
|
||||
case GS_LINELIST:
|
||||
case GS_LINESTRIP:
|
||||
case GS_SPRITE:
|
||||
if(v[0].p.x < scissor.x && v[1].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z && v[1].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y && v[1].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w && v[1].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = std::min<uint16>(v[0].p.x, v[1].p.x);
|
||||
pmin.y = std::min<uint16>(v[0].p.y, v[1].p.y);
|
||||
pmax.x = std::max<uint16>(v[0].p.x, v[1].p.x);
|
||||
pmax.y = std::max<uint16>(v[0].p.y, v[1].p.y);
|
||||
break;
|
||||
case GS_TRIANGLELIST:
|
||||
case GS_TRIANGLESTRIP:
|
||||
case GS_TRIANGLEFAN:
|
||||
if(v[0].p.x < scissor.x && v[1].p.x < scissor.x && v[2].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z && v[1].p.x > scissor.z && v[2].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y && v[1].p.y < scissor.y && v[2].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w && v[1].p.y > scissor.w && v[2].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = std::min<uint16>(std::min<uint16>(v[0].p.x, v[1].p.x), v[2].p.x);
|
||||
pmin.y = std::min<uint16>(std::min<uint16>(v[0].p.y, v[1].p.y), v[2].p.y);
|
||||
pmax.x = std::max<uint16>(std::max<uint16>(v[0].p.x, v[1].p.x), v[2].p.x);
|
||||
pmax.y = std::max<uint16>(std::max<uint16>(v[0].p.y, v[1].p.y), v[2].p.y);
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
GSVector4i test = (pmax < scissor) | (pmin > scissor.zwxy());
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
case GS_TRIANGLELIST:
|
||||
case GS_TRIANGLESTRIP:
|
||||
case GS_TRIANGLEFAN:
|
||||
case GS_SPRITE:
|
||||
test |= pmin == pmax;
|
||||
break;
|
||||
}
|
||||
|
||||
if(test.mask() & 0xff)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_count += count;
|
||||
}
|
||||
}
|
||||
|
@ -196,10 +199,9 @@ void GSRendererDX10::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
GSDevice10* dev = (GSDevice10*)m_dev;
|
||||
|
||||
int w = rt->GetWidth();
|
||||
int h = rt->GetHeight();
|
||||
const GSVector2i& size = rt->m_size;
|
||||
|
||||
if(GSTexture* t = dev->CreateRenderTarget(w, h))
|
||||
if(GSTexture* t = dev->CreateRenderTarget(size.x, size.y))
|
||||
{
|
||||
// sfex3 (after the capcom logo), vf4 (first menu fading in), ffxii shadows, rumble roses shadows, persona4 shadows
|
||||
|
||||
|
@ -215,7 +217,7 @@ void GSRendererDX10::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// ia
|
||||
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / w, rt->m_scale.y / h);
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / size.x, rt->m_scale.y / size.y);
|
||||
GSVector4 o = GSVector4(-1.0f, 1.0f);
|
||||
|
||||
GSVector4 src = ((m_vt.m_min.p.xyxy(m_vt.m_max.p) + o.xxyy()) * s.xyxy()).sat(o.zzyy());
|
||||
|
@ -249,7 +251,7 @@ void GSRendererDX10::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// rs
|
||||
|
||||
dev->RSSet(w, h);
|
||||
dev->RSSet(size);
|
||||
|
||||
// set
|
||||
|
||||
|
|
|
@ -86,9 +86,11 @@ void GSRendererDX11::VertexKick(bool skip)
|
|||
{
|
||||
GSVector4i scissor = m_context->scissor.dx10;
|
||||
|
||||
GSVector4i pmin, pmax;
|
||||
|
||||
#if _M_SSE >= 0x401
|
||||
|
||||
GSVector4i pmin, pmax, v0, v1, v2;
|
||||
GSVector4i v0, v1, v2;
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
|
@ -116,52 +118,53 @@ void GSRendererDX11::VertexKick(bool skip)
|
|||
break;
|
||||
}
|
||||
|
||||
GSVector4i test = (pmax < scissor) | (pmin > scissor.zwxy());
|
||||
|
||||
if(test.mask() & 0xff)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
case GS_POINTLIST:
|
||||
if(v[0].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = v[0].p.x;
|
||||
pmin.y = v[0].p.y;
|
||||
pmax.x = v[0].p.x;
|
||||
pmax.y = v[0].p.y;
|
||||
break;
|
||||
case GS_LINELIST:
|
||||
case GS_LINESTRIP:
|
||||
case GS_SPRITE:
|
||||
if(v[0].p.x < scissor.x && v[1].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z && v[1].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y && v[1].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w && v[1].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = std::min<uint16>(v[0].p.x, v[1].p.x);
|
||||
pmin.y = std::min<uint16>(v[0].p.y, v[1].p.y);
|
||||
pmax.x = std::max<uint16>(v[0].p.x, v[1].p.x);
|
||||
pmax.y = std::max<uint16>(v[0].p.y, v[1].p.y);
|
||||
break;
|
||||
case GS_TRIANGLELIST:
|
||||
case GS_TRIANGLESTRIP:
|
||||
case GS_TRIANGLEFAN:
|
||||
if(v[0].p.x < scissor.x && v[1].p.x < scissor.x && v[2].p.x < scissor.x
|
||||
|| v[0].p.x > scissor.z && v[1].p.x > scissor.z && v[2].p.x > scissor.z
|
||||
|| v[0].p.y < scissor.y && v[1].p.y < scissor.y && v[2].p.y < scissor.y
|
||||
|| v[0].p.y > scissor.w && v[1].p.y > scissor.w && v[2].p.y > scissor.w)
|
||||
{
|
||||
return;
|
||||
}
|
||||
pmin.x = std::min<uint16>(std::min<uint16>(v[0].p.x, v[1].p.x), v[2].p.x);
|
||||
pmin.y = std::min<uint16>(std::min<uint16>(v[0].p.y, v[1].p.y), v[2].p.y);
|
||||
pmax.x = std::max<uint16>(std::max<uint16>(v[0].p.x, v[1].p.x), v[2].p.x);
|
||||
pmax.y = std::max<uint16>(std::max<uint16>(v[0].p.y, v[1].p.y), v[2].p.y);
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
GSVector4i test = (pmax < scissor) | (pmin > scissor.zwxy());
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
case GS_TRIANGLELIST:
|
||||
case GS_TRIANGLESTRIP:
|
||||
case GS_TRIANGLEFAN:
|
||||
case GS_SPRITE:
|
||||
test |= pmin == pmax;
|
||||
break;
|
||||
}
|
||||
|
||||
if(test.mask() & 0xff)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_count += count;
|
||||
}
|
||||
}
|
||||
|
@ -196,10 +199,9 @@ void GSRendererDX11::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
GSDevice11* dev = (GSDevice11*)m_dev;
|
||||
|
||||
int w = rt->GetWidth();
|
||||
int h = rt->GetHeight();
|
||||
const GSVector2i& size = rt->m_size;
|
||||
|
||||
if(GSTexture* t = dev->CreateRenderTarget(w, h))
|
||||
if(GSTexture* t = dev->CreateRenderTarget(size.x, size.y))
|
||||
{
|
||||
// sfex3 (after the capcom logo), vf4 (first menu fading in), ffxii shadows, rumble roses shadows, persona4 shadows
|
||||
|
||||
|
@ -215,7 +217,7 @@ void GSRendererDX11::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// ia
|
||||
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / w, rt->m_scale.y / h);
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / size.x, rt->m_scale.y / size.y);
|
||||
GSVector4 o = GSVector4(-1.0f, 1.0f);
|
||||
|
||||
GSVector4 src = ((m_vt.m_min.p.xyxy(m_vt.m_max.p) + o.xxyy()) * s.xyxy()).sat(o.zzyy());
|
||||
|
@ -249,7 +251,7 @@ void GSRendererDX11::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// rs
|
||||
|
||||
dev->RSSet(w, h);
|
||||
dev->RSSet(size);
|
||||
|
||||
// set
|
||||
|
||||
|
|
|
@ -135,6 +135,16 @@ void GSRendererDX9::VertexKick(bool skip)
|
|||
|
||||
GSVector4 test = (pmax < scissor) | (pmin > scissor.zwxy());
|
||||
|
||||
switch(prim)
|
||||
{
|
||||
case GS_TRIANGLELIST:
|
||||
case GS_TRIANGLESTRIP:
|
||||
case GS_TRIANGLEFAN:
|
||||
case GS_SPRITE:
|
||||
test |= pmin == pmax;
|
||||
break;
|
||||
}
|
||||
|
||||
if(test.mask() & 3)
|
||||
{
|
||||
return;
|
||||
|
@ -206,10 +216,9 @@ void GSRendererDX9::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
GSDevice9* dev = (GSDevice9*)m_dev;
|
||||
|
||||
int w = rt->GetWidth();
|
||||
int h = rt->GetHeight();
|
||||
const GSVector2i& size = rt->m_size;
|
||||
|
||||
if(GSTexture* t = dev->CreateRenderTarget(w, h))
|
||||
if(GSTexture* t = dev->CreateRenderTarget(size.x, size.y))
|
||||
{
|
||||
// sfex3 (after the capcom logo), vf4 (first menu fading in), ffxii shadows, rumble roses shadows, persona4 shadows
|
||||
|
||||
|
@ -225,7 +234,7 @@ void GSRendererDX9::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// ia
|
||||
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / w, rt->m_scale.y / h);
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / size.x, rt->m_scale.y / size.y);
|
||||
GSVector4 o = GSVector4(-1.0f, 1.0f);
|
||||
|
||||
GSVector4 src = ((m_vt.m_min.p.xyxy(m_vt.m_max.p) + o.xxyy()) * s.xyxy()).sat(o.zzyy());
|
||||
|
@ -255,7 +264,7 @@ void GSRendererDX9::SetupDATE(GSTexture* rt, GSTexture* ds)
|
|||
|
||||
// rs
|
||||
|
||||
dev->RSSet(w, h);
|
||||
dev->RSSet(size);
|
||||
|
||||
//
|
||||
|
||||
|
@ -282,7 +291,7 @@ void GSRendererDX9::UpdateFBA(GSTexture* rt)
|
|||
|
||||
// ia
|
||||
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / rt->GetWidth(), rt->m_scale.y / rt->GetHeight());
|
||||
GSVector4 s = GSVector4(rt->m_scale.x / rt->m_size.x, rt->m_scale.y / rt->m_size.y);
|
||||
GSVector4 o = GSVector4(-1.0f, 1.0f);
|
||||
|
||||
GSVector4 src = ((m_vt.m_min.p.xyxy(m_vt.m_max.p) + o.xxyy()) * s.xyxy()).sat(o.zzyy());
|
||||
|
@ -310,7 +319,7 @@ void GSRendererDX9::UpdateFBA(GSTexture* rt)
|
|||
|
||||
// rs
|
||||
|
||||
dev->RSSet(rt->GetWidth(), rt->GetHeight());
|
||||
dev->RSSet(rt->m_size);
|
||||
|
||||
//
|
||||
|
||||
|
|
|
@ -305,7 +305,7 @@ void GSRendererSW::GetScanlineParam(GSScanlineParam& p, GS_PRIM_CLASS primclass)
|
|||
|
||||
if(fwrite || ftest)
|
||||
{
|
||||
p.sel.fpsm = GSUtil::EncodePSM(context->FRAME.PSM);
|
||||
p.sel.fpsm = GSLocalMemory::m_psm[context->FRAME.PSM].fmt;
|
||||
|
||||
if((primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS) && m_vt.m_eq.rgba != 0xffff)
|
||||
{
|
||||
|
@ -433,15 +433,15 @@ void GSRendererSW::GetScanlineParam(GSScanlineParam& p, GS_PRIM_CLASS primclass)
|
|||
}
|
||||
|
||||
bool zwrite = p.zm != 0xffffffff;
|
||||
bool ztest = context->TEST.ZTE && context->TEST.ZTST > 1;
|
||||
bool ztest = context->TEST.ZTE && context->TEST.ZTST > ZTST_ALWAYS;
|
||||
|
||||
p.sel.zwrite = zwrite;
|
||||
p.sel.ztest = ztest;
|
||||
|
||||
if(zwrite || ztest)
|
||||
{
|
||||
p.sel.zpsm = GSUtil::EncodePSM(context->ZBUF.PSM);
|
||||
p.sel.ztst = ztest ? context->TEST.ZTST : 1;
|
||||
p.sel.zpsm = GSLocalMemory::m_psm[context->ZBUF.PSM].fmt;
|
||||
p.sel.ztst = ztest ? context->TEST.ZTST : ZTST_ALWAYS;
|
||||
p.sel.zoverflow = GSVector4i(m_vt.m_max.p).z == 0x80000000;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ GSState::GSState(uint8* base, bool mt, void (*irq)())
|
|||
, m_vprim(1)
|
||||
, m_version(5)
|
||||
, m_frameskip(0)
|
||||
, m_framelimit(true)
|
||||
, m_vkf(NULL)
|
||||
{
|
||||
m_sssize = 0;
|
||||
|
@ -421,7 +422,7 @@ void GSState::GIFRegHandlerPRIM(GIFReg* r)
|
|||
|
||||
if(GSUtil::GetPrimClass(m_env.PRIM.PRIM) == GSUtil::GetPrimClass(r->PRIM.PRIM))
|
||||
{
|
||||
if(((m_env.PRIM.u64 ^ r->PRIM.u64) & ~7) != 0)
|
||||
if((m_env.PRIM.u32[0] ^ r->PRIM.u32[0]) & 0x7f8) // all fields except PRIM
|
||||
{
|
||||
Flush();
|
||||
}
|
||||
|
@ -1663,13 +1664,13 @@ void GSState::SetGameCRC(uint32 crc, int options)
|
|||
m_game = CRC::Lookup(crc);
|
||||
}
|
||||
|
||||
void GSState::SetFrameSkip(int frameskip)
|
||||
void GSState::SetFrameSkip(int skip)
|
||||
{
|
||||
if(m_frameskip != frameskip)
|
||||
if(m_frameskip != skip)
|
||||
{
|
||||
m_frameskip = frameskip;
|
||||
m_frameskip = skip;
|
||||
|
||||
if(frameskip)
|
||||
if(skip)
|
||||
{
|
||||
m_fpGIFPackedRegHandlers[GIF_REG_PRIM] = &GSState::GIFPackedRegHandlerNOP;
|
||||
m_fpGIFPackedRegHandlers[GIF_REG_RGBA] = &GSState::GIFPackedRegHandlerNOP;
|
||||
|
@ -1722,6 +1723,11 @@ void GSState::SetFrameSkip(int frameskip)
|
|||
}
|
||||
}
|
||||
|
||||
void GSState::SetFrameLimit(bool limit)
|
||||
{
|
||||
m_framelimit = limit;
|
||||
}
|
||||
|
||||
// GSTransferBuffer
|
||||
|
||||
GSState::GSTransferBuffer::GSTransferBuffer()
|
||||
|
|
|
@ -210,6 +210,7 @@ public:
|
|||
uint32 m_crc;
|
||||
int m_options;
|
||||
int m_frameskip;
|
||||
bool m_framelimit;
|
||||
CRC::Game m_game;
|
||||
GSDump m_dump;
|
||||
|
||||
|
@ -247,6 +248,7 @@ public:
|
|||
int Defrost(const GSFreezeData* fd);
|
||||
void GetLastTag(uint32* tag) {*tag = m_path3hack; m_path3hack = 0;}
|
||||
virtual void SetGameCRC(uint32 crc, int options);
|
||||
void SetFrameSkip(int frameskip);
|
||||
void SetFrameSkip(int skip);
|
||||
void SetFrameLimit(bool limit);
|
||||
};
|
||||
|
||||
|
|
|
@ -27,20 +27,19 @@ class GSTexture
|
|||
{
|
||||
public:
|
||||
GSVector2 m_scale;
|
||||
GSVector2i m_size;
|
||||
|
||||
struct GSMap {uint8* bits; int pitch;};
|
||||
|
||||
enum {None, RenderTarget, DepthStencil, Texture, Offscreen};
|
||||
|
||||
public:
|
||||
GSTexture() : m_scale(1, 1) {}
|
||||
GSTexture() : m_scale(1, 1), m_size(0, 0) {}
|
||||
virtual ~GSTexture() {}
|
||||
|
||||
virtual operator bool() {ASSERT(0); return false;}
|
||||
|
||||
virtual int GetType() const = 0;
|
||||
virtual int GetWidth() const = 0;
|
||||
virtual int GetHeight() const = 0;
|
||||
virtual int GetFormat() const = 0;
|
||||
|
||||
virtual bool Update(const GSVector4i& r, const void* data, int pitch) = 0;
|
||||
|
@ -48,5 +47,8 @@ public:
|
|||
virtual void Unmap() = 0;
|
||||
virtual bool Save(const string& fn, bool dds = false) = 0;
|
||||
|
||||
GSVector2i GetSize() const {return GSVector2i(GetWidth(), GetHeight());}
|
||||
int GetWidth() const {return m_size.x;}
|
||||
int GetHeight() const {return m_size.y;}
|
||||
|
||||
GSVector2i GetSize() const {return m_size;}
|
||||
};
|
||||
|
|
|
@ -29,6 +29,9 @@ GSTexture10::GSTexture10(ID3D10Texture2D* texture)
|
|||
|
||||
m_texture->GetDevice(&m_dev);
|
||||
m_texture->GetDesc(&m_desc);
|
||||
|
||||
m_size.x = (int)m_desc.Width;
|
||||
m_size.y = (int)m_desc.Height;
|
||||
}
|
||||
|
||||
int GSTexture10::GetType() const
|
||||
|
@ -40,16 +43,6 @@ int GSTexture10::GetType() const
|
|||
return GSTexture::None;
|
||||
}
|
||||
|
||||
int GSTexture10::GetWidth() const
|
||||
{
|
||||
return m_desc.Width;
|
||||
}
|
||||
|
||||
int GSTexture10::GetHeight() const
|
||||
{
|
||||
return m_desc.Height;
|
||||
}
|
||||
|
||||
int GSTexture10::GetFormat() const
|
||||
{
|
||||
return m_desc.Format;
|
||||
|
|
|
@ -36,8 +36,6 @@ public:
|
|||
explicit GSTexture10(ID3D10Texture2D* texture);
|
||||
|
||||
int GetType() const;
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
|
|
|
@ -31,6 +31,9 @@ GSTexture11::GSTexture11(ID3D11Texture2D* texture)
|
|||
m_texture->GetDesc(&m_desc);
|
||||
|
||||
m_dev->GetImmediateContext(&m_ctx);
|
||||
|
||||
m_size.x = (int)m_desc.Width;
|
||||
m_size.y = (int)m_desc.Height;
|
||||
}
|
||||
|
||||
int GSTexture11::GetType() const
|
||||
|
@ -42,16 +45,6 @@ int GSTexture11::GetType() const
|
|||
return GSTexture::None;
|
||||
}
|
||||
|
||||
int GSTexture11::GetWidth() const
|
||||
{
|
||||
return m_desc.Width;
|
||||
}
|
||||
|
||||
int GSTexture11::GetHeight() const
|
||||
{
|
||||
return m_desc.Height;
|
||||
}
|
||||
|
||||
int GSTexture11::GetFormat() const
|
||||
{
|
||||
return m_desc.Format;
|
||||
|
|
|
@ -37,8 +37,6 @@ public:
|
|||
explicit GSTexture11(ID3D11Texture2D* texture);
|
||||
|
||||
int GetType() const;
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
|
|
|
@ -31,6 +31,9 @@ GSTexture7::GSTexture7(int type, IDirectDrawSurface7* system)
|
|||
m_desc.dwSize = sizeof(m_desc);
|
||||
|
||||
system->GetSurfaceDesc(&m_desc);
|
||||
|
||||
m_size.x = (int)m_desc.dwWidth;
|
||||
m_size.y = (int)m_desc.dwHeight;
|
||||
}
|
||||
|
||||
GSTexture7::GSTexture7(int type, IDirectDrawSurface7* system, IDirectDrawSurface7* video)
|
||||
|
@ -43,6 +46,9 @@ GSTexture7::GSTexture7(int type, IDirectDrawSurface7* system, IDirectDrawSurface
|
|||
m_desc.dwSize = sizeof(m_desc);
|
||||
|
||||
video->GetSurfaceDesc(&m_desc);
|
||||
|
||||
m_size.x = (int)m_desc.dwWidth;
|
||||
m_size.y = (int)m_desc.dwHeight;
|
||||
}
|
||||
|
||||
int GSTexture7::GetType() const
|
||||
|
@ -50,16 +56,6 @@ int GSTexture7::GetType() const
|
|||
return m_type;
|
||||
}
|
||||
|
||||
int GSTexture7::GetWidth() const
|
||||
{
|
||||
return m_desc.dwWidth;
|
||||
}
|
||||
|
||||
int GSTexture7::GetHeight() const
|
||||
{
|
||||
return m_desc.dwHeight;
|
||||
}
|
||||
|
||||
int GSTexture7::GetFormat() const
|
||||
{
|
||||
return (int)m_desc.ddpfPixelFormat.dwFourCC;
|
||||
|
|
|
@ -36,8 +36,6 @@ public:
|
|||
GSTexture7(int type, IDirectDrawSurface7* system, IDirectDrawSurface7* video);
|
||||
|
||||
int GetType() const;
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
|
|
|
@ -35,6 +35,9 @@ GSTexture9::GSTexture9(IDirect3DSurface9* surface)
|
|||
|
||||
ASSERT(m_texture != NULL);
|
||||
}
|
||||
|
||||
m_size.x = (int)m_desc.Width;
|
||||
m_size.y = (int)m_desc.Height;
|
||||
}
|
||||
|
||||
GSTexture9::GSTexture9(IDirect3DTexture9* texture)
|
||||
|
@ -46,6 +49,9 @@ GSTexture9::GSTexture9(IDirect3DTexture9* texture)
|
|||
texture->GetSurfaceLevel(0, &m_surface);
|
||||
|
||||
ASSERT(m_surface != NULL);
|
||||
|
||||
m_size.x = (int)m_desc.Width;
|
||||
m_size.y = (int)m_desc.Height;
|
||||
}
|
||||
|
||||
GSTexture9::~GSTexture9()
|
||||
|
@ -61,16 +67,6 @@ int GSTexture9::GetType() const
|
|||
return GSTexture::None;
|
||||
}
|
||||
|
||||
int GSTexture9::GetWidth() const
|
||||
{
|
||||
return m_desc.Width;
|
||||
}
|
||||
|
||||
int GSTexture9::GetHeight() const
|
||||
{
|
||||
return m_desc.Height;
|
||||
}
|
||||
|
||||
int GSTexture9::GetFormat() const
|
||||
{
|
||||
return m_desc.Format;
|
||||
|
|
|
@ -36,8 +36,6 @@ public:
|
|||
virtual ~GSTexture9();
|
||||
|
||||
int GetType() const;
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
|
|
|
@ -445,11 +445,11 @@ void GSTextureCache::IncAge()
|
|||
{
|
||||
int maxage = m_src.m_used ? 3 : 30;
|
||||
|
||||
for(hash_map<Source*, bool>::iterator i = m_src.m_surfaces.begin(); i != m_src.m_surfaces.end(); )
|
||||
for(hash_set<Source*>::iterator i = m_src.m_surfaces.begin(); i != m_src.m_surfaces.end(); )
|
||||
{
|
||||
hash_map<Source*, bool>::iterator j = i++;
|
||||
hash_set<Source*>::iterator j = i++;
|
||||
|
||||
Source* s = j->first;
|
||||
Source* s = *j;
|
||||
|
||||
if(++s->m_age > maxage)
|
||||
{
|
||||
|
@ -673,8 +673,8 @@ bool GSTextureCache::Source::Create(Target* dst)
|
|||
}
|
||||
else
|
||||
{
|
||||
sr.z /= st->GetWidth();
|
||||
sr.w /= st->GetHeight();
|
||||
sr.z /= st->m_size.x;
|
||||
sr.w /= st->m_size.y;
|
||||
|
||||
m_renderer->m_dev->StretchRect(st, sr, dt, dr);
|
||||
}
|
||||
|
@ -733,9 +733,12 @@ void GSTextureCache::Source::Update(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE
|
|||
|
||||
GSVector2i bs = GSLocalMemory::m_psm[m_TEX0.PSM].bs;
|
||||
|
||||
GSVector4i r = rect.ralign<GSVector4i::Outside>(bs);
|
||||
int tw = std::max<int>(1 << m_TEX0.TW, bs.x);
|
||||
int th = std::max<int>(1 << m_TEX0.TH, bs.y);
|
||||
|
||||
if(r.eq(GSVector4i(0, 0, 1 << m_TEX0.TW, 1 << m_TEX0.TH)))
|
||||
GSVector4i r = rect.ralign<GSVector4i::Outside>(bs);
|
||||
|
||||
if(r.eq(GSVector4i(0, 0, tw, th)))
|
||||
{
|
||||
m_complete = true; // lame, but better than nothing
|
||||
}
|
||||
|
@ -995,7 +998,7 @@ void GSTextureCache::Target::Update()
|
|||
|
||||
void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0, GSLocalMemory& mem)
|
||||
{
|
||||
m_surfaces[s] = true;
|
||||
m_surfaces.insert(s);
|
||||
|
||||
if(s->m_target)
|
||||
{
|
||||
|
@ -1038,12 +1041,13 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0, GSLocalMe
|
|||
|
||||
list<Source*>* m = &m_map[i << 5];
|
||||
|
||||
for(int j = 0; j < 32; j++)
|
||||
unsigned long j;
|
||||
|
||||
while(_BitScanForward(&j, p))
|
||||
{
|
||||
if(p & (1 << j))
|
||||
{
|
||||
m[j].push_front(s);
|
||||
}
|
||||
p ^= 1 << j;
|
||||
|
||||
m[j].push_front(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1051,7 +1055,7 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0, GSLocalMe
|
|||
|
||||
void GSTextureCache::SourceMap::RemoveAll()
|
||||
{
|
||||
for_each(m_surfaces.begin(), m_surfaces.end(), delete_first());
|
||||
for_each(m_surfaces.begin(), m_surfaces.end(), delete_object());
|
||||
|
||||
m_surfaces.clear();
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ protected:
|
|||
|
||||
struct SourceMap
|
||||
{
|
||||
hash_map<Source*, bool> m_surfaces;
|
||||
hash_set<Source*> m_surfaces;
|
||||
list<Source*> m_map[MAX_PAGES];
|
||||
uint32 m_pages[16];
|
||||
bool m_used;
|
||||
|
|
|
@ -68,7 +68,7 @@ const GSTextureCacheSW::GSTexture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TE
|
|||
{
|
||||
t = new GSTexture(m_state);
|
||||
|
||||
m_textures[t] = true;
|
||||
m_textures.insert(t);
|
||||
|
||||
const GSLocalMemory::BlockOffset* bo = m_state->m_mem.GetBlockOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM);
|
||||
|
||||
|
@ -100,12 +100,13 @@ const GSTextureCacheSW::GSTexture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TE
|
|||
|
||||
list<GSTexture*>* m = &m_map[i << 5];
|
||||
|
||||
for(int j = 0; j < 32; j++)
|
||||
unsigned long j;
|
||||
|
||||
while(_BitScanForward(&j, p))
|
||||
{
|
||||
if(p & (1 << j))
|
||||
{
|
||||
m[j].push_front(t);
|
||||
}
|
||||
p ^= 1 << j;
|
||||
|
||||
m[j].push_front(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -125,7 +126,7 @@ const GSTextureCacheSW::GSTexture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TE
|
|||
|
||||
void GSTextureCacheSW::RemoveAll()
|
||||
{
|
||||
for_each(m_textures.begin(), m_textures.end(), delete_first());
|
||||
for_each(m_textures.begin(), m_textures.end(), delete_object());
|
||||
|
||||
m_textures.clear();
|
||||
|
||||
|
@ -156,11 +157,11 @@ void GSTextureCacheSW::RemoveAt(GSTexture* t)
|
|||
|
||||
void GSTextureCacheSW::IncAge()
|
||||
{
|
||||
for(hash_map<GSTexture*, bool>::iterator i = m_textures.begin(); i != m_textures.end(); )
|
||||
for(hash_set<GSTexture*>::iterator i = m_textures.begin(); i != m_textures.end(); )
|
||||
{
|
||||
hash_map<GSTexture*, bool>::iterator j = i++;
|
||||
hash_set<GSTexture*>::iterator j = i++;
|
||||
|
||||
GSTexture* t = j->first;
|
||||
GSTexture* t = *j;
|
||||
|
||||
if(++t->m_age > 30)
|
||||
{
|
||||
|
@ -242,8 +243,8 @@ bool GSTextureCacheSW::GSTexture::Update(const GIFRegTEX0& TEX0, const GIFRegTEX
|
|||
|
||||
GSVector2i bs = psm.bs;
|
||||
|
||||
int tw = max(1 << TEX0.TW, bs.x);
|
||||
int th = max(1 << TEX0.TH, bs.y);
|
||||
int tw = std::max<int>(1 << TEX0.TW, bs.x);
|
||||
int th = std::max<int>(1 << TEX0.TH, bs.y);
|
||||
|
||||
GSVector4i r = rect.ralign<GSVector4i::Outside>(bs);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ public:
|
|||
|
||||
protected:
|
||||
GSState* m_state;
|
||||
hash_map<GSTexture*, bool> m_textures;
|
||||
hash_set<GSTexture*> m_textures;
|
||||
list<GSTexture*> m_map[MAX_PAGES];
|
||||
uint32 m_pages[16];
|
||||
|
||||
|
|
|
@ -45,12 +45,13 @@ public:
|
|||
{
|
||||
GSVector4 VertexScale;
|
||||
GSVector4 VertexOffset;
|
||||
GSVector2 TextureScale;
|
||||
float _pad[2];
|
||||
GSVector4 TextureScale;
|
||||
|
||||
struct VSConstantBuffer()
|
||||
{
|
||||
memset(this, 0, sizeof(*this));
|
||||
VertexScale = GSVector4::zero();
|
||||
VertexOffset = GSVector4::zero();
|
||||
TextureScale = GSVector4::zero();
|
||||
}
|
||||
|
||||
__forceinline bool Update(const VSConstantBuffer* cb)
|
||||
|
@ -85,13 +86,12 @@ public:
|
|||
uint32 tme:1;
|
||||
uint32 fst:1;
|
||||
uint32 logz:1;
|
||||
uint32 prim:2;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
};
|
||||
|
||||
operator uint32() {return key & 0x7f;}
|
||||
operator uint32() {return key & 0x1f;}
|
||||
|
||||
VSSelector() : key(0) {}
|
||||
};
|
||||
|
@ -107,7 +107,12 @@ public:
|
|||
|
||||
struct PSConstantBuffer()
|
||||
{
|
||||
memset(this, 0, sizeof(*this));
|
||||
FogColor_AREF = GSVector4::zero();
|
||||
HalfTexel = GSVector4::zero();
|
||||
WH = GSVector4::zero();
|
||||
MinMax = GSVector4::zero();
|
||||
MinF_TA = GSVector4::zero();
|
||||
MskFix = GSVector4i::zero();
|
||||
}
|
||||
|
||||
__forceinline bool Update(const PSConstantBuffer* cb)
|
||||
|
@ -212,7 +217,6 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 zte:1;
|
||||
uint32 ztst:2;
|
||||
uint32 zwe:1;
|
||||
uint32 date:1;
|
||||
|
@ -222,7 +226,7 @@ public:
|
|||
uint32 key;
|
||||
};
|
||||
|
||||
operator uint32() {return key & 0x3f;}
|
||||
operator uint32() {return key & 0x1f;}
|
||||
|
||||
OMDepthStencilSelector() : key(0) {}
|
||||
};
|
||||
|
@ -244,6 +248,13 @@ public:
|
|||
uint32 wa:1;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 _pad:1;
|
||||
uint32 abcd:8;
|
||||
uint32 wrgba:4;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
};
|
||||
|
||||
|
@ -273,7 +284,7 @@ public:
|
|||
virtual void SetupGS(GSSelector sel) = 0;
|
||||
virtual void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel, GSTexture* tex, GSTexture* pal) = 0;
|
||||
virtual void UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel) = 0;
|
||||
virtual void SetupRS(int w, int h, const GSVector4i& scissor) = 0;
|
||||
virtual void SetupRS(const GSVector2i& size, const GSVector4i& scissor) = 0;
|
||||
virtual void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds) = 0;
|
||||
virtual void UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix) = 0;
|
||||
};
|
||||
|
|
|
@ -76,6 +76,13 @@ bool GSTextureFX10::Create(GSDevice* dev)
|
|||
|
||||
if(FAILED(hr)) return false;
|
||||
|
||||
// create layout
|
||||
|
||||
VSSelector sel;
|
||||
VSConstantBuffer cb;
|
||||
|
||||
SetupVS(sel, &cb);
|
||||
|
||||
//
|
||||
|
||||
return true;
|
||||
|
@ -98,19 +105,17 @@ void GSTextureFX10::SetupVS(VSSelector sel, const VSConstantBuffer* cb)
|
|||
|
||||
if(i == m_vs.end())
|
||||
{
|
||||
string str[4];
|
||||
string str[3];
|
||||
|
||||
str[0] = format("%d", sel.bppz);
|
||||
str[1] = format("%d", sel.tme);
|
||||
str[2] = format("%d", sel.fst);
|
||||
str[3] = format("%d", sel.prim);
|
||||
|
||||
D3D10_SHADER_MACRO macro[] =
|
||||
{
|
||||
{"VS_BPPZ", str[0].c_str()},
|
||||
{"VS_TME", str[1].c_str()},
|
||||
{"VS_FST", str[2].c_str()},
|
||||
{"VS_PRIM", str[3].c_str()},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -297,9 +302,9 @@ void GSTextureFX10::UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSampl
|
|||
dev->PSSetSamplerState(ss0, ss1);
|
||||
}
|
||||
|
||||
void GSTextureFX10::SetupRS(int w, int h, const GSVector4i& scissor)
|
||||
void GSTextureFX10::SetupRS(const GSVector2i& size, const GSVector4i& scissor)
|
||||
{
|
||||
((GSDevice10*)m_dev)->RSSet(w, h, &scissor);
|
||||
((GSDevice10*)m_dev)->RSSet(size, &scissor);
|
||||
}
|
||||
|
||||
void GSTextureFX10::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds)
|
||||
|
@ -312,11 +317,17 @@ void GSTextureFX10::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
void GSTextureFX10::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix)
|
||||
{
|
||||
GSDevice10* dev = (GSDevice10*)m_dev;
|
||||
|
||||
/*
|
||||
hash_map<uint32, CComPtr<ID3D10DepthStencilState> >::const_iterator i = m_om_dss.find(dssel);
|
||||
|
||||
if(i == m_om_dss.end())
|
||||
{
|
||||
*/
|
||||
CComPtr<ID3D10DepthStencilState>& om_dss = m_om_dss[dssel];
|
||||
|
||||
if(om_dss == NULL)
|
||||
{
|
||||
|
||||
D3D10_DEPTH_STENCIL_DESC dsd;
|
||||
|
||||
memset(&dsd, 0, sizeof(dsd));
|
||||
|
@ -336,7 +347,7 @@ void GSTextureFX10::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
dsd.BackFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
|
||||
}
|
||||
|
||||
if(!(dssel.zte && dssel.ztst == 1 && !dssel.zwe))
|
||||
if(dssel.ztst != ZTST_ALWAYS || dssel.zwe)
|
||||
{
|
||||
static const D3D10_COMPARISON_FUNC ztst[] =
|
||||
{
|
||||
|
@ -346,11 +357,11 @@ void GSTextureFX10::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
D3D10_COMPARISON_GREATER
|
||||
};
|
||||
|
||||
dsd.DepthEnable = dssel.zte;
|
||||
dsd.DepthEnable = true;
|
||||
dsd.DepthWriteMask = dssel.zwe ? D3D10_DEPTH_WRITE_MASK_ALL : D3D10_DEPTH_WRITE_MASK_ZERO;
|
||||
dsd.DepthFunc = ztst[dssel.ztst];
|
||||
}
|
||||
|
||||
/*
|
||||
CComPtr<ID3D10DepthStencilState> dss;
|
||||
|
||||
(*dev)->CreateDepthStencilState(&dsd, &dss);
|
||||
|
@ -358,9 +369,13 @@ void GSTextureFX10::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
m_om_dss[dssel] = dss;
|
||||
|
||||
i = m_om_dss.find(dssel);
|
||||
*/
|
||||
(*dev)->CreateDepthStencilState(&dsd, &om_dss);
|
||||
}
|
||||
|
||||
dev->OMSetDepthStencilState(i->second, 1);
|
||||
// dev->OMSetDepthStencilState(i->second, 1);
|
||||
|
||||
dev->OMSetDepthStencilState(om_dss, 1);
|
||||
|
||||
hash_map<uint32, CComPtr<ID3D10BlendState> >::const_iterator j = m_om_bs.find(bsel);
|
||||
|
||||
|
|
|
@ -34,7 +34,8 @@ class GSTextureFX10 : public GSTextureFX
|
|||
CComPtr<ID3D10Buffer> m_ps_cb;
|
||||
hash_map<uint32, CComPtr<ID3D10SamplerState> > m_ps_ss;
|
||||
CComPtr<ID3D10SamplerState> m_palette_ss;
|
||||
hash_map<uint32, CComPtr<ID3D10DepthStencilState> > m_om_dss;
|
||||
// hash_map<uint32, CComPtr<ID3D10DepthStencilState> > m_om_dss;
|
||||
CComPtr<ID3D10DepthStencilState> m_om_dss[32];
|
||||
hash_map<uint32, CComPtr<ID3D10BlendState> > m_om_bs;
|
||||
|
||||
VSConstantBuffer m_vs_cb_cache;
|
||||
|
@ -50,7 +51,7 @@ public:
|
|||
void SetupGS(GSSelector sel);
|
||||
void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel, GSTexture* tex, GSTexture* pal);
|
||||
void UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel);
|
||||
void SetupRS(int w, int h, const GSVector4i& scissor);
|
||||
void SetupRS(const GSVector2i& size, const GSVector4i& scissor);
|
||||
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds);
|
||||
void UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix);
|
||||
};
|
||||
|
|
|
@ -76,6 +76,13 @@ bool GSTextureFX11::Create(GSDevice* dev)
|
|||
|
||||
if(FAILED(hr)) return false;
|
||||
|
||||
// create layout
|
||||
|
||||
VSSelector sel;
|
||||
VSConstantBuffer cb;
|
||||
|
||||
SetupVS(sel, &cb);
|
||||
|
||||
//
|
||||
|
||||
return true;
|
||||
|
@ -98,19 +105,17 @@ void GSTextureFX11::SetupVS(VSSelector sel, const VSConstantBuffer* cb)
|
|||
|
||||
if(i == m_vs.end())
|
||||
{
|
||||
string str[4];
|
||||
string str[3];
|
||||
|
||||
str[0] = format("%d", sel.bppz);
|
||||
str[1] = format("%d", sel.tme);
|
||||
str[2] = format("%d", sel.fst);
|
||||
str[3] = format("%d", sel.prim);
|
||||
|
||||
D3D11_SHADER_MACRO macro[] =
|
||||
{
|
||||
{"VS_BPPZ", str[0].c_str()},
|
||||
{"VS_TME", str[1].c_str()},
|
||||
{"VS_FST", str[2].c_str()},
|
||||
{"VS_PRIM", str[3].c_str()},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
|
@ -301,9 +306,9 @@ void GSTextureFX11::UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSampl
|
|||
dev->PSSetSamplerState(ss0, ss1);
|
||||
}
|
||||
|
||||
void GSTextureFX11::SetupRS(int w, int h, const GSVector4i& scissor)
|
||||
void GSTextureFX11::SetupRS(const GSVector2i& size, const GSVector4i& scissor)
|
||||
{
|
||||
((GSDevice11*)m_dev)->RSSet(w, h, &scissor);
|
||||
((GSDevice11*)m_dev)->RSSet(size, &scissor);
|
||||
}
|
||||
|
||||
void GSTextureFX11::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds)
|
||||
|
@ -340,7 +345,7 @@ void GSTextureFX11::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
dsd.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
|
||||
}
|
||||
|
||||
if(!(dssel.zte && dssel.ztst == 1 && !dssel.zwe))
|
||||
if(dssel.ztst != ZTST_ALWAYS || dssel.zwe)
|
||||
{
|
||||
static const D3D11_COMPARISON_FUNC ztst[] =
|
||||
{
|
||||
|
@ -350,7 +355,7 @@ void GSTextureFX11::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
D3D11_COMPARISON_GREATER
|
||||
};
|
||||
|
||||
dsd.DepthEnable = dssel.zte;
|
||||
dsd.DepthEnable = true;
|
||||
dsd.DepthWriteMask = dssel.zwe ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
|
||||
dsd.DepthFunc = ztst[dssel.ztst];
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public:
|
|||
void SetupGS(GSSelector sel);
|
||||
void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel, GSTexture* tex, GSTexture* pal);
|
||||
void UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel);
|
||||
void SetupRS(int w, int h, const GSVector4i& scissor);
|
||||
void SetupRS(const GSVector2i& size, const GSVector4i& scissor);
|
||||
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds);
|
||||
void UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix);
|
||||
};
|
||||
|
|
|
@ -158,7 +158,7 @@ void GSTextureFX9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSampler
|
|||
{
|
||||
if(sel.wms == 3)
|
||||
{
|
||||
if(GSTexture* t = CreateMskFix(tex->GetWidth(), cb->MskFix.x, cb->MskFix.z))
|
||||
if(GSTexture* t = CreateMskFix(tex->m_size.x, cb->MskFix.x, cb->MskFix.z))
|
||||
{
|
||||
(*dev)->SetTexture(2, *(GSTexture9*)t);
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ void GSTextureFX9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSampler
|
|||
|
||||
if(sel.wmt == 3)
|
||||
{
|
||||
if(GSTexture* t = CreateMskFix(tex->GetHeight(), cb->MskFix.y, cb->MskFix.w))
|
||||
if(GSTexture* t = CreateMskFix(tex->m_size.y, cb->MskFix.y, cb->MskFix.w))
|
||||
{
|
||||
(*dev)->SetTexture(3, *(GSTexture9*)t);
|
||||
}
|
||||
|
@ -265,9 +265,9 @@ void GSTextureFX9::UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSample
|
|||
dev->PSSetSamplerState(ss);
|
||||
}
|
||||
|
||||
void GSTextureFX9::SetupRS(int w, int h, const GSVector4i& scissor)
|
||||
void GSTextureFX9::SetupRS(const GSVector2i& size, const GSVector4i& scissor)
|
||||
{
|
||||
((GSDevice9*)m_dev)->RSSet(w, h, &scissor);
|
||||
((GSDevice9*)m_dev)->RSSet(size, &scissor);
|
||||
}
|
||||
|
||||
void GSTextureFX9::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds)
|
||||
|
@ -303,7 +303,7 @@ void GSTextureFX9::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
dss->StencilRef = 3;
|
||||
}
|
||||
|
||||
if(!(dssel.zte && dssel.ztst == 1 && !dssel.zwe))
|
||||
if(dssel.ztst != ZTST_ALWAYS || dssel.zwe)
|
||||
{
|
||||
static const D3DCMPFUNC ztst[] =
|
||||
{
|
||||
|
@ -313,7 +313,7 @@ void GSTextureFX9::UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel,
|
|||
D3DCMP_GREATER
|
||||
};
|
||||
|
||||
dss->DepthEnable = dssel.zte;
|
||||
dss->DepthEnable = true;
|
||||
dss->DepthWriteMask = dssel.zwe;
|
||||
dss->DepthFunc = ztst[dssel.ztst];
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ public:
|
|||
void SetupGS(GSSelector sel) {}
|
||||
void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel, GSTexture* tex, GSTexture* pal);
|
||||
void UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel);
|
||||
void SetupRS(int w, int h, const GSVector4i& scissor);
|
||||
void SetupRS(const GSVector2i& size, const GSVector4i& scissor);
|
||||
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix, GSTexture* rt, GSTexture* ds);
|
||||
void UpdateOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix);
|
||||
};
|
||||
|
|
|
@ -32,9 +32,8 @@ public:
|
|||
GSTextureNull(int type, int w, int h, int format);
|
||||
|
||||
int GetType() const {return m_desc.type;}
|
||||
int GetWidth() const {return m_desc.w;}
|
||||
int GetHeight() const {return m_desc.h;}
|
||||
int GetFormat() const {return m_desc.format;}
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch) {return true;}
|
||||
bool Map(GSMap& m, const GSVector4i* r) {return false;}
|
||||
void Unmap() {}
|
||||
|
|
|
@ -26,10 +26,11 @@
|
|||
GSTextureOGL::GSTextureOGL(GLuint texture, int type, int width, int height, int format)
|
||||
: m_texture(texture)
|
||||
, m_type(type)
|
||||
, m_width(width)
|
||||
, m_height(height)
|
||||
, m_format(format)
|
||||
{
|
||||
m_size.x = width;
|
||||
m_size.y = height;
|
||||
|
||||
// TODO: offscreen type should be just a memory array, also returned in Map
|
||||
|
||||
glGenBuffers(1, &m_pbo); GSDeviceOGL::CheckError();
|
||||
|
@ -61,16 +62,6 @@ int GSTextureOGL::GetType() const
|
|||
return m_type;
|
||||
}
|
||||
|
||||
int GSTextureOGL::GetWidth() const
|
||||
{
|
||||
return m_width;
|
||||
}
|
||||
|
||||
int GSTextureOGL::GetHeight() const
|
||||
{
|
||||
return m_height;
|
||||
}
|
||||
|
||||
int GSTextureOGL::GetFormat() const
|
||||
{
|
||||
return m_format;
|
||||
|
|
|
@ -29,8 +29,6 @@ class GSTextureOGL : public GSTexture
|
|||
GLuint m_pbo;
|
||||
|
||||
int m_type;
|
||||
int m_width;
|
||||
int m_height;
|
||||
int m_format;
|
||||
|
||||
public:
|
||||
|
@ -38,8 +36,6 @@ public:
|
|||
virtual ~GSTextureOGL();
|
||||
|
||||
int GetType() const;
|
||||
int GetWidth() const;
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "GS.h"
|
||||
#include "GSLocalMemory.h"
|
||||
|
||||
class GSUtil
|
||||
{
|
||||
|
@ -32,26 +33,6 @@ public:
|
|||
static bool HasSharedBits(uint32 sbp, uint32 spsm, uint32 dbp, uint32 dpsm);
|
||||
static bool HasCompatibleBits(uint32 spsm, uint32 dpsm);
|
||||
|
||||
static uint32 EncodePSM(uint32 psm)
|
||||
{
|
||||
switch(psm)
|
||||
{
|
||||
case PSM_PSMCT32:
|
||||
case PSM_PSMZ32:
|
||||
return 0;
|
||||
case PSM_PSMCT24:
|
||||
case PSM_PSMZ24:
|
||||
return 1;
|
||||
case PSM_PSMCT16:
|
||||
case PSM_PSMCT16S:
|
||||
case PSM_PSMZ16:
|
||||
case PSM_PSMZ16S:
|
||||
return 2;
|
||||
default:
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
static bool CheckDirectX();
|
||||
static bool CheckSSE();
|
||||
|
||||
|
|
|
@ -28,6 +28,11 @@ public:
|
|||
{
|
||||
return x == v.x && y == v.y;
|
||||
}
|
||||
|
||||
bool operator != (const GSVector2T& v) const
|
||||
{
|
||||
return x != v.x || y != v.y;
|
||||
}
|
||||
};
|
||||
|
||||
typedef GSVector2T<float> GSVector2;
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#define VS_BPPZ 0
|
||||
#define VS_TME 1
|
||||
#define VS_FST 1
|
||||
#define VS_PRIM 0
|
||||
#endif
|
||||
|
||||
#ifndef GS_IIP
|
||||
|
@ -520,11 +519,6 @@ VS_OUTPUT vs_main(VS_INPUT input)
|
|||
input.z = input.z & 0xffff;
|
||||
}
|
||||
|
||||
if(VS_PRIM == 3) // sprite
|
||||
{
|
||||
//input.p.xy = (input.p.xy + 15) & ~15; // HACK
|
||||
}
|
||||
|
||||
VS_OUTPUT output;
|
||||
|
||||
// pos -= 0.05 (1/320 pixel) helps avoiding rounding problems (integral part of pos is usually 5 digits, 0.05 is about as low as we can go)
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include <list>
|
||||
#include <map>
|
||||
#include <hash_map>
|
||||
#include <hash_set>
|
||||
#include <algorithm>
|
||||
|
||||
using namespace std;
|
||||
|
|
Loading…
Reference in New Issue