Skip to content

Commit

Permalink
gsdx hw: add API to manage sparse texture allocation
Browse files Browse the repository at this point in the history
DX/GL should implement "CommitPages" to really commit memory

Note: CommitPages should also update the m_committed_size member
  • Loading branch information
gregory38 authored and lightningterror committed Apr 26, 2019
1 parent 643ed52 commit 9e7069f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 0 deletions.
55 changes: 55 additions & 0 deletions plugins/GSdx/Renderers/Common/GSTexture.cpp
Expand Up @@ -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;
}
11 changes: 11 additions & 0 deletions plugins/GSdx/Renderers/Common/GSTexture.h
Expand Up @@ -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;};
Expand Down Expand Up @@ -59,6 +62,14 @@ class GSTexture
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;
Expand Down
1 change: 1 addition & 0 deletions plugins/GSdx/stdafx.h
Expand Up @@ -117,6 +117,7 @@ typedef int64 sint64;
#include <condition_variable>
#include <functional>
#include <memory>
#include <bitset>

#include <zlib.h>

Expand Down

0 comments on commit 9e7069f

Please sign in to comment.