This commit is contained in:
gabest
2007-12-17 01:34:13 +00:00
parent e60b44a39a
commit 3bd5bf7e2f
20 changed files with 141 additions and 168 deletions

View File

@@ -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

View File

@@ -31,6 +31,7 @@
#include "GSDirtyRect.h"
#include "GSPerfMon.h"
#include "GSVector.h"
#include "GSDeviceT.h"
class GSState
{

View File

@@ -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"
>

View File

@@ -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()

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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:

View File

@@ -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;
}
}
}

View File

@@ -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()

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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:

View File

@@ -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;
}
}
}

View File

@@ -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;