summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Assets/TextureAsset.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-06-03 01:11:41 +0200
committerGitHub <noreply@github.com>2023-06-03 01:11:41 +0200
commitd03e09c8fd911d1b4e66184ceedbeca989b75a0c (patch)
treec55f05ebbe08f611ab6eb44952ff389c3bdbdd9f /Source/Core/VideoCommon/Assets/TextureAsset.cpp
parent4c9210b439c72e726d41229c73eff881412beb48 (diff)
parentc93940c6ee8194fa48663b9bcd0f153c9d72a3ea (diff)
Merge pull request #11877 from iwubcode/asset_library_loader
VideoCommon: add multithreaded asset loader and define a texture asset
Diffstat (limited to 'Source/Core/VideoCommon/Assets/TextureAsset.cpp')
-rw-r--r--Source/Core/VideoCommon/Assets/TextureAsset.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/Assets/TextureAsset.cpp b/Source/Core/VideoCommon/Assets/TextureAsset.cpp
new file mode 100644
index 0000000000..fd27ee80b6
--- /dev/null
+++ b/Source/Core/VideoCommon/Assets/TextureAsset.cpp
@@ -0,0 +1,77 @@
+// Copyright 2023 Dolphin Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "VideoCommon/Assets/TextureAsset.h"
+
+#include "Common/Logging/Log.h"
+
+namespace VideoCommon
+{
+CustomAssetLibrary::LoadInfo RawTextureAsset::LoadImpl(const CustomAssetLibrary::AssetID& asset_id)
+{
+ std::lock_guard lk(m_lock);
+ const auto loaded_info = m_owning_library->LoadTexture(asset_id, &m_data);
+ if (loaded_info.m_bytes_loaded == 0)
+ return {};
+ m_loaded = true;
+ return loaded_info;
+}
+
+CustomAssetLibrary::LoadInfo GameTextureAsset::LoadImpl(const CustomAssetLibrary::AssetID& asset_id)
+{
+ std::lock_guard lk(m_lock);
+ const auto loaded_info = m_owning_library->LoadGameTexture(asset_id, &m_data);
+ if (loaded_info.m_bytes_loaded == 0)
+ return {};
+ m_loaded = true;
+ return loaded_info;
+}
+
+bool GameTextureAsset::Validate(u32 native_width, u32 native_height) const
+{
+ std::lock_guard lk(m_lock);
+
+ if (!m_loaded)
+ {
+ ERROR_LOG_FMT(VIDEO,
+ "Game texture can't be validated for asset '{}' because it is not loaded yet.",
+ GetAssetId());
+ return false;
+ }
+
+ if (m_data.m_levels.empty())
+ {
+ ERROR_LOG_FMT(VIDEO,
+ "Game texture can't be validated for asset '{}' because no data was available.",
+ GetAssetId());
+ return false;
+ }
+
+ // Verify that the aspect ratio of the texture hasn't changed, as this could have
+ // side-effects.
+ const VideoCommon::CustomTextureData::Level& first_mip = m_data.m_levels[0];
+ if (first_mip.width * native_height != first_mip.height * native_width)
+ {
+ ERROR_LOG_FMT(
+ VIDEO,
+ "Invalid custom texture size {}x{} for game texture asset '{}'. The aspect differs "
+ "from the native size {}x{}.",
+ first_mip.width, first_mip.height, GetAssetId(), native_width, native_height);
+ return false;
+ }
+
+ // Same deal if the custom texture isn't a multiple of the native size.
+ if (native_width != 0 && native_height != 0 &&
+ (first_mip.width % native_width || first_mip.height % native_height))
+ {
+ ERROR_LOG_FMT(
+ VIDEO,
+ "Invalid custom texture size {}x{} for game texture asset '{}'. Please use an integer "
+ "upscaling factor based on the native size {}x{}.",
+ first_mip.width, first_mip.height, GetAssetId(), native_width, native_height);
+ return false;
+ }
+
+ return true;
+}
+} // namespace VideoCommon