mirror of https://github.com/PCSX2/pcsx2.git
GS: Allocate mipmaps for Basic+ and only on non-copy textures
This commit is contained in:
parent
220c7c271b
commit
0ce21c91ef
|
@ -39,7 +39,7 @@ GSState::GSState()
|
|||
// m_nativeres seems to be a hack. Unfortunately it impacts draw call number which make debug painful in the replayer.
|
||||
// Let's keep it disabled to ease debug.
|
||||
m_nativeres = theApp.GetConfigI("upscale_multiplier") == 1;
|
||||
m_mipmap = theApp.GetConfigI("mipmap");
|
||||
m_mipmap = theApp.GetConfigB("mipmap");
|
||||
m_NTSC_Saturation = theApp.GetConfigB("NTSC_Saturation");
|
||||
if (theApp.GetConfigB("UserHacks"))
|
||||
{
|
||||
|
|
|
@ -219,7 +219,7 @@ public:
|
|||
int m_frameskip;
|
||||
bool m_NTSC_Saturation;
|
||||
bool m_nativeres;
|
||||
int m_mipmap;
|
||||
bool m_mipmap;
|
||||
|
||||
static int s_n;
|
||||
bool s_dump;
|
||||
|
|
|
@ -104,7 +104,7 @@ void GSDevice::RestoreAPIState()
|
|||
{
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int w, int h, GSTexture::Format format, bool clear, bool prefer_reuse)
|
||||
GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format, bool clear, bool prefer_reuse)
|
||||
{
|
||||
const GSVector2i size(w, h);
|
||||
const bool prefer_new_texture = (m_features.prefer_new_textures && type == GSTexture::Type::Texture && !prefer_reuse);
|
||||
|
@ -118,7 +118,7 @@ GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int w, int h, GSTexture:
|
|||
|
||||
assert(t);
|
||||
|
||||
if (t->GetType() == type && t->GetFormat() == format && t->GetSize() == size)
|
||||
if (t->GetType() == type && t->GetFormat() == format && t->GetSize() == size && t->IsMipmap() == mipmap)
|
||||
{
|
||||
if (!prefer_new_texture)
|
||||
{
|
||||
|
@ -143,7 +143,7 @@ GSTexture* GSDevice::FetchSurface(GSTexture::Type type, int w, int h, GSTexture:
|
|||
}
|
||||
else
|
||||
{
|
||||
t = CreateSurface(type, w, h, format);
|
||||
t = CreateSurface(type, w, h, mipmap, format);
|
||||
if (!t)
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
|
@ -243,32 +243,32 @@ void GSDevice::PurgePool()
|
|||
|
||||
GSTexture* GSDevice::CreateSparseRenderTarget(int w, int h, GSTexture::Format format, bool clear)
|
||||
{
|
||||
return FetchSurface(HasColorSparse() ? GSTexture::Type::SparseRenderTarget : GSTexture::Type::RenderTarget, w, h, format, clear, true);
|
||||
return FetchSurface(HasColorSparse() ? GSTexture::Type::SparseRenderTarget : GSTexture::Type::RenderTarget, w, h, false, format, clear, true);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::CreateSparseDepthStencil(int w, int h, GSTexture::Format format, bool clear)
|
||||
{
|
||||
return FetchSurface(HasDepthSparse() ? GSTexture::Type::SparseDepthStencil : GSTexture::Type::DepthStencil, w, h, format, clear, true);
|
||||
return FetchSurface(HasDepthSparse() ? GSTexture::Type::SparseDepthStencil : GSTexture::Type::DepthStencil, w, h, false, format, clear, true);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::CreateRenderTarget(int w, int h, GSTexture::Format format, bool clear)
|
||||
{
|
||||
return FetchSurface(GSTexture::Type::RenderTarget, w, h, format, clear, true);
|
||||
return FetchSurface(GSTexture::Type::RenderTarget, w, h, false, format, clear, true);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::CreateDepthStencil(int w, int h, GSTexture::Format format, bool clear)
|
||||
{
|
||||
return FetchSurface(GSTexture::Type::DepthStencil, w, h, format, clear, true);
|
||||
return FetchSurface(GSTexture::Type::DepthStencil, w, h, false, format, clear, true);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::CreateTexture(int w, int h, GSTexture::Format format, bool prefer_reuse)
|
||||
GSTexture* GSDevice::CreateTexture(int w, int h, bool mipmap, GSTexture::Format format, bool prefer_reuse /* = false */)
|
||||
{
|
||||
return FetchSurface(GSTexture::Type::Texture, w, h, format, false, prefer_reuse);
|
||||
return FetchSurface(GSTexture::Type::Texture, w, h, mipmap, format, false, prefer_reuse);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice::CreateOffscreen(int w, int h, GSTexture::Format format)
|
||||
{
|
||||
return FetchSurface(GSTexture::Type::Offscreen, w, h, format, false, true);
|
||||
return FetchSurface(GSTexture::Type::Offscreen, w, h, false, format, false, true);
|
||||
}
|
||||
|
||||
GSTexture::Format GSDevice::GetDefaultTextureFormat(GSTexture::Type type)
|
||||
|
@ -428,10 +428,11 @@ bool GSDevice::ResizeTexture(GSTexture** t, GSTexture::Type type, int w, int h,
|
|||
|
||||
if (t2 == NULL || t2->GetWidth() != w || t2->GetHeight() != h)
|
||||
{
|
||||
GSTexture::Format fmt = t2 ? t2->GetFormat() : GetDefaultTextureFormat(type);
|
||||
const GSTexture::Format fmt = t2 ? t2->GetFormat() : GetDefaultTextureFormat(type);
|
||||
const bool mipmap = t2 ? t2->IsMipmap() : false;
|
||||
delete t2;
|
||||
|
||||
t2 = FetchSurface(type, w, h, fmt, clear, prefer_reuse);
|
||||
t2 = FetchSurface(type, w, h, mipmap, fmt, clear, prefer_reuse);
|
||||
|
||||
*t = t2;
|
||||
}
|
||||
|
|
|
@ -553,8 +553,8 @@ protected:
|
|||
bool m_rbswapped;
|
||||
FeatureSupport m_features;
|
||||
|
||||
virtual GSTexture* CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format) = 0;
|
||||
virtual GSTexture* FetchSurface(GSTexture::Type type, int w, int h, GSTexture::Format format, bool clear, bool prefer_reuse);
|
||||
virtual GSTexture* CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format) = 0;
|
||||
GSTexture* FetchSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format, bool clear, bool prefer_reuse);
|
||||
|
||||
virtual void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) = 0;
|
||||
virtual void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset) = 0;
|
||||
|
@ -614,7 +614,7 @@ public:
|
|||
GSTexture* CreateSparseDepthStencil(int w, int h, GSTexture::Format format, bool clear = true);
|
||||
GSTexture* CreateRenderTarget(int w, int h, GSTexture::Format format, bool clear = true);
|
||||
GSTexture* CreateDepthStencil(int w, int h, GSTexture::Format format, bool clear = true);
|
||||
GSTexture* CreateTexture(int w, int h, GSTexture::Format format, bool prefer_reuse = false);
|
||||
GSTexture* CreateTexture(int w, int h, bool mipmap, GSTexture::Format format, bool prefer_reuse = false);
|
||||
GSTexture* CreateOffscreen(int w, int h, GSTexture::Format format);
|
||||
GSTexture::Format GetDefaultTextureFormat(GSTexture::Type type);
|
||||
|
||||
|
|
|
@ -25,8 +25,6 @@
|
|||
#include <X11/keysym.h>
|
||||
#endif
|
||||
|
||||
const unsigned int s_mipmap_nb = 3;
|
||||
|
||||
GSRenderer::GSRenderer()
|
||||
: m_shift_key(false)
|
||||
, m_control_key(false)
|
||||
|
@ -580,11 +578,6 @@ void GSRenderer::KeyEvent(const HostKeyEvent& e)
|
|||
theApp.SetConfig("aa1", GSConfig.AA1);
|
||||
printf("GS: (Software) Edge anti-aliasing is now %s.\n", GSConfig.AA1 ? "enabled" : "disabled");
|
||||
return;
|
||||
case VK_INSERT:
|
||||
m_mipmap = (m_mipmap + s_mipmap_nb + step) % s_mipmap_nb;
|
||||
theApp.SetConfig("mipmap_hw", m_mipmap);
|
||||
printf("GS: Mipmapping is now %s.\n", theApp.m_gs_hack.at(m_mipmap).name.c_str());
|
||||
return;
|
||||
case VK_NEXT: // As requested by Prafull, to be removed later
|
||||
char dither_msg[3][16] = {"disabled", "auto", "auto unscaled"};
|
||||
GSConfig.Dithering = (GSConfig.Dithering + 1) % 3;
|
||||
|
|
|
@ -95,6 +95,7 @@ public:
|
|||
int GetHeight() const { return m_size.y; }
|
||||
GSVector2i GetSize() const { return m_size; }
|
||||
int GetMipmapLevels() const { return m_mipmap_levels; }
|
||||
bool IsMipmap() const { return m_mipmap_levels > 1; }
|
||||
|
||||
Type GetType() const { return m_type; }
|
||||
Format GetFormat() const { return m_format; }
|
||||
|
|
|
@ -34,7 +34,6 @@ GSDevice11::GSDevice11()
|
|||
m_state.topology = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED;
|
||||
m_state.bf = -1;
|
||||
|
||||
m_mipmap = theApp.GetConfigI("mipmap");
|
||||
m_upscale_multiplier = std::max(0, theApp.GetConfigI("upscale_multiplier"));
|
||||
|
||||
m_features.geometry_shader = true;
|
||||
|
@ -482,7 +481,7 @@ void GSDevice11::ClearStencil(GSTexture* t, u8 c)
|
|||
m_ctx->ClearDepthStencilView(*(GSTexture11*)t, D3D11_CLEAR_STENCIL, 0, c);
|
||||
}
|
||||
|
||||
GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format)
|
||||
GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format)
|
||||
{
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
|
||||
|
@ -507,16 +506,12 @@ GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int w, int h, GSTextu
|
|||
desc.Width = std::max(1, std::min(w, m_d3d_texsize));
|
||||
desc.Height = std::max(1, std::min(h, m_d3d_texsize));
|
||||
desc.Format = dxformat;
|
||||
desc.MipLevels = 1;
|
||||
desc.MipLevels = mipmap ? (int)log2(std::max(w, h)) : 1;
|
||||
desc.ArraySize = 1;
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
|
||||
// mipmap = m_mipmap > 1 || m_filter != TriFiltering::None;
|
||||
const bool mipmap = m_mipmap > 1;
|
||||
const int layers = mipmap && format == GSTexture::Format::Color ? (int)log2(std::max(w, h)) : 1;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case GSTexture::Type::RenderTarget:
|
||||
|
@ -527,7 +522,6 @@ GSTexture* GSDevice11::CreateSurface(GSTexture::Type type, int w, int h, GSTextu
|
|||
break;
|
||||
case GSTexture::Type::Texture:
|
||||
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
desc.MipLevels = layers;
|
||||
break;
|
||||
case GSTexture::Type::Offscreen:
|
||||
desc.Usage = D3D11_USAGE_STAGING;
|
||||
|
|
|
@ -109,10 +109,9 @@ public:
|
|||
private:
|
||||
float m_hack_topleft_offset;
|
||||
int m_upscale_multiplier;
|
||||
int m_mipmap;
|
||||
int m_d3d_texsize;
|
||||
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format) final;
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format) final;
|
||||
|
||||
void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final;
|
||||
void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final;
|
||||
|
|
|
@ -26,6 +26,7 @@ GSRendererHW::GSRendererHW()
|
|||
, m_userhacks_ts_half_bottom(-1)
|
||||
, m_tc(new GSTextureCache(this))
|
||||
, m_src(nullptr)
|
||||
, m_hw_mipmap(GSConfig.HWMipmap)
|
||||
, m_userhacks_tcoffset(false)
|
||||
, m_userhacks_tcoffset_x(0)
|
||||
, m_userhacks_tcoffset_y(0)
|
||||
|
@ -33,7 +34,7 @@ GSRendererHW::GSRendererHW()
|
|||
, m_reset(false)
|
||||
, m_lod(GSVector2i(0, 0))
|
||||
{
|
||||
m_mipmap = theApp.GetConfigI("mipmap_hw");
|
||||
m_mipmap = (m_hw_mipmap >= HWMipmapLevel::Basic);
|
||||
m_upscale_multiplier = std::max(0, theApp.GetConfigI("upscale_multiplier"));
|
||||
m_conservative_framebuffer = theApp.GetConfigB("conservative_framebuffer");
|
||||
|
||||
|
@ -198,7 +199,8 @@ void GSRendererHW::SetGameCRC(u32 crc, int options)
|
|||
m_hacks.SetGameCRC(m_game);
|
||||
|
||||
// Code for Automatic Mipmapping. Relies on game CRCs.
|
||||
if (theApp.GetConfigT<HWMipmapLevel>("mipmap_hw") == HWMipmapLevel::Automatic)
|
||||
m_mipmap = (GSConfig.HWMipmap >= HWMipmapLevel::Basic);
|
||||
if (GSConfig.HWMipmap == HWMipmapLevel::Automatic)
|
||||
{
|
||||
switch (CRC::Lookup(crc).title)
|
||||
{
|
||||
|
@ -242,10 +244,12 @@ void GSRendererHW::SetGameCRC(u32 crc, int options)
|
|||
case CRC::TombRaiderAnniversary:
|
||||
case CRC::TribesAerialAssault:
|
||||
case CRC::Whiplash:
|
||||
m_mipmap = static_cast<int>(HWMipmapLevel::Basic);
|
||||
m_hw_mipmap = HWMipmapLevel::Basic;
|
||||
m_mipmap = true;
|
||||
break;
|
||||
default:
|
||||
m_mipmap = static_cast<int>(HWMipmapLevel::Off);
|
||||
m_hw_mipmap = HWMipmapLevel::Off;
|
||||
m_mipmap = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1398,10 +1402,12 @@ void GSRendererHW::Draw()
|
|||
|
||||
GetTextureMinMax(r, TEX0, MIP_CLAMP, m_vt.IsLinear());
|
||||
|
||||
m_src = tex_psm.depth ? m_tc->LookupDepthSource(TEX0, env.TEXA, r) : m_tc->LookupSource(TEX0, env.TEXA, r);
|
||||
m_src = tex_psm.depth ? m_tc->LookupDepthSource(TEX0, env.TEXA, r) :
|
||||
m_tc->LookupSource(TEX0, env.TEXA, r, m_hw_mipmap >= HWMipmapLevel::Basic ||
|
||||
GSConfig.UserHacks_TriFilter == TriFiltering::Forced);
|
||||
|
||||
// Round 2
|
||||
if (IsMipMapActive() && m_mipmap == 2 && !tex_psm.depth)
|
||||
if (IsMipMapActive() && m_hw_mipmap == HWMipmapLevel::Full && !tex_psm.depth)
|
||||
{
|
||||
// Upload remaining texture layers
|
||||
const GSVector4 tmin = m_vt.m_min.t;
|
||||
|
@ -2078,7 +2084,7 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source
|
|||
|
||||
g_gs_device->Recycle(t->m_texture);
|
||||
|
||||
t->m_texture = g_gs_device->CreateTexture(512, 512, GSTexture::Format::Color);
|
||||
t->m_texture = g_gs_device->CreateTexture(512, 512, false, GSTexture::Format::Color);
|
||||
|
||||
t->m_texture->Update(GSVector4i(0, 0, 448, lines), video, 448 * 4);
|
||||
|
||||
|
|
|
@ -146,6 +146,7 @@ protected:
|
|||
GSTextureCache* m_tc;
|
||||
GSVector4i m_r;
|
||||
GSTextureCache::Source* m_src;
|
||||
HWMipmapLevel m_hw_mipmap;
|
||||
|
||||
virtual void DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* tex) = 0;
|
||||
|
||||
|
|
|
@ -773,7 +773,7 @@ void GSRendererNew::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
|||
|
||||
const bool need_mipmap = IsMipMapDraw();
|
||||
const bool shader_emulated_sampler = tex->m_palette || cpsm.fmt != 0 || complex_wms_wmt || psm.depth;
|
||||
const bool trilinear_manual = need_mipmap && m_mipmap == 2;
|
||||
const bool trilinear_manual = need_mipmap && m_hw_mipmap == HWMipmapLevel::Full;
|
||||
|
||||
bool bilinear = m_vt.IsLinear();
|
||||
int trilinear = 0;
|
||||
|
@ -782,11 +782,11 @@ void GSRendererNew::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
|||
{
|
||||
case TriFiltering::Forced:
|
||||
trilinear = static_cast<u8>(GS_MIN_FILTER::Linear_Mipmap_Linear);
|
||||
trilinear_auto = !need_mipmap || m_mipmap != 2;
|
||||
trilinear_auto = !need_mipmap || m_hw_mipmap != HWMipmapLevel::Full;
|
||||
break;
|
||||
|
||||
case TriFiltering::PS2:
|
||||
if (need_mipmap && m_mipmap != 2)
|
||||
if (need_mipmap && m_hw_mipmap != HWMipmapLevel::Full)
|
||||
{
|
||||
trilinear = m_context->TEX1.MMIN;
|
||||
trilinear_auto = true;
|
||||
|
|
|
@ -109,7 +109,7 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0
|
|||
{
|
||||
// JackieChan and SVCChaos cause regressions when skipping the draw calls when depth is disabled/not supported.
|
||||
// This way we make sure there are no regressions on D3D as well.
|
||||
return LookupSource(TEX0, TEXA, r);
|
||||
return LookupSource(TEX0, TEXA, r, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -202,7 +202,7 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0
|
|||
if (m_renderer->m_game.title == CRC::JackieChanAdv || m_renderer->m_game.title == CRC::SVCChaos)
|
||||
{
|
||||
// JackieChan and SVCChaos cause regressions when skipping the draw calls so we reuse the old code for these two.
|
||||
return LookupSource(TEX0, TEXA, r);
|
||||
return LookupSource(TEX0, TEXA, r, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -219,7 +219,7 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0
|
|||
return src;
|
||||
}
|
||||
|
||||
GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r)
|
||||
GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool mipmap)
|
||||
{
|
||||
const GSLocalMemory::psm_t& psm_s = GSLocalMemory::m_psm[TEX0.PSM];
|
||||
//const GSLocalMemory::psm_t& cpsm = psm.pal > 0 ? GSLocalMemory::m_psm[TEX0.CPSM] : psm;
|
||||
|
@ -475,7 +475,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
GL_CACHE("TC: src miss (0x%x, 0x%x, %s)", TEX0.TBP0, psm_s.pal > 0 ? TEX0.CBP : 0, psm_str(TEX0.PSM));
|
||||
}
|
||||
#endif
|
||||
src = CreateSource(TEX0, TEXA, dst, half_right, x_offset, y_offset);
|
||||
src = CreateSource(TEX0, TEXA, dst, half_right, x_offset, y_offset, mipmap);
|
||||
new_source = true;
|
||||
}
|
||||
else
|
||||
|
@ -1282,7 +1282,7 @@ void GSTextureCache::IncAge()
|
|||
}
|
||||
|
||||
//Fixme: Several issues in here. Not handling depth stencil, pitch conversion doesnt work.
|
||||
GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* dst, bool half_right, int x_offset, int y_offset)
|
||||
GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* dst, bool half_right, int x_offset, int y_offset, bool mipmap)
|
||||
{
|
||||
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[TEX0.PSM];
|
||||
Source* src = new Source(m_renderer, TEX0, TEXA, m_temp);
|
||||
|
@ -1302,7 +1302,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
|
|||
int h = (int)(scale.y * th);
|
||||
|
||||
GSTexture* sTex = dst->m_texture;
|
||||
GSTexture* dTex = g_gs_device->CreateTexture(w, h, GSTexture::Format::Color, true);
|
||||
GSTexture* dTex = g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color, true);
|
||||
|
||||
GSVector4i area(x, y, x + w, y + h);
|
||||
g_gs_device->CopyRect(sTex, dTex, area);
|
||||
|
@ -1334,7 +1334,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
|
|||
// So it could be tricky to put in the middle of the DrawPrims
|
||||
|
||||
// Texture is created to keep code compatibility
|
||||
GSTexture* dTex = g_gs_device->CreateTexture(tw, th, GSTexture::Format::Color, true);
|
||||
GSTexture* dTex = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::Color, true);
|
||||
|
||||
// Keep a trace of origin of the texture
|
||||
src->m_texture = dTex;
|
||||
|
@ -1508,7 +1508,7 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
|
|||
// 'src' is the new texture cache entry (hence the output)
|
||||
GSTexture* sTex = dst->m_texture;
|
||||
GSTexture* dTex = use_texture ?
|
||||
g_gs_device->CreateTexture(w, h, GSTexture::Format::Color, true) :
|
||||
g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color, true) :
|
||||
g_gs_device->CreateRenderTarget(w, h, GSTexture::Format::Color, !texture_completely_overwritten);
|
||||
src->m_texture = dTex;
|
||||
|
||||
|
@ -1614,12 +1614,12 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
|
|||
{
|
||||
if (m_paltex && psm.pal > 0)
|
||||
{
|
||||
src->m_texture = g_gs_device->CreateTexture(tw, th, GSTexture::Format::UNorm8);
|
||||
src->m_texture = g_gs_device->CreateTexture(tw, th, false, GSTexture::Format::UNorm8);
|
||||
AttachPaletteToSource(src, psm.pal, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
src->m_texture = g_gs_device->CreateTexture(tw, th, GSTexture::Format::Color);
|
||||
src->m_texture = g_gs_device->CreateTexture(tw, th, mipmap, GSTexture::Format::Color);
|
||||
if (psm.pal > 0)
|
||||
{
|
||||
AttachPaletteToSource(src, psm.pal, false);
|
||||
|
@ -2274,7 +2274,7 @@ void GSTextureCache::Target::Update()
|
|||
TEXA.TA0 = 0;
|
||||
TEXA.TA1 = 0x80;
|
||||
|
||||
GSTexture* t = g_gs_device->CreateTexture(w, h, GSTexture::Format::Color);
|
||||
GSTexture* t = g_gs_device->CreateTexture(w, h, false, GSTexture::Format::Color);
|
||||
|
||||
GSOffset off = m_renderer->m_mem.GetOffset(m_TEX0.TBP0, m_TEX0.TBW, m_TEX0.PSM);
|
||||
|
||||
|
@ -2434,7 +2434,7 @@ void GSTextureCache::Palette::InitializeTexture()
|
|||
// sampling such texture are always normalized by 255.
|
||||
// This is because indexes are stored as normalized values of an RGBA texture (e.g. index 15 will be read as (15/255),
|
||||
// and therefore will read texel 15/255 * texture size).
|
||||
m_tex_palette = g_gs_device->CreateTexture(256, 1, GSTexture::Format::Color);
|
||||
m_tex_palette = g_gs_device->CreateTexture(256, 1, false, GSTexture::Format::Color);
|
||||
m_tex_palette->Update(GSVector4i(0, 0, m_pal, 1), m_clut, m_pal * sizeof(m_clut[0]));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -232,7 +232,7 @@ protected:
|
|||
u8 m_texture_inside_rt_cache_size = 255;
|
||||
std::vector<TexInsideRtCacheEntry> m_texture_inside_rt_cache;
|
||||
|
||||
Source* CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* t = NULL, bool half_right = false, int x_offset = 0, int y_offset = 0);
|
||||
Source* CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* t = NULL, bool half_right = false, int x_offset = 0, int y_offset = 0, bool mipmap = false);
|
||||
Target* CreateTarget(const GIFRegTEX0& TEX0, int w, int h, int type);
|
||||
|
||||
// TODO: virtual void Write(Source* s, const GSVector4i& r) = 0;
|
||||
|
@ -246,7 +246,7 @@ public:
|
|||
void RemoveAll();
|
||||
void RemovePartial();
|
||||
|
||||
Source* LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r);
|
||||
Source* LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool mipmap);
|
||||
Source* LookupDepthSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool palette = false);
|
||||
|
||||
Target* LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int type, bool used, u32 fbmask = 0);
|
||||
|
|
|
@ -63,7 +63,6 @@ GSDeviceOGL::GSDeviceOGL()
|
|||
memset(&m_om_dss, 0, sizeof(m_om_dss));
|
||||
memset(&m_profiler, 0, sizeof(m_profiler));
|
||||
|
||||
m_mipmap = theApp.GetConfigI("mipmap");
|
||||
m_upscale_multiplier = std::max(1, theApp.GetConfigI("upscale_multiplier"));
|
||||
|
||||
// Reset the debug file
|
||||
|
@ -199,12 +198,12 @@ void GSDeviceOGL::GenerateProfilerData()
|
|||
}
|
||||
}
|
||||
|
||||
GSTexture* GSDeviceOGL::CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format fmt)
|
||||
GSTexture* GSDeviceOGL::CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format fmt)
|
||||
{
|
||||
GL_PUSH("Create surface");
|
||||
|
||||
// A wrapper to call GSTextureOGL, with the different kind of parameters.
|
||||
GSTextureOGL* t = new GSTextureOGL(type, w, h, fmt, m_fbo_read, m_mipmap > 1 || GSConfig.UserHacks_TriFilter != TriFiltering::Off);
|
||||
GSTextureOGL* t = new GSTextureOGL(type, w, h, fmt, m_fbo_read, mipmap);
|
||||
|
||||
return t;
|
||||
}
|
||||
|
@ -950,7 +949,7 @@ void GSDeviceOGL::InitPrimDateTexture(GSTexture* rt, const GSVector4i& area)
|
|||
|
||||
// Create a texture to avoid the useless clean@0
|
||||
if (m_date.t == NULL)
|
||||
m_date.t = CreateTexture(rtsize.x, rtsize.y, GSTexture::Format::Int32);
|
||||
m_date.t = CreateTexture(rtsize.x, rtsize.y, false, GSTexture::Format::Int32);
|
||||
|
||||
// Clean with the max signed value
|
||||
const int max_int = 0x7FFFFFFF;
|
||||
|
|
|
@ -214,7 +214,6 @@ private:
|
|||
// Increment this constant whenever shaders change, to invalidate user's program binary cache.
|
||||
static constexpr u32 SHADER_VERSION = 1;
|
||||
|
||||
int m_mipmap;
|
||||
int m_upscale_multiplier;
|
||||
|
||||
static FILE* m_debug_gl_file;
|
||||
|
@ -301,7 +300,7 @@ private:
|
|||
|
||||
AlignedBuffer<u8, 32> m_download_buffer;
|
||||
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format) final;
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format) final;
|
||||
|
||||
void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) final;
|
||||
void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) final;
|
||||
|
|
|
@ -338,17 +338,14 @@ void GSDeviceVK::ClearStencil(GSTexture* t, u8 c)
|
|||
static_cast<GSTextureVK*>(t)->TransitionToLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||
}
|
||||
|
||||
GSTexture* GSDeviceVK::CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format)
|
||||
GSTexture* GSDeviceVK::CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format)
|
||||
{
|
||||
pxAssert(type != GSTexture::Type::Offscreen && type != GSTexture::Type::SparseRenderTarget &&
|
||||
type != GSTexture::Type::SparseDepthStencil);
|
||||
|
||||
const u32 width = std::max<u32>(1, std::min<u32>(w, g_vulkan_context->GetMaxImageDimension2D()));
|
||||
const u32 height = std::max<u32>(1, std::min<u32>(h, g_vulkan_context->GetMaxImageDimension2D()));
|
||||
|
||||
const bool mipmap =
|
||||
type == GSTexture::Type::Texture && (m_mipmap > 1 || GSConfig.UserHacks_TriFilter == TriFiltering::Forced);
|
||||
const u32 layers = mipmap && format == GSTexture::Format::Color ? static_cast<u32>(log2(std::max(w, h))) : 1u;
|
||||
const u32 layers = mipmap ? static_cast<u32>(log2(std::max(w, h))) : 1u;
|
||||
|
||||
return GSTextureVK::Create(type, width, height, layers, format).release();
|
||||
}
|
||||
|
|
|
@ -158,7 +158,7 @@ private:
|
|||
|
||||
std::string m_tfx_source;
|
||||
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, GSTexture::Format format) override;
|
||||
GSTexture* CreateSurface(GSTexture::Type type, int w, int h, bool mipmap, GSTexture::Format format) override;
|
||||
|
||||
void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE,
|
||||
const GSRegEXTBUF& EXTBUF, const GSVector4& c) final;
|
||||
|
|
Loading…
Reference in New Issue