// Copyright 2023 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include "video_core/rasterizer_cache/surface_params.h" #include "video_core/rasterizer_cache/texture_codec.h" #include "video_core/rasterizer_cache/utils.h" namespace VideoCore { u32 MipLevels(u32 width, u32 height, u32 max_level) { u32 levels = 1; while (width > 8 && height > 8) { levels++; width >>= 1; height >>= 1; } return std::min(levels, max_level + 1); } void EncodeTexture(const SurfaceParams& surface_info, PAddr start_addr, PAddr end_addr, std::span source, std::span dest, bool convert) { const PixelFormat format = surface_info.pixel_format; const u32 func_index = static_cast(format); if (surface_info.is_tiled) { const MortonFunc SwizzleImpl = (convert ? SWIZZLE_TABLE_CONVERTED : SWIZZLE_TABLE)[func_index]; if (SwizzleImpl) { SwizzleImpl(surface_info.width, surface_info.height, start_addr - surface_info.addr, end_addr - surface_info.addr, source, dest); return; } } else { const LinearFunc LinearEncodeImpl = (convert ? LINEAR_ENCODE_TABLE_CONVERTED : LINEAR_ENCODE_TABLE)[func_index]; if (LinearEncodeImpl) { LinearEncodeImpl(source, dest); return; } } LOG_ERROR(HW_GPU, "Unimplemented texture encode function for pixel format = {}, tiled = {}", func_index, surface_info.is_tiled); UNIMPLEMENTED(); } void DecodeTexture(const SurfaceParams& surface_info, PAddr start_addr, PAddr end_addr, std::span source, std::span dest, bool convert) { const PixelFormat format = surface_info.pixel_format; const u32 func_index = static_cast(format); if (surface_info.is_tiled) { const MortonFunc UnswizzleImpl = (convert ? UNSWIZZLE_TABLE_CONVERTED : UNSWIZZLE_TABLE)[func_index]; if (UnswizzleImpl) { UnswizzleImpl(surface_info.width, surface_info.height, start_addr - surface_info.addr, end_addr - surface_info.addr, dest, source); return; } } else { const LinearFunc LinearDecodeImpl = (convert ? LINEAR_DECODE_TABLE_CONVERTED : LINEAR_DECODE_TABLE)[func_index]; if (LinearDecodeImpl) { LinearDecodeImpl(source, dest); return; } } LOG_ERROR(HW_GPU, "Unimplemented texture decode function for pixel format = {}, tiled = {}", func_index, surface_info.is_tiled); UNIMPLEMENTED(); } } // namespace VideoCore