From c93940c6ee8194fa48663b9bcd0f153c9d72a3ea Mon Sep 17 00:00:00 2001 From: iwubcode Date: Fri, 2 Jun 2023 14:43:28 -0500 Subject: VideoCommon: add multithreaded asset loader and define a texture asset --- Source/Core/VideoCommon/Assets/TextureAsset.cpp | 77 +++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Source/Core/VideoCommon/Assets/TextureAsset.cpp (limited to 'Source/Core/VideoCommon/Assets/TextureAsset.cpp') 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 -- cgit v1.2.3