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()
|
||||
: m_scale(1, 1)
|
||||
, m_size(0, 0)
|
||||
, m_committed_size(0, 0)
|
||||
, m_gpu_page_size(0, 0)
|
||||
, m_type(0)
|
||||
, m_format(0)
|
||||
, m_sparse(false)
|
||||
, last_frame_used(0)
|
||||
, LikelyOffset(false)
|
||||
, OffsetHack_modx(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:
|
||||
GSVector2 m_scale;
|
||||
GSVector2i m_size;
|
||||
GSVector2i m_committed_size;
|
||||
GSVector2i m_gpu_page_size;
|
||||
int m_type;
|
||||
int m_format;
|
||||
bool m_sparse;
|
||||
|
||||
public:
|
||||
struct GSMap {uint8* bits; int pitch;};
|
||||
|
@ -59,6 +62,14 @@ public:
|
|||
int GetType() const {return m_type;}
|
||||
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
|
||||
// different purpose than texture cache ages, do not attempt to merge
|
||||
unsigned last_frame_used;
|
||||
|
|
|
@ -117,6 +117,7 @@ typedef int64 sint64;
|
|||
#include <condition_variable>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <bitset>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
|
|
Loading…
Reference in New Issue