// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/assert.h" #include "video_core/texture_cache/image_view_info.h" #include "video_core/texture_cache/texture_cache_base.h" #include "video_core/texture_cache/types.h" #include "video_core/texture_cache/util.h" #include "video_core/textures/texture.h" namespace VideoCommon { namespace { using Tegra::Texture::TextureType; constexpr u8 RENDER_TARGET_SWIZZLE = std::numeric_limits::max(); [[nodiscard]] u8 CastSwizzle(SwizzleSource source) { const u8 casted = static_cast(source); ASSERT(static_cast(casted) == source); return casted; } } // Anonymous namespace ImageViewInfo::ImageViewInfo(const TICEntry& config, s32 base_layer) noexcept : format{PixelFormatFromTIC(config)}, x_source{CastSwizzle(config.x_source)}, y_source{CastSwizzle(config.y_source)}, z_source{CastSwizzle(config.z_source)}, w_source{CastSwizzle(config.w_source)} { range.base = SubresourceBase{ .level = static_cast(config.res_min_mip_level), .layer = base_layer, }; range.extent.levels = config.res_max_mip_level - config.res_min_mip_level + 1; switch (config.texture_type) { case TextureType::Texture1D: ASSERT(config.Height() == 1); ASSERT(config.Depth() == 1); type = ImageViewType::e1D; break; case TextureType::Texture2D: case TextureType::Texture2DNoMipmap: ASSERT(config.Depth() == 1); type = config.normalized_coords ? ImageViewType::e2D : ImageViewType::Rect; break; case TextureType::Texture3D: type = ImageViewType::e3D; break; case TextureType::TextureCubemap: ASSERT(config.Depth() == 1); type = ImageViewType::Cube; range.extent.layers = 6; break; case TextureType::Texture1DArray: type = ImageViewType::e1DArray; range.extent.layers = config.Depth(); break; case TextureType::Texture2DArray: type = ImageViewType::e2DArray; range.extent.layers = config.Depth(); break; case TextureType::Texture1DBuffer: type = ImageViewType::Buffer; break; case TextureType::TextureCubeArray: type = ImageViewType::CubeArray; range.extent.layers = config.Depth() * 6; break; default: ASSERT_MSG(false, "Invalid texture_type={}", static_cast(config.texture_type.Value())); break; } } ImageViewInfo::ImageViewInfo(ImageViewType type_, PixelFormat format_, SubresourceRange range_) noexcept : type{type_}, format{format_}, range{range_}, x_source{RENDER_TARGET_SWIZZLE}, y_source{RENDER_TARGET_SWIZZLE}, z_source{RENDER_TARGET_SWIZZLE}, w_source{RENDER_TARGET_SWIZZLE} {} bool ImageViewInfo::IsRenderTarget() const noexcept { return x_source == RENDER_TARGET_SWIZZLE && y_source == RENDER_TARGET_SWIZZLE && z_source == RENDER_TARGET_SWIZZLE && w_source == RENDER_TARGET_SWIZZLE; } bool ImageViewInfo::operator==(const ImageViewInfo& rhs) const noexcept { return std::tie(this->type, this->format, this->range, this->x_source, this->y_source, this->z_source, this->w_source) == std::tie(rhs.type, rhs.format, rhs.range, rhs.x_source, rhs.y_source, rhs.z_source, rhs.w_source); } } // namespace VideoCommon