mirror of https://github.com/PCSX2/pcsx2.git
GS: Move mipmap generation flag to GSTexture
This commit is contained in:
parent
75518b71ea
commit
90e1284d83
|
@ -22,9 +22,11 @@ GSTexture::GSTexture()
|
||||||
, m_size(0, 0)
|
, m_size(0, 0)
|
||||||
, m_committed_size(0, 0)
|
, m_committed_size(0, 0)
|
||||||
, m_gpu_page_size(0, 0)
|
, m_gpu_page_size(0, 0)
|
||||||
|
, m_mipmap_levels(0)
|
||||||
, m_type(Type::Invalid)
|
, m_type(Type::Invalid)
|
||||||
, m_format(Format::Invalid)
|
, m_format(Format::Invalid)
|
||||||
, m_sparse(false)
|
, m_sparse(false)
|
||||||
|
, m_needs_mipmaps_generated(true)
|
||||||
, last_frame_used(0)
|
, last_frame_used(0)
|
||||||
, LikelyOffset(false)
|
, LikelyOffset(false)
|
||||||
, OffsetHack_modx(0.0f)
|
, OffsetHack_modx(0.0f)
|
||||||
|
@ -32,6 +34,15 @@ GSTexture::GSTexture()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GSTexture::GenerateMipmapsIfNeeded()
|
||||||
|
{
|
||||||
|
if (!m_needs_mipmaps_generated || m_mipmap_levels <= 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_needs_mipmaps_generated = false;
|
||||||
|
GenerateMipmap();
|
||||||
|
}
|
||||||
|
|
||||||
void GSTexture::CommitRegion(const GSVector2i& region)
|
void GSTexture::CommitRegion(const GSVector2i& region)
|
||||||
{
|
{
|
||||||
if (!m_sparse)
|
if (!m_sparse)
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
int pitch;
|
int pitch;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Type
|
enum class Type : u8
|
||||||
{
|
{
|
||||||
Invalid = 0,
|
Invalid = 0,
|
||||||
RenderTarget = 1,
|
RenderTarget = 1,
|
||||||
|
@ -37,7 +37,7 @@ public:
|
||||||
SparseDepthStencil,
|
SparseDepthStencil,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Format
|
enum class Format : u8
|
||||||
{
|
{
|
||||||
Invalid = 0, ///< Used for initialization
|
Invalid = 0, ///< Used for initialization
|
||||||
Color, ///< Standard (RGBA8) color texture
|
Color, ///< Standard (RGBA8) color texture
|
||||||
|
@ -54,9 +54,11 @@ protected:
|
||||||
GSVector2i m_size;
|
GSVector2i m_size;
|
||||||
GSVector2i m_committed_size;
|
GSVector2i m_committed_size;
|
||||||
GSVector2i m_gpu_page_size;
|
GSVector2i m_gpu_page_size;
|
||||||
|
int m_mipmap_levels;
|
||||||
Type m_type;
|
Type m_type;
|
||||||
Format m_format;
|
Format m_format;
|
||||||
bool m_sparse;
|
bool m_sparse;
|
||||||
|
bool m_needs_mipmaps_generated;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GSTexture();
|
GSTexture();
|
||||||
|
@ -84,10 +86,14 @@ public:
|
||||||
int GetWidth() const { return m_size.x; }
|
int GetWidth() const { return m_size.x; }
|
||||||
int GetHeight() const { return m_size.y; }
|
int GetHeight() const { return m_size.y; }
|
||||||
GSVector2i GetSize() const { return m_size; }
|
GSVector2i GetSize() const { return m_size; }
|
||||||
|
int GetMipmapLevels() const { return m_mipmap_levels; }
|
||||||
|
|
||||||
Type GetType() const { return m_type; }
|
Type GetType() const { return m_type; }
|
||||||
Format GetFormat() const { return m_format; }
|
Format GetFormat() const { return m_format; }
|
||||||
|
|
||||||
|
void GenerateMipmapsIfNeeded();
|
||||||
|
void ClearMipmapGenerationFlag() { m_needs_mipmaps_generated = false; }
|
||||||
|
|
||||||
virtual void CommitPages(const GSVector2i& region, bool commit) {}
|
virtual void CommitPages(const GSVector2i& region, bool commit) {}
|
||||||
void CommitRegion(const GSVector2i& region);
|
void CommitRegion(const GSVector2i& region);
|
||||||
void Commit();
|
void Commit();
|
||||||
|
|
|
@ -1420,6 +1420,8 @@ void GSRendererHW::Draw()
|
||||||
m_src->UpdateLayer(MIP_TEX0, r, layer - m_lod.x);
|
m_src->UpdateLayer(MIP_TEX0, r, layer - m_lod.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we don't need to generate mipmaps since they were provided
|
||||||
|
m_src->m_texture->ClearMipmapGenerationFlag();
|
||||||
m_vt.m_min.t = tmin;
|
m_vt.m_min.t = tmin;
|
||||||
m_vt.m_max.t = tmax;
|
m_vt.m_max.t = tmax;
|
||||||
}
|
}
|
||||||
|
|
|
@ -948,7 +948,7 @@ void GSRendererNew::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
||||||
}
|
}
|
||||||
else if (trilinear_auto)
|
else if (trilinear_auto)
|
||||||
{
|
{
|
||||||
tex->m_texture->GenerateMipmap();
|
tex->m_texture->GenerateMipmapsIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TC Offset Hack
|
// TC Offset Hack
|
||||||
|
|
|
@ -172,7 +172,7 @@ namespace PboPool
|
||||||
} // namespace PboPool
|
} // namespace PboPool
|
||||||
|
|
||||||
GSTextureOGL::GSTextureOGL(Type type, int w, int h, Format format, GLuint fbo_read, bool mipmap)
|
GSTextureOGL::GSTextureOGL(Type type, int w, int h, Format format, GLuint fbo_read, bool mipmap)
|
||||||
: m_clean(false), m_generate_mipmap(true), m_r_x(0), m_r_y(0), m_r_w(0), m_r_h(0), m_layer(0)
|
: m_clean(false), m_r_x(0), m_r_y(0), m_r_w(0), m_r_h(0), m_layer(0)
|
||||||
{
|
{
|
||||||
// OpenGL didn't like dimensions of size 0
|
// OpenGL didn't like dimensions of size 0
|
||||||
m_size.x = std::max(1, w);
|
m_size.x = std::max(1, w);
|
||||||
|
@ -182,7 +182,7 @@ GSTextureOGL::GSTextureOGL(Type type, int w, int h, Format format, GLuint fbo_re
|
||||||
m_fbo_read = fbo_read;
|
m_fbo_read = fbo_read;
|
||||||
m_texture_id = 0;
|
m_texture_id = 0;
|
||||||
m_sparse = false;
|
m_sparse = false;
|
||||||
m_max_layer = 1;
|
m_mipmap_levels = 1;
|
||||||
int gl_fmt = 0;
|
int gl_fmt = 0;
|
||||||
|
|
||||||
// Bunch of constant parameter
|
// Bunch of constant parameter
|
||||||
|
@ -251,7 +251,7 @@ GSTextureOGL::GSTextureOGL(Type type, int w, int h, Format format, GLuint fbo_re
|
||||||
{
|
{
|
||||||
case Type::Texture:
|
case Type::Texture:
|
||||||
// Only 32 bits input texture will be supported for mipmap
|
// Only 32 bits input texture will be supported for mipmap
|
||||||
m_max_layer = mipmap && m_format == Format::Color ? (int)log2(std::max(w, h)) : 1;
|
m_mipmap_levels = mipmap && m_format == Format::Color ? (int)log2(std::max(w, h)) : 1;
|
||||||
break;
|
break;
|
||||||
case Type::SparseRenderTarget:
|
case Type::SparseRenderTarget:
|
||||||
case Type::SparseDepthStencil:
|
case Type::SparseDepthStencil:
|
||||||
|
@ -327,7 +327,7 @@ GSTextureOGL::GSTextureOGL(Type type, int w, int h, Format format, GLuint fbo_re
|
||||||
throw std::bad_alloc();
|
throw std::bad_alloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
glTextureStorage2D(m_texture_id, m_max_layer + GL_TEX_LEVEL_0, gl_fmt, m_size.x, m_size.y);
|
glTextureStorage2D(m_texture_id, m_mipmap_levels, gl_fmt, m_size.x, m_size.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSTextureOGL::~GSTextureOGL()
|
GSTextureOGL::~GSTextureOGL()
|
||||||
|
@ -368,7 +368,7 @@ bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch, int
|
||||||
{
|
{
|
||||||
ASSERT(m_type != Type::DepthStencil && m_type != Type::Offscreen);
|
ASSERT(m_type != Type::DepthStencil && m_type != Type::Offscreen);
|
||||||
|
|
||||||
if (layer >= m_max_layer)
|
if (layer >= m_mipmap_levels)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Default upload path for the texture is the Map/Unmap
|
// Default upload path for the texture is the Map/Unmap
|
||||||
|
@ -431,14 +431,14 @@ bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch, int
|
||||||
PboPool::EndTransfer();
|
PboPool::EndTransfer();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_generate_mipmap = true;
|
m_needs_mipmaps_generated = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GSTextureOGL::Map(GSMap& m, const GSVector4i* _r, int layer)
|
bool GSTextureOGL::Map(GSMap& m, const GSVector4i* _r, int layer)
|
||||||
{
|
{
|
||||||
if (layer >= m_max_layer)
|
if (layer >= m_mipmap_levels)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
GSVector4i r = _r ? *_r : GSVector4i(0, 0, m_size.x, m_size.y);
|
GSVector4i r = _r ? *_r : GSVector4i(0, 0, m_size.x, m_size.y);
|
||||||
|
@ -491,7 +491,7 @@ void GSTextureOGL::Unmap()
|
||||||
|
|
||||||
PboPool::EndTransfer();
|
PboPool::EndTransfer();
|
||||||
|
|
||||||
m_generate_mipmap = true;
|
m_needs_mipmaps_generated = true;
|
||||||
|
|
||||||
GL_POP(); // PUSH is in Map
|
GL_POP(); // PUSH is in Map
|
||||||
}
|
}
|
||||||
|
@ -499,11 +499,8 @@ void GSTextureOGL::Unmap()
|
||||||
|
|
||||||
void GSTextureOGL::GenerateMipmap()
|
void GSTextureOGL::GenerateMipmap()
|
||||||
{
|
{
|
||||||
if (m_generate_mipmap && m_max_layer > 1)
|
ASSERT(m_mipmap_levels > 1);
|
||||||
{
|
glGenerateTextureMipmap(m_texture_id);
|
||||||
glGenerateTextureMipmap(m_texture_id);
|
|
||||||
m_generate_mipmap = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSTextureOGL::CommitPages(const GSVector2i& region, bool commit)
|
void GSTextureOGL::CommitPages(const GSVector2i& region, bool commit)
|
||||||
|
|
|
@ -40,7 +40,6 @@ private:
|
||||||
GLuint m_texture_id; // the texture id
|
GLuint m_texture_id; // the texture id
|
||||||
GLuint m_fbo_read;
|
GLuint m_fbo_read;
|
||||||
bool m_clean;
|
bool m_clean;
|
||||||
bool m_generate_mipmap;
|
|
||||||
|
|
||||||
// Avoid alignment constrain
|
// Avoid alignment constrain
|
||||||
//GSVector4i m_r;
|
//GSVector4i m_r;
|
||||||
|
@ -49,7 +48,6 @@ private:
|
||||||
int m_r_w;
|
int m_r_w;
|
||||||
int m_r_h;
|
int m_r_h;
|
||||||
int m_layer;
|
int m_layer;
|
||||||
int m_max_layer;
|
|
||||||
|
|
||||||
// internal opengl format/type/alignment
|
// internal opengl format/type/alignment
|
||||||
GLenum m_int_format;
|
GLenum m_int_format;
|
||||||
|
|
Loading…
Reference in New Issue