mirror of
https://github.com/libretro/pcsx2.git
synced 2024-12-23 02:08:27 +00:00
GSdx: just fixing slow texture uploads with dx9... (odin sphere back to 40-50 fps)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1279 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
50332c1cd1
commit
4bc698d698
@ -40,7 +40,7 @@ public:
|
||||
virtual int GetHeight() const = 0;
|
||||
virtual int GetFormat() const = 0;
|
||||
virtual bool Update(const GSVector4i& r, const void* data, int pitch) = 0;
|
||||
virtual bool Map(uint8** bits, int& pitch) = 0;
|
||||
virtual bool Map(uint8** bits, int& pitch, const GSVector4i* r = NULL) = 0;
|
||||
virtual void Unmap() = 0;
|
||||
virtual bool Save(const string& fn, bool dds = false) = 0;
|
||||
|
||||
|
@ -83,8 +83,15 @@ bool GSTexture10::Update(const GSVector4i& r, const void* data, int pitch)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GSTexture10::Map(uint8** bits, int& pitch)
|
||||
bool GSTexture10::Map(uint8** bits, int& pitch, const GSVector4i* r)
|
||||
{
|
||||
if(r != NULL)
|
||||
{
|
||||
// ASSERT(0); // not implemented
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(m_texture)
|
||||
{
|
||||
D3D10_MAPPED_TEXTURE2D map;
|
||||
|
@ -44,7 +44,7 @@ public:
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
bool Map(uint8** bits, int& pitch);
|
||||
bool Map(uint8** bits, int& pitch, const GSVector4i* r);
|
||||
void Unmap();
|
||||
bool Save(const string& fn, bool dds = false);
|
||||
|
||||
|
@ -133,10 +133,17 @@ bool GSTexture7::Update(const GSVector4i& r, const void* data, int pitch)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GSTexture7::Map(uint8** bits, int& pitch)
|
||||
bool GSTexture7::Map(uint8** bits, int& pitch, const GSVector4i* r)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if(r != NULL)
|
||||
{
|
||||
// ASSERT(0); // not implemented
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
DDSURFACEDESC2 desc;
|
||||
|
||||
if(SUCCEEDED(hr = m_system->Lock(NULL, &desc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL)))
|
||||
|
@ -44,7 +44,7 @@ public:
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
bool Map(uint8** bits, int& pitch);
|
||||
bool Map(uint8** bits, int& pitch, const GSVector4i* r);
|
||||
void Unmap();
|
||||
bool Save(const string& fn, bool dds = false);
|
||||
|
||||
|
@ -113,7 +113,7 @@ bool GSTexture9::Update(const GSVector4i& r, const void* data, int pitch)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GSTexture9::Map(uint8** bits, int& pitch)
|
||||
bool GSTexture9::Map(uint8** bits, int& pitch, const GSVector4i* r)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@ -121,7 +121,7 @@ bool GSTexture9::Map(uint8** bits, int& pitch)
|
||||
{
|
||||
D3DLOCKED_RECT lr;
|
||||
|
||||
if(SUCCEEDED(hr = surface->LockRect(&lr, NULL, 0)))
|
||||
if(SUCCEEDED(hr = surface->LockRect(&lr, (LPRECT)r, 0)))
|
||||
{
|
||||
*bits = (uint8*)lr.pBits;
|
||||
pitch = (int)lr.Pitch;
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
int GetHeight() const;
|
||||
int GetFormat() const;
|
||||
bool Update(const GSVector4i& r, const void* data, int pitch);
|
||||
bool Map(uint8** bits, int& pitch);
|
||||
bool Map(uint8** bits, int& pitch, const GSVector4i* r);
|
||||
void Unmap();
|
||||
bool Save(const string& fn, bool dds = false);
|
||||
|
||||
|
@ -698,20 +698,41 @@ void GSTextureCache::GSCachedTexture::Update()
|
||||
|
||||
m_valid = m_valid.runion(r);
|
||||
|
||||
static uint8* bits = (uint8*)::_aligned_malloc(1024 * 1024 * 4, 16);
|
||||
|
||||
int pitch = ((r.width() + 3) & ~3) * 4;
|
||||
|
||||
if(m_renderer->m_psrr)
|
||||
uint8* bits = NULL;
|
||||
int pitch = 0;
|
||||
|
||||
if(m_texture->Map(&bits, pitch, &r))
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNPNC(r, bits, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
// in dx9 managed textures can be written directly, less copying is faster, but still not as fast as dx10's UpdateResource
|
||||
|
||||
if(m_renderer->m_psrr)
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNPNC(r, bits, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNP(r, bits, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
}
|
||||
|
||||
m_texture->Unmap();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNP(r, bits, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
}
|
||||
static uint8* buff = (uint8*)::_aligned_malloc(1024 * 1024 * 4, 16);
|
||||
|
||||
pitch = ((r.width() + 3) & ~3) * 4;
|
||||
|
||||
m_texture->Update(r, bits, pitch);
|
||||
if(m_renderer->m_psrr)
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNPNC(r, buff, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_renderer->m_mem.ReadTextureNP(r, buff, pitch, m_renderer->m_context->TEX0, m_renderer->m_env.TEXA, m_renderer->m_context->CLAMP);
|
||||
}
|
||||
|
||||
m_texture->Update(r, buff, pitch);
|
||||
}
|
||||
|
||||
m_renderer->m_perfmon.Put(GSPerfMon::Unswizzle, r.width() * r.height() * m_bpp >> 3);
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ public:
|
||||
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(uint8** bits, int& pitch) {return true;}
|
||||
bool Map(uint8** bits, int& pitch, const GSVector4i* r) {return false;}
|
||||
void Unmap() {}
|
||||
bool Save(const string& fn, bool dds = false) {return false;}
|
||||
};
|
||||
|
@ -174,7 +174,9 @@ bool GSUtil::IsDirect3D10Available()
|
||||
|
||||
char* GSUtil::GetLibName()
|
||||
{
|
||||
static string str = format("GSdx %d", SVN_REV);
|
||||
static string str;
|
||||
|
||||
str = format("GSdx %d", SVN_REV);
|
||||
|
||||
if(SVN_MODS) str += "m";
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user