mirror of
https://github.com/PCSX2/gsdx-sourceforge.git
synced 2026-02-04 03:11:19 +01:00
This commit is contained in:
@@ -1522,7 +1522,7 @@ bool GSState::DetectBadFrame(int& skip)
|
||||
}
|
||||
else if(TME && FBP == 0x00800 && FPSM == PSM_PSMCT32 && TBP0 == 0x02800 && TPSM == PSM_PSMT8H)
|
||||
{
|
||||
skip = 56;
|
||||
skip = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "GSDirtyRect.h"
|
||||
#include "GSPerfMon.h"
|
||||
#include "GSVector.h"
|
||||
#include "GSDeviceT.h"
|
||||
|
||||
class GSState
|
||||
{
|
||||
|
||||
@@ -481,6 +481,10 @@
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\GSDeviceT.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GSDirtyRect.cpp"
|
||||
>
|
||||
@@ -733,6 +737,10 @@
|
||||
RelativePath=".\GS.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GSDeviceT.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\GSDirtyRect.h"
|
||||
>
|
||||
|
||||
@@ -31,15 +31,16 @@ GSTextureCache::GSDepthStencil::GSDepthStencil(GSTextureCache* tc)
|
||||
|
||||
bool GSTextureCache::GSDepthStencil::Create(int w, int h)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateDepthStencil(m_texture, w, h);
|
||||
if(!m_tc->m_renderer->m_dev.CreateDepthStencil(m_texture, w, h))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// FIXME: initial data should be unswizzled from local mem in Update() if dirty
|
||||
|
||||
m_tc->m_renderer->m_dev->ClearDepthStencilView(m_texture, D3D10_CLEAR_DEPTH, 0, 0);
|
||||
|
||||
return SUCCEEDED(hr);
|
||||
return true;
|
||||
}
|
||||
|
||||
void GSTextureCache::GSDepthStencil::Update()
|
||||
|
||||
@@ -382,27 +382,27 @@ void GSDevice::OMSetRenderTargets(ID3D10RenderTargetView* rtv, ID3D10DepthStenci
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateRenderTarget(GSTexture2D& t, int w, int h, DXGI_FORMAT format)
|
||||
bool GSDevice::CreateRenderTarget(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
return Create(t, w, h, format, D3D10_USAGE_DEFAULT, D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE);
|
||||
return Create(t, w, h, (DXGI_FORMAT)format, D3D10_USAGE_DEFAULT, D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE);
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateDepthStencil(GSTexture2D& t, int w, int h, DXGI_FORMAT format)
|
||||
bool GSDevice::CreateDepthStencil(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
return Create(t, w, h, format, D3D10_USAGE_DEFAULT, D3D10_BIND_DEPTH_STENCIL);
|
||||
return Create(t, w, h, (DXGI_FORMAT)format, D3D10_USAGE_DEFAULT, D3D10_BIND_DEPTH_STENCIL);
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateTexture(GSTexture2D& t, int w, int h, DXGI_FORMAT format)
|
||||
bool GSDevice::CreateTexture(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
return Create(t, w, h, format, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE);
|
||||
return Create(t, w, h, (DXGI_FORMAT)format, D3D10_USAGE_DEFAULT, D3D10_BIND_SHADER_RESOURCE);
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateOffscreenPlainSurface(GSTexture2D& t, int w, int h, DXGI_FORMAT format)
|
||||
bool GSDevice::CreateOffscreen(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
return Create(t, w, h, format, D3D10_USAGE_STAGING, 0);
|
||||
return Create(t, w, h, (DXGI_FORMAT)format, D3D10_USAGE_STAGING, 0);
|
||||
}
|
||||
|
||||
HRESULT GSDevice::Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10_USAGE usage, UINT bindFlags)
|
||||
bool GSDevice::Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10_USAGE usage, UINT bindFlags)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -418,7 +418,7 @@ HRESULT GSDevice::Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10
|
||||
|
||||
m_pool.RemoveAt(pos);
|
||||
|
||||
return S_OK;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -449,26 +449,11 @@ HRESULT GSDevice::Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10
|
||||
t.m_dev = m_dev;
|
||||
t.m_texture = texture.Detach();
|
||||
t.m_desc = desc;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//_tprintf(_T("Create %d x %d (%d %d %d) => %08x (%d)\n"), w, h, usage, bindFlags, format, hr, m_pool.GetCount());
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
void GSDevice::Recycle(GSTexture2D& t)
|
||||
{
|
||||
if(t.m_texture)
|
||||
{
|
||||
m_pool.AddHead(t);
|
||||
|
||||
while(m_pool.GetCount() > 200)
|
||||
{
|
||||
m_pool.RemoveTail();
|
||||
}
|
||||
|
||||
t = GSTexture2D();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GSDevice::SaveCurrent(LPCTSTR fn)
|
||||
|
||||
@@ -47,12 +47,8 @@ struct VertexPT2
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
class GSDevice
|
||||
class GSDevice : public GSDeviceT<GSTexture2D>
|
||||
{
|
||||
// texture cache
|
||||
|
||||
CAtlList<GSTexture2D> m_pool;
|
||||
|
||||
// state cache
|
||||
|
||||
ID3D10Buffer* m_vb;
|
||||
@@ -83,6 +79,8 @@ class GSDevice
|
||||
|
||||
//
|
||||
|
||||
bool Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10_USAGE usage, UINT bind);
|
||||
|
||||
void Interlace(GSTexture2D& st, GSTexture2D& dt, int shader, bool linear, float yoffset = 0);
|
||||
|
||||
public: // TODO
|
||||
@@ -144,13 +142,10 @@ public:
|
||||
IASet(vb, count, vertices, sizeof(T), layout, topology);
|
||||
}
|
||||
|
||||
HRESULT CreateRenderTarget(GSTexture2D& t, int w, int h, DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
HRESULT CreateDepthStencil(GSTexture2D& t, int w, int h, DXGI_FORMAT format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
|
||||
HRESULT CreateTexture(GSTexture2D& t, int w, int h, DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
HRESULT CreateOffscreenPlainSurface(GSTexture2D& t, int w, int h, DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
HRESULT Create(GSTexture2D& t, int w, int h, DXGI_FORMAT format, D3D10_USAGE usage, UINT bind);
|
||||
|
||||
void Recycle(GSTexture2D& t);
|
||||
bool CreateRenderTarget(GSTexture2D& t, int w, int h, DWORD format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
bool CreateDepthStencil(GSTexture2D& t, int w, int h, DWORD format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
|
||||
bool CreateTexture(GSTexture2D& t, int w, int h, DWORD format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
bool CreateOffscreen(GSTexture2D& t, int w, int h, DWORD format = DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
|
||||
bool SaveCurrent(LPCTSTR fn);
|
||||
bool SaveToFileD32S8X24(ID3D10Texture2D* ds, LPCTSTR fn);
|
||||
|
||||
@@ -31,11 +31,10 @@ GSTextureCache::GSRenderTarget::GSRenderTarget(GSTextureCache* tc)
|
||||
|
||||
bool GSTextureCache::GSRenderTarget::Create(int w, int h)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, w, h);
|
||||
|
||||
if(FAILED(hr)) return false;
|
||||
if(!m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, w, h))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
float color[4] = {0, 0, 0, 0};
|
||||
|
||||
@@ -56,8 +55,6 @@ void GSTextureCache::GSRenderTarget::Update()
|
||||
|
||||
if(r.IsRectEmpty()) return;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
if(r.right > 1024) {ASSERT(0); r.right = 1024;}
|
||||
if(r.bottom > 1024) {ASSERT(0); r.bottom = 1024;}
|
||||
|
||||
@@ -84,19 +81,18 @@ void GSTextureCache::GSRenderTarget::Update()
|
||||
|
||||
GSTexture2D texture;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(texture, w, h);
|
||||
if(m_tc->m_renderer->m_dev.CreateTexture(texture, w, h))
|
||||
{
|
||||
D3D10_BOX box = {0, 0, 0, w, h, 1};
|
||||
|
||||
if(FAILED(hr)) return;
|
||||
m_tc->m_renderer->m_dev->UpdateSubresource(texture, 0, &box, buff, pitch, 0);
|
||||
|
||||
D3D10_BOX box = {0, 0, 0, w, h, 1};
|
||||
GSVector4 dr(m_scale.x * r.left, m_scale.y * r.top, m_scale.x * r.right, m_scale.y * r.bottom);
|
||||
|
||||
m_tc->m_renderer->m_dev->UpdateSubresource(texture, 0, &box, buff, pitch, 0);
|
||||
m_tc->m_renderer->m_dev.StretchRect(texture, m_texture, dr);
|
||||
|
||||
GSVector4 dr(m_scale.x * r.left, m_scale.y * r.top, m_scale.x * r.right, m_scale.y * r.bottom);
|
||||
|
||||
m_tc->m_renderer->m_dev.StretchRect(texture, m_texture, dr);
|
||||
|
||||
m_tc->m_renderer->m_dev.Recycle(texture);
|
||||
m_tc->m_renderer->m_dev.Recycle(texture);
|
||||
}
|
||||
}
|
||||
|
||||
void GSTextureCache::GSRenderTarget::Read(CRect r)
|
||||
@@ -138,7 +134,7 @@ void GSTextureCache::GSRenderTarget::Read(CRect r)
|
||||
|
||||
GSTexture2D offscreen;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateOffscreenPlainSurface(offscreen, r.Width(), r.Height(), format);
|
||||
m_tc->m_renderer->m_dev.CreateOffscreen(offscreen, r.Width(), r.Height(), format);
|
||||
|
||||
m_tc->m_renderer->m_dev->CopyResource(offscreen, rt);
|
||||
|
||||
|
||||
@@ -224,7 +224,7 @@ void GSRendererHW::Draw()
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*
|
||||
|
||||
TRACE(_T("[%d] FlushPrim f %05x (%d) z %05x (%d %d %d %d) t %05x %05x (%d)\n"),
|
||||
(int)m_perfmon.GetFrame(),
|
||||
(int)m_context->FRAME.Block(),
|
||||
@@ -237,7 +237,7 @@ TRACE(_T("[%d] FlushPrim f %05x (%d) z %05x (%d %d %d %d) t %05x %05x (%d)\n"),
|
||||
PRIM->TME ? (int)m_context->TEX0.TBP0 : 0xfffff,
|
||||
PRIM->TME && m_context->TEX0.PSM > PSM_PSMCT16S ? (int)m_context->TEX0.CBP : 0xfffff,
|
||||
PRIM->TME ? (int)m_context->TEX0.PSM : 0xff);
|
||||
*/
|
||||
|
||||
|
||||
if(s_n >= 600)
|
||||
{
|
||||
@@ -654,14 +654,14 @@ if(s_dump)
|
||||
|
||||
void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, CRect r)
|
||||
{
|
||||
TRACE(_T("[%d] InvalidateVideoMem %d,%d - %d,%d %05x\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP);
|
||||
TRACE(_T("[%d] InvalidateVideoMem %d,%d - %d,%d %05x (%d)\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP, (int)BITBLTBUF.DPSM);
|
||||
|
||||
m_tc.InvalidateVideoMem(BITBLTBUF, &r);
|
||||
}
|
||||
|
||||
void GSRendererHW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, CRect r)
|
||||
{
|
||||
TRACE(_T("[%d] InvalidateLocalMem %d,%d - %d,%d %05x\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.SBP);
|
||||
TRACE(_T("[%d] InvalidateLocalMem %d,%d - %d,%d %05x (%d)\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.SBP, (int)BITBLTBUF.SPSM);
|
||||
|
||||
m_tc.InvalidateLocalMem(BITBLTBUF, &r);
|
||||
}
|
||||
|
||||
@@ -314,8 +314,6 @@ if(s_dump)
|
||||
template <class Vertex>
|
||||
void GSRendererSW<Vertex>::Flip()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
FlipInfo src[2];
|
||||
|
||||
for(int i = 0; i < countof(src); i++)
|
||||
@@ -335,11 +333,9 @@ void GSRendererSW<Vertex>::Flip()
|
||||
m_texture[i] = GSTexture2D();
|
||||
}
|
||||
|
||||
if(!m_texture[i])
|
||||
if(!m_texture[i] && !m_dev.CreateTexture(m_texture[i], w, h))
|
||||
{
|
||||
hr = m_dev.CreateTexture(m_texture[i], w, h);
|
||||
|
||||
if(FAILED(hr)) continue;
|
||||
continue;
|
||||
}
|
||||
|
||||
GIFRegTEX0 TEX0;
|
||||
|
||||
@@ -37,8 +37,6 @@ bool GSTextureCache::GSTexture::Create()
|
||||
{
|
||||
// m_tc->m_renderer->m_perfmon.Put(GSPerfMon::WriteTexture, 1);
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
m_TEX0 = m_tc->m_renderer->m_context->TEX0;
|
||||
|
||||
DWORD psm = m_TEX0.PSM;
|
||||
@@ -81,9 +79,7 @@ bool GSTextureCache::GSTexture::Create()
|
||||
int w = 1 << m_TEX0.TW;
|
||||
int h = 1 << m_TEX0.TH;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_texture, w, h, format);
|
||||
|
||||
return SUCCEEDED(hr);
|
||||
return m_tc->m_renderer->m_dev.CreateTexture(m_texture, w, h, format);
|
||||
}
|
||||
|
||||
bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
@@ -92,8 +88,6 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
// m_tc->m_renderer->m_perfmon.Put(GSPerfMon::ConvertRT2T, 1);
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
m_scale = rt->m_scale;
|
||||
m_TEX0 = m_tc->m_renderer->m_context->TEX0;
|
||||
m_rendered = true;
|
||||
@@ -113,7 +107,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
// ASSERT(rt->m_TEX0.TBW > m_TEX0.TBW); // otherwise scale.x need to be reduced to make the larger texture fit (TODO)
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
|
||||
int bw = 64;
|
||||
int bh = m_TEX0.PSM == PSM_PSMCT32 || m_TEX0.PSM == PSM_PSMCT24 ? 32 : 64;
|
||||
@@ -201,7 +195,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
dt = &tmp;
|
||||
}
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(*dt, w, h);
|
||||
m_tc->m_renderer->m_dev.CreateRenderTarget(*dt, w, h);
|
||||
|
||||
if(src == dst)
|
||||
{
|
||||
@@ -227,7 +221,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
if(!m_texture)
|
||||
{
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
m_tc->m_renderer->m_dev.CreateTexture(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
|
||||
m_tc->m_renderer->m_dev->CopyResource(m_texture, rt->m_texture);
|
||||
}
|
||||
@@ -246,7 +240,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
break;
|
||||
case PSM_PSMT8H:
|
||||
m_bpp2 = 4;
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_palette, 256, 1, m_TEX0.CPSM == PSM_PSMCT32 ? DXGI_FORMAT_R8G8B8A8_UNORM : DXGI_FORMAT_R16_UNORM); //
|
||||
m_tc->m_renderer->m_dev.CreateTexture(m_palette, 256, 1, m_TEX0.CPSM == PSM_PSMCT32 ? DXGI_FORMAT_R8G8B8A8_UNORM : DXGI_FORMAT_R16_UNORM); //
|
||||
break;
|
||||
case PSM_PSMT4HL:
|
||||
case PSM_PSMT4HH:
|
||||
|
||||
@@ -517,12 +517,23 @@ void GSTextureCache::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const
|
||||
|
||||
while(pos)
|
||||
{
|
||||
POSITION cur = pos;
|
||||
|
||||
GSRenderTarget* rt = m_rt.GetNext(pos);
|
||||
|
||||
if(HasSharedBits(BITBLTBUF.SBP, BITBLTBUF.SPSM, rt->m_TEX0.TBP0, rt->m_TEX0.PSM))
|
||||
{
|
||||
rt->Read(r);
|
||||
return;
|
||||
if(HasCompatibleBits(BITBLTBUF.SPSM, rt->m_TEX0.PSM))
|
||||
{
|
||||
rt->Read(r);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_rt.RemoveAt(cur);
|
||||
delete rt;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,9 +31,10 @@ GSTextureCache::GSDepthStencil::GSDepthStencil(GSTextureCache* tc)
|
||||
|
||||
bool GSTextureCache::GSDepthStencil::Create(int w, int h)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateDepthStencil(m_texture, w, h);
|
||||
if(!m_tc->m_renderer->m_dev.CreateDepthStencil(m_texture, w, h))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// FIXME: initial data should be unswizzled from local mem in Update() if dirty
|
||||
|
||||
@@ -44,7 +45,7 @@ bool GSTextureCache::GSDepthStencil::Create(int w, int h)
|
||||
m_tc->m_renderer->m_dev->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 0, 0);
|
||||
m_tc->m_renderer->m_dev->SetDepthStencilSurface(surface);
|
||||
|
||||
return SUCCEEDED(hr);
|
||||
return true;
|
||||
}
|
||||
|
||||
void GSTextureCache::GSDepthStencil::Update()
|
||||
|
||||
@@ -279,7 +279,7 @@ void GSDevice::Present()
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateRenderTarget(GSTexture2D& t, int w, int h, D3DFORMAT format)
|
||||
bool GSDevice::CreateRenderTarget(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -295,23 +295,25 @@ HRESULT GSDevice::CreateRenderTarget(GSTexture2D& t, int w, int h, D3DFORMAT for
|
||||
|
||||
m_pool.RemoveAt(pos);
|
||||
|
||||
return S_OK;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IDirect3DTexture9> texture;
|
||||
|
||||
hr = m_dev->CreateTexture(w, h, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture, NULL);
|
||||
hr = m_dev->CreateTexture(w, h, 1, D3DUSAGE_RENDERTARGET, (D3DFORMAT)format, D3DPOOL_DEFAULT, &texture, NULL);
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
t = GSTexture2D(texture);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return hr;
|
||||
return false;
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateDepthStencil(GSTexture2D& t, int w, int h, D3DFORMAT format)
|
||||
bool GSDevice::CreateDepthStencil(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -327,23 +329,25 @@ HRESULT GSDevice::CreateDepthStencil(GSTexture2D& t, int w, int h, D3DFORMAT for
|
||||
|
||||
m_pool.RemoveAt(pos);
|
||||
|
||||
return S_OK;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IDirect3DSurface9> surface;
|
||||
|
||||
hr = m_dev->CreateDepthStencilSurface(w, h, format, D3DMULTISAMPLE_NONE, 0, FALSE, &surface, NULL);
|
||||
hr = m_dev->CreateDepthStencilSurface(w, h, (D3DFORMAT)format, D3DMULTISAMPLE_NONE, 0, FALSE, &surface, NULL);
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
t = GSTexture2D(surface);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return hr;
|
||||
return false;
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateTexture(GSTexture2D& t, int w, int h, D3DFORMAT format)
|
||||
bool GSDevice::CreateTexture(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -359,23 +363,25 @@ HRESULT GSDevice::CreateTexture(GSTexture2D& t, int w, int h, D3DFORMAT format)
|
||||
|
||||
m_pool.RemoveAt(pos);
|
||||
|
||||
return S_OK;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IDirect3DTexture9> texture;
|
||||
|
||||
hr = m_dev->CreateTexture(w, h, 1, 0, format, D3DPOOL_MANAGED, &texture, NULL);
|
||||
hr = m_dev->CreateTexture(w, h, 1, 0, (D3DFORMAT)format, D3DPOOL_MANAGED, &texture, NULL);
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
t = GSTexture2D(texture);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return hr;
|
||||
return false;
|
||||
}
|
||||
|
||||
HRESULT GSDevice::CreateOffscreenPlainSurface(GSTexture2D& t, int w, int h, D3DFORMAT format)
|
||||
bool GSDevice::CreateOffscreen(GSTexture2D& t, int w, int h, DWORD format)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@@ -391,35 +397,22 @@ HRESULT GSDevice::CreateOffscreenPlainSurface(GSTexture2D& t, int w, int h, D3DF
|
||||
|
||||
m_pool.RemoveAt(pos);
|
||||
|
||||
return S_OK;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CComPtr<IDirect3DSurface9> surface;
|
||||
|
||||
hr = m_dev->CreateOffscreenPlainSurface(w, h, format, D3DPOOL_SYSTEMMEM, &surface, NULL);
|
||||
hr = m_dev->CreateOffscreenPlainSurface(w, h, (D3DFORMAT)format, D3DPOOL_SYSTEMMEM, &surface, NULL);
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
t = GSTexture2D(surface);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
void GSDevice::Recycle(GSTexture2D& t)
|
||||
{
|
||||
if(t.m_texture)
|
||||
{
|
||||
m_pool.AddHead(t);
|
||||
|
||||
while(m_pool.GetCount() > 200)
|
||||
{
|
||||
m_pool.RemoveTail();
|
||||
}
|
||||
|
||||
t = GSTexture2D();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GSDevice::SaveCurrent(LPCTSTR fn)
|
||||
|
||||
@@ -55,10 +55,8 @@ struct VertexPT2
|
||||
float tu2, tv2;
|
||||
};
|
||||
|
||||
class GSDevice
|
||||
class GSDevice : public GSDeviceT<GSTexture2D>
|
||||
{
|
||||
CAtlList<GSTexture2D> m_pool;
|
||||
|
||||
void Interlace(GSTexture2D& st, GSTexture2D& dt, int shader, bool linear, float yoffset = 0);
|
||||
|
||||
public: // TODO
|
||||
@@ -94,12 +92,10 @@ public:
|
||||
void Draw(LPCTSTR str);
|
||||
void Present();
|
||||
|
||||
HRESULT CreateRenderTarget(GSTexture2D& t, int w, int h, D3DFORMAT format = D3DFMT_A8R8G8B8);
|
||||
HRESULT CreateDepthStencil(GSTexture2D& t, int w, int h, D3DFORMAT format = D3DFMT_D24S8/*D3DFMT_D32F_LOCKABLE*/);
|
||||
HRESULT CreateTexture(GSTexture2D& t, int w, int h, D3DFORMAT format = D3DFMT_A8R8G8B8);
|
||||
HRESULT CreateOffscreenPlainSurface(GSTexture2D& t, int w, int h, D3DFORMAT format = D3DFMT_A8R8G8B8);
|
||||
|
||||
void Recycle(GSTexture2D& t);
|
||||
bool CreateRenderTarget(GSTexture2D& t, int w, int h, DWORD format = D3DFMT_A8R8G8B8);
|
||||
bool CreateDepthStencil(GSTexture2D& t, int w, int h, DWORD format = D3DFMT_D24S8/*D3DFMT_D32F_LOCKABLE*/);
|
||||
bool CreateTexture(GSTexture2D& t, int w, int h, DWORD format = D3DFMT_A8R8G8B8);
|
||||
bool CreateOffscreen(GSTexture2D& t, int w, int h, DWORD format = D3DFMT_A8R8G8B8);
|
||||
|
||||
bool SaveCurrent(LPCTSTR fn);
|
||||
bool SaveToFileD24S8(IDirect3DSurface9* ds, LPCTSTR fn);
|
||||
|
||||
@@ -31,11 +31,10 @@ GSTextureCache::GSRenderTarget::GSRenderTarget(GSTextureCache* tc)
|
||||
|
||||
bool GSTextureCache::GSRenderTarget::Create(int w, int h)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, w, h);
|
||||
|
||||
if(FAILED(hr)) return false;
|
||||
if(!m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, w, h))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: clear
|
||||
|
||||
@@ -54,8 +53,6 @@ void GSTextureCache::GSRenderTarget::Update()
|
||||
|
||||
if(r.IsRectEmpty()) return;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
if(r.right > 1024) {ASSERT(0); r.right = 1024;}
|
||||
if(r.bottom > 1024) {ASSERT(0); r.bottom = 1024;}
|
||||
|
||||
@@ -64,9 +61,8 @@ void GSTextureCache::GSRenderTarget::Update()
|
||||
|
||||
GSTexture2D texture;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(texture, w, h);
|
||||
|
||||
if(FAILED(hr)) return;
|
||||
if(!m_tc->m_renderer->m_dev.CreateTexture(texture, w, h))
|
||||
return;
|
||||
|
||||
D3DLOCKED_RECT lr;
|
||||
|
||||
@@ -99,8 +95,6 @@ void GSTextureCache::GSRenderTarget::Update()
|
||||
|
||||
void GSTextureCache::GSRenderTarget::Read(CRect r)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if(m_TEX0.PSM != PSM_PSMCT32
|
||||
&& m_TEX0.PSM != PSM_PSMCT24
|
||||
&& m_TEX0.PSM != PSM_PSMCT16
|
||||
@@ -126,15 +120,15 @@ void GSTextureCache::GSRenderTarget::Read(CRect r)
|
||||
|
||||
GSTexture2D rt;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(rt, r.Width(), r.Height());
|
||||
m_tc->m_renderer->m_dev.CreateRenderTarget(rt, r.Width(), r.Height());
|
||||
|
||||
m_tc->m_renderer->m_dev.StretchRect(m_texture, src, rt, dst, m_tc->m_renderer->m_dev.m_ps_convert[1]);
|
||||
|
||||
GSTexture2D offscreen;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateOffscreenPlainSurface(offscreen, r.Width(), r.Height());
|
||||
m_tc->m_renderer->m_dev.CreateOffscreen(offscreen, r.Width(), r.Height());
|
||||
|
||||
hr = m_tc->m_renderer->m_dev->GetRenderTargetData(rt, offscreen);
|
||||
m_tc->m_renderer->m_dev->GetRenderTargetData(rt, offscreen);
|
||||
|
||||
m_tc->m_renderer->m_dev.Recycle(rt);
|
||||
|
||||
|
||||
@@ -586,14 +586,14 @@ if(s_dump)
|
||||
|
||||
void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, CRect r)
|
||||
{
|
||||
// TRACE(_T("[%d] InvalidateVideoMem %d,%d - %d,%d %05x\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP);
|
||||
// TRACE(_T("[%d] InvalidateVideoMem %d,%d - %d,%d %05x (%d)\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP, (int)BITBLTBUF.DPSM);
|
||||
|
||||
m_tc.InvalidateVideoMem(BITBLTBUF, &r);
|
||||
}
|
||||
|
||||
void GSRendererHW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, CRect r)
|
||||
{
|
||||
// TRACE(_T("[%d] InvalidateLocalMem %d,%d - %d,%d %05x\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.SBP);
|
||||
// TRACE(_T("[%d] InvalidateLocalMem %d,%d - %d,%d %05x (%d)\n"), (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.SBP, (int)BITBLTBUF.SPSM);
|
||||
|
||||
m_tc.InvalidateLocalMem(BITBLTBUF, &r);
|
||||
}
|
||||
|
||||
@@ -292,8 +292,6 @@ void GSRendererSW<Vertex>::Draw()
|
||||
template <class Vertex>
|
||||
void GSRendererSW<Vertex>::Flip()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
FlipInfo src[2];
|
||||
|
||||
for(int i = 0; i < countof(src); i++)
|
||||
@@ -313,11 +311,9 @@ void GSRendererSW<Vertex>::Flip()
|
||||
m_texture[i] = GSTexture2D();
|
||||
}
|
||||
|
||||
if(!m_texture[i])
|
||||
if(!m_texture[i] && !m_dev.CreateTexture(m_texture[i], w, h))
|
||||
{
|
||||
hr = m_dev.CreateTexture(m_texture[i], w, h);
|
||||
|
||||
if(FAILED(hr)) continue;
|
||||
continue;
|
||||
}
|
||||
|
||||
GIFRegTEX0 TEX0;
|
||||
|
||||
@@ -37,8 +37,6 @@ bool GSTextureCache::GSTexture::Create()
|
||||
{
|
||||
// m_tc->m_renderer->m_perfmon.Put(GSPerfMon::WriteTexture, 1);
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
m_TEX0 = m_tc->m_renderer->m_context->TEX0;
|
||||
m_CLAMP = m_tc->m_renderer->m_context->CLAMP;
|
||||
|
||||
@@ -82,9 +80,7 @@ bool GSTextureCache::GSTexture::Create()
|
||||
int w = 1 << m_TEX0.TW;
|
||||
int h = 1 << m_TEX0.TH;
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_texture, w, h, format);
|
||||
|
||||
return SUCCEEDED(hr);
|
||||
return m_tc->m_renderer->m_dev.CreateTexture(m_texture, w, h, format);
|
||||
}
|
||||
|
||||
bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
@@ -93,8 +89,6 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
// m_tc->m_renderer->m_perfmon.Put(GSPerfMon::ConvertRT2T, 1);
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
m_scale = rt->m_scale;
|
||||
m_TEX0 = m_tc->m_renderer->m_context->TEX0;
|
||||
m_CLAMP = m_tc->m_renderer->m_context->CLAMP;
|
||||
@@ -115,7 +109,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
// ASSERT(rt->m_TEX0.TBW > m_TEX0.TBW); // otherwise scale.x need to be reduced to make the larger texture fit (TODO)
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
m_tc->m_renderer->m_dev.CreateRenderTarget(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
|
||||
int bw = 64;
|
||||
int bh = m_TEX0.PSM == PSM_PSMCT32 || m_TEX0.PSM == PSM_PSMCT24 ? 32 : 64;
|
||||
@@ -201,7 +195,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
dt = &tmp;
|
||||
}
|
||||
|
||||
hr = m_tc->m_renderer->m_dev.CreateRenderTarget(*dt, w, h);
|
||||
m_tc->m_renderer->m_dev.CreateRenderTarget(*dt, w, h);
|
||||
|
||||
if(src == dst)
|
||||
{
|
||||
@@ -227,7 +221,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
|
||||
if(!m_texture)
|
||||
{
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
m_tc->m_renderer->m_dev.CreateTexture(m_texture, rt->m_texture.m_desc.Width, rt->m_texture.m_desc.Height);
|
||||
|
||||
m_tc->m_renderer->m_dev->StretchRect(rt->m_texture, NULL, m_texture, NULL, D3DTEXF_POINT);
|
||||
}
|
||||
@@ -246,7 +240,7 @@ bool GSTextureCache::GSTexture::Create(GSRenderTarget* rt)
|
||||
break;
|
||||
case PSM_PSMT8H:
|
||||
m_bpp2 = 3;
|
||||
hr = m_tc->m_renderer->m_dev.CreateTexture(m_palette, 256, 1, m_TEX0.CPSM == PSM_PSMCT32 ? D3DFMT_A8R8G8B8 : D3DFMT_A1R5G5B5);
|
||||
m_tc->m_renderer->m_dev.CreateTexture(m_palette, 256, 1, m_TEX0.CPSM == PSM_PSMCT32 ? D3DFMT_A8R8G8B8 : D3DFMT_A1R5G5B5);
|
||||
break;
|
||||
case PSM_PSMT4HL:
|
||||
case PSM_PSMT4HH:
|
||||
|
||||
@@ -527,12 +527,23 @@ void GSTextureCache::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const
|
||||
|
||||
while(pos)
|
||||
{
|
||||
POSITION cur = pos;
|
||||
|
||||
GSRenderTarget* rt = m_rt.GetNext(pos);
|
||||
|
||||
if(HasSharedBits(BITBLTBUF.SBP, BITBLTBUF.SPSM, rt->m_TEX0.TBP0, rt->m_TEX0.PSM))
|
||||
{
|
||||
rt->Read(r);
|
||||
return;
|
||||
if(HasCompatibleBits(BITBLTBUF.SPSM, rt->m_TEX0.PSM))
|
||||
{
|
||||
rt->Read(r);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_rt.RemoveAt(cur);
|
||||
delete rt;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -68,9 +68,10 @@ bool GSTextureFX::CreateMskFix(GSTexture2D& t, DWORD size, DWORD msk, DWORD fix)
|
||||
|
||||
if(!m_mskfix.Lookup(hash, t))
|
||||
{
|
||||
HRESULT hr = m_dev->CreateTexture(t, size, 1, D3DFMT_R32F);
|
||||
|
||||
if(FAILED(hr)) return false;
|
||||
if(!m_dev->CreateTexture(t, size, 1, D3DFMT_R32F))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
D3DLOCKED_RECT lr;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user