77 lines
2.7 KiB
C++
77 lines
2.7 KiB
C++
|
// 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<u8> source, std::span<u8> dest, bool convert) {
|
||
|
const PixelFormat format = surface_info.pixel_format;
|
||
|
const u32 func_index = static_cast<u32>(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<u8> source, std::span<u8> dest, bool convert) {
|
||
|
const PixelFormat format = surface_info.pixel_format;
|
||
|
const u32 func_index = static_cast<u32>(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
|