mirror of https://github.com/PCSX2/pcsx2.git
gsdx hw: add API to manage sparse texture allocation
DX/GL should implement "CommitPages" to really commit memory Note: CommitPages should also update the m_committed_size member
This commit is contained in:
parent
643ed528c2
commit
9e7069f374
|
@ -25,11 +25,66 @@
|
||||||
GSTexture::GSTexture()
|
GSTexture::GSTexture()
|
||||||
: m_scale(1, 1)
|
: m_scale(1, 1)
|
||||||
, m_size(0, 0)
|
, m_size(0, 0)
|
||||||
|
, m_committed_size(0, 0)
|
||||||
|
, m_gpu_page_size(0, 0)
|
||||||
, m_type(0)
|
, m_type(0)
|
||||||
, m_format(0)
|
, m_format(0)
|
||||||
|
, m_sparse(false)
|
||||||
, last_frame_used(0)
|
, last_frame_used(0)
|
||||||
, LikelyOffset(false)
|
, LikelyOffset(false)
|
||||||
, OffsetHack_modx(0.0f)
|
, OffsetHack_modx(0.0f)
|
||||||
, OffsetHack_mody(0.0f)
|
, OffsetHack_mody(0.0f)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GSTexture::CommitRegion(const GSVector2i& region)
|
||||||
|
{
|
||||||
|
if (!m_sparse)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GSVector2i aligned_region = RoundUpPage(region);
|
||||||
|
aligned_region.x = std::max(m_committed_size.x, aligned_region.x);
|
||||||
|
aligned_region.y = std::max(m_committed_size.y, aligned_region.y);
|
||||||
|
if (aligned_region != m_committed_size)
|
||||||
|
CommitPages(aligned_region, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSTexture::Commit()
|
||||||
|
{
|
||||||
|
if (!m_sparse)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_committed_size != m_size)
|
||||||
|
CommitPages(m_size, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSTexture::Uncommit()
|
||||||
|
{
|
||||||
|
if (!m_sparse)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GSVector2i zero = GSVector2i(0, 0);
|
||||||
|
|
||||||
|
if (m_committed_size != zero)
|
||||||
|
CommitPages(m_committed_size, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSTexture::SetGpuPageSize(const GSVector2i& page_size)
|
||||||
|
{
|
||||||
|
ASSERT(std::bitset<32>(page_size.x + 1).count() == 1);
|
||||||
|
ASSERT(std::bitset<32>(page_size.y + 1).count() == 1);
|
||||||
|
|
||||||
|
m_gpu_page_size = page_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
GSVector2i GSTexture::RoundUpPage(GSVector2i v)
|
||||||
|
{
|
||||||
|
v.x = std::min(m_size.x, v.x);
|
||||||
|
v.y = std::min(m_size.y, v.y);
|
||||||
|
v.x += m_gpu_page_size.x;
|
||||||
|
v.y += m_gpu_page_size.y;
|
||||||
|
v.x &= ~m_gpu_page_size.x;
|
||||||
|
v.y &= ~m_gpu_page_size.y;
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
|
@ -28,8 +28,11 @@ class GSTexture
|
||||||
protected:
|
protected:
|
||||||
GSVector2 m_scale;
|
GSVector2 m_scale;
|
||||||
GSVector2i m_size;
|
GSVector2i m_size;
|
||||||
|
GSVector2i m_committed_size;
|
||||||
|
GSVector2i m_gpu_page_size;
|
||||||
int m_type;
|
int m_type;
|
||||||
int m_format;
|
int m_format;
|
||||||
|
bool m_sparse;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
struct GSMap {uint8* bits; int pitch;};
|
struct GSMap {uint8* bits; int pitch;};
|
||||||
|
@ -59,6 +62,14 @@ public:
|
||||||
int GetType() const {return m_type;}
|
int GetType() const {return m_type;}
|
||||||
int GetFormat() const {return m_format;}
|
int GetFormat() const {return m_format;}
|
||||||
|
|
||||||
|
virtual void CommitPages(const GSVector2i& region, bool commit) {};
|
||||||
|
void CommitRegion(const GSVector2i& region);
|
||||||
|
void Commit();
|
||||||
|
void Uncommit();
|
||||||
|
GSVector2i GetCommittedSize() const { return m_committed_size; }
|
||||||
|
void SetGpuPageSize(const GSVector2i& page_size);
|
||||||
|
GSVector2i RoundUpPage(GSVector2i v);
|
||||||
|
|
||||||
// frame number (arbitrary base) the texture was recycled on
|
// frame number (arbitrary base) the texture was recycled on
|
||||||
// different purpose than texture cache ages, do not attempt to merge
|
// different purpose than texture cache ages, do not attempt to merge
|
||||||
unsigned last_frame_used;
|
unsigned last_frame_used;
|
||||||
|
|
|
@ -117,6 +117,7 @@ typedef int64 sint64;
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <bitset>
|
||||||
|
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue