Merge pull request #12300 from iwubcode/dump_texture_free_function
VideoCommon: move texture dump to a free function
This commit is contained in:
commit
e8faad3ccc
|
@ -724,6 +724,7 @@
|
||||||
<ClInclude Include="VideoCommon\TextureDecoder_Util.h" />
|
<ClInclude Include="VideoCommon\TextureDecoder_Util.h" />
|
||||||
<ClInclude Include="VideoCommon\TextureDecoder.h" />
|
<ClInclude Include="VideoCommon\TextureDecoder.h" />
|
||||||
<ClInclude Include="VideoCommon\TextureInfo.h" />
|
<ClInclude Include="VideoCommon\TextureInfo.h" />
|
||||||
|
<ClInclude Include="VideoCommon\TextureUtils.h" />
|
||||||
<ClInclude Include="VideoCommon\TMEM.h" />
|
<ClInclude Include="VideoCommon\TMEM.h" />
|
||||||
<ClInclude Include="VideoCommon\UberShaderCommon.h" />
|
<ClInclude Include="VideoCommon\UberShaderCommon.h" />
|
||||||
<ClInclude Include="VideoCommon\UberShaderPixel.h" />
|
<ClInclude Include="VideoCommon\UberShaderPixel.h" />
|
||||||
|
@ -1337,6 +1338,7 @@
|
||||||
<ClCompile Include="VideoCommon\TextureConverterShaderGen.cpp" />
|
<ClCompile Include="VideoCommon\TextureConverterShaderGen.cpp" />
|
||||||
<ClCompile Include="VideoCommon\TextureDecoder_Common.cpp" />
|
<ClCompile Include="VideoCommon\TextureDecoder_Common.cpp" />
|
||||||
<ClCompile Include="VideoCommon\TextureInfo.cpp" />
|
<ClCompile Include="VideoCommon\TextureInfo.cpp" />
|
||||||
|
<ClCompile Include="VideoCommon\TextureUtils.cpp" />
|
||||||
<ClCompile Include="VideoCommon\TMEM.cpp" />
|
<ClCompile Include="VideoCommon\TMEM.cpp" />
|
||||||
<ClCompile Include="VideoCommon\UberShaderCommon.cpp" />
|
<ClCompile Include="VideoCommon\UberShaderCommon.cpp" />
|
||||||
<ClCompile Include="VideoCommon\UberShaderPixel.cpp" />
|
<ClCompile Include="VideoCommon\UberShaderPixel.cpp" />
|
||||||
|
|
|
@ -19,7 +19,7 @@ void AbstractTexture::FinishedRendering()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AbstractTexture::Save(const std::string& filename, unsigned int level, int compression)
|
bool AbstractTexture::Save(const std::string& filename, unsigned int level, int compression) const
|
||||||
{
|
{
|
||||||
// We can't dump compressed textures currently (it would mean drawing them to a RGBA8
|
// We can't dump compressed textures currently (it would mean drawing them to a RGBA8
|
||||||
// framebuffer, and saving that). TextureCache does not call Save for custom textures
|
// framebuffer, and saving that). TextureCache does not call Save for custom textures
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
MathUtil::Rectangle<int> GetRect() const { return m_config.GetRect(); }
|
MathUtil::Rectangle<int> GetRect() const { return m_config.GetRect(); }
|
||||||
MathUtil::Rectangle<int> GetMipRect(u32 level) const { return m_config.GetMipRect(level); }
|
MathUtil::Rectangle<int> GetMipRect(u32 level) const { return m_config.GetMipRect(level); }
|
||||||
bool IsMultisampled() const { return m_config.IsMultisampled(); }
|
bool IsMultisampled() const { return m_config.IsMultisampled(); }
|
||||||
bool Save(const std::string& filename, unsigned int level, int compression = 6);
|
bool Save(const std::string& filename, unsigned int level, int compression = 6) const;
|
||||||
|
|
||||||
static bool IsCompressedFormat(AbstractTextureFormat format);
|
static bool IsCompressedFormat(AbstractTextureFormat format);
|
||||||
static bool IsDepthFormat(AbstractTextureFormat format);
|
static bool IsDepthFormat(AbstractTextureFormat format);
|
||||||
|
|
|
@ -155,6 +155,8 @@ add_library(videocommon
|
||||||
TextureDecoder_Util.h
|
TextureDecoder_Util.h
|
||||||
TextureInfo.cpp
|
TextureInfo.cpp
|
||||||
TextureInfo.h
|
TextureInfo.h
|
||||||
|
TextureUtils.cpp
|
||||||
|
TextureUtils.h
|
||||||
TMEM.cpp
|
TMEM.cpp
|
||||||
TMEM.h
|
TMEM.h
|
||||||
UberShaderCommon.cpp
|
UberShaderCommon.cpp
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include "VideoCommon/TextureConversionShader.h"
|
#include "VideoCommon/TextureConversionShader.h"
|
||||||
#include "VideoCommon/TextureConverterShaderGen.h"
|
#include "VideoCommon/TextureConverterShaderGen.h"
|
||||||
#include "VideoCommon/TextureDecoder.h"
|
#include "VideoCommon/TextureDecoder.h"
|
||||||
|
#include "VideoCommon/TextureUtils.h"
|
||||||
#include "VideoCommon/VertexManagerBase.h"
|
#include "VideoCommon/VertexManagerBase.h"
|
||||||
#include "VideoCommon/VideoCommon.h"
|
#include "VideoCommon/VideoCommon.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
@ -998,39 +999,6 @@ RcTcacheEntry TextureCacheBase::DoPartialTextureUpdates(RcTcacheEntry& entry_to_
|
||||||
return entry_to_update;
|
return entry_to_update;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureCacheBase::DumpTexture(RcTcacheEntry& entry, std::string basename, unsigned int level,
|
|
||||||
bool is_arbitrary)
|
|
||||||
{
|
|
||||||
std::string szDir = File::GetUserPath(D_DUMPTEXTURES_IDX) + SConfig::GetInstance().GetGameID();
|
|
||||||
|
|
||||||
// make sure that the directory exists
|
|
||||||
if (!File::IsDirectory(szDir))
|
|
||||||
File::CreateDir(szDir);
|
|
||||||
|
|
||||||
if (is_arbitrary)
|
|
||||||
{
|
|
||||||
basename += "_arb";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (level > 0)
|
|
||||||
{
|
|
||||||
if (!g_ActiveConfig.bDumpMipmapTextures)
|
|
||||||
return;
|
|
||||||
basename += fmt::format("_mip{}", level);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!g_ActiveConfig.bDumpBaseTextures)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string filename = fmt::format("{}/{}.png", szDir, basename);
|
|
||||||
if (File::Exists(filename))
|
|
||||||
return;
|
|
||||||
|
|
||||||
entry->texture->Save(filename, level, Config::Get(Config::GFX_TEXTURE_PNG_COMPRESSION_LEVEL));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper for checking if a BPMemory TexMode0 register is set to Point
|
// Helper for checking if a BPMemory TexMode0 register is set to Point
|
||||||
// Filtering modes. This is used to decide whether Anisotropic enhancements
|
// Filtering modes. This is used to decide whether Anisotropic enhancements
|
||||||
// are (mostly) safe in the VideoBackends.
|
// are (mostly) safe in the VideoBackends.
|
||||||
|
@ -1838,12 +1806,21 @@ RcTcacheEntry TextureCacheBase::CreateTextureEntry(
|
||||||
|
|
||||||
entry->has_arbitrary_mips = arbitrary_mip_detector.HasArbitraryMipmaps(dst_buffer);
|
entry->has_arbitrary_mips = arbitrary_mip_detector.HasArbitraryMipmaps(dst_buffer);
|
||||||
|
|
||||||
if (g_ActiveConfig.bDumpTextures && !skip_texture_dump)
|
if (g_ActiveConfig.bDumpTextures && !skip_texture_dump && texLevels > 0)
|
||||||
{
|
{
|
||||||
const std::string basename = texture_info.CalculateTextureName().GetFullName();
|
const std::string basename = texture_info.CalculateTextureName().GetFullName();
|
||||||
for (u32 level = 0; level < texLevels; ++level)
|
if (g_ActiveConfig.bDumpBaseTextures)
|
||||||
{
|
{
|
||||||
DumpTexture(entry, basename, level, entry->has_arbitrary_mips);
|
VideoCommon::TextureUtils::DumpTexture(*entry->texture, basename, 0,
|
||||||
|
entry->has_arbitrary_mips);
|
||||||
|
}
|
||||||
|
if (g_ActiveConfig.bDumpMipmapTextures)
|
||||||
|
{
|
||||||
|
for (u32 level = 1; level < texLevels; ++level)
|
||||||
|
{
|
||||||
|
VideoCommon::TextureUtils::DumpTexture(*entry->texture, basename, level,
|
||||||
|
entry->has_arbitrary_mips);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,8 +361,6 @@ private:
|
||||||
TLUTFormat tlutfmt);
|
TLUTFormat tlutfmt);
|
||||||
void StitchXFBCopy(RcTcacheEntry& entry_to_update);
|
void StitchXFBCopy(RcTcacheEntry& entry_to_update);
|
||||||
|
|
||||||
void DumpTexture(RcTcacheEntry& entry, std::string basename, unsigned int level,
|
|
||||||
bool is_arbitrary);
|
|
||||||
void CheckTempSize(size_t required_size);
|
void CheckTempSize(size_t required_size);
|
||||||
|
|
||||||
RcTcacheEntry AllocateCacheEntry(const TextureConfig& config);
|
RcTcacheEntry AllocateCacheEntry(const TextureConfig& config);
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2023 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "VideoCommon/TextureUtils.h"
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
#include "Common/FileUtil.h"
|
||||||
|
#include "Core/Config/GraphicsSettings.h"
|
||||||
|
#include "Core/ConfigManager.h"
|
||||||
|
|
||||||
|
#include "VideoCommon/AbstractTexture.h"
|
||||||
|
|
||||||
|
namespace VideoCommon::TextureUtils
|
||||||
|
{
|
||||||
|
void DumpTexture(const ::AbstractTexture& texture, std::string basename, u32 level,
|
||||||
|
bool is_arbitrary)
|
||||||
|
{
|
||||||
|
std::string szDir = File::GetUserPath(D_DUMPTEXTURES_IDX) + SConfig::GetInstance().GetGameID();
|
||||||
|
|
||||||
|
// make sure that the directory exists
|
||||||
|
if (!File::IsDirectory(szDir))
|
||||||
|
File::CreateDir(szDir);
|
||||||
|
|
||||||
|
if (is_arbitrary)
|
||||||
|
{
|
||||||
|
basename += "_arb";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (level > 0)
|
||||||
|
{
|
||||||
|
basename += fmt::format("_mip{}", level);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string filename = fmt::format("{}/{}.png", szDir, basename);
|
||||||
|
if (File::Exists(filename))
|
||||||
|
return;
|
||||||
|
|
||||||
|
texture.Save(filename, level, Config::Get(Config::GFX_TEXTURE_PNG_COMPRESSION_LEVEL));
|
||||||
|
}
|
||||||
|
} // namespace VideoCommon::TextureUtils
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright 2023 Dolphin Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
class AbstractTexture;
|
||||||
|
|
||||||
|
namespace VideoCommon::TextureUtils
|
||||||
|
{
|
||||||
|
void DumpTexture(const ::AbstractTexture& texture, std::string basename, u32 level,
|
||||||
|
bool is_arbitrary);
|
||||||
|
}
|
Loading…
Reference in New Issue