Fix a Crash on Zelda BotW and Splatoon 2, and simplified LoadGLBuffer
This commit is contained in:
parent
e0ca938b22
commit
1ff20d8538
|
@ -833,27 +833,10 @@ void CachedSurface::LoadGLBuffer() {
|
||||||
ASSERT_MSG(params.block_width == 1, "Block width is defined as {} on texture type {}",
|
ASSERT_MSG(params.block_width == 1, "Block width is defined as {} on texture type {}",
|
||||||
params.block_width, static_cast<u32>(params.target));
|
params.block_width, static_cast<u32>(params.target));
|
||||||
|
|
||||||
switch (params.target) {
|
if (params.target == SurfaceParams::SurfaceTarget::Texture2D) {
|
||||||
case SurfaceParams::SurfaceTarget::Texture2D:
|
|
||||||
// TODO(Blinkhawk): Eliminate this condition once all texture types are implemented.
|
// TODO(Blinkhawk): Eliminate this condition once all texture types are implemented.
|
||||||
depth = 1U;
|
depth = 1U;
|
||||||
block_depth = 1U;
|
block_depth = 1U;
|
||||||
break;
|
|
||||||
case SurfaceParams::SurfaceTarget::Texture2DArray:
|
|
||||||
case SurfaceParams::SurfaceTarget::TextureCubemap:
|
|
||||||
depth = 1U;
|
|
||||||
block_depth = 1U;
|
|
||||||
for (std::size_t index = 0; index < params.depth; ++index) {
|
|
||||||
const std::size_t offset{index * copy_size};
|
|
||||||
morton_to_gl_fns[static_cast<std::size_t>(params.pixel_format)](
|
|
||||||
params.width, params.block_height, params.height, 1U, 1U,
|
|
||||||
gl_buffer.data() + offset, copy_size, params.addr + offset);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG_CRITICAL(HW_GPU, "Unimplemented tiled load for target={}",
|
|
||||||
static_cast<u32>(params.target));
|
|
||||||
UNREACHABLE();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::size_t size = copy_size * depth;
|
const std::size_t size = copy_size * depth;
|
||||||
|
|
|
@ -271,7 +271,7 @@ u32 BytesPerPixel(TextureFormat format) {
|
||||||
|
|
||||||
std::vector<u8> UnswizzleTexture(VAddr address, u32 tile_size, u32 bytes_per_pixel, u32 width,
|
std::vector<u8> UnswizzleTexture(VAddr address, u32 tile_size, u32 bytes_per_pixel, u32 width,
|
||||||
u32 height, u32 depth, u32 block_height, u32 block_depth) {
|
u32 height, u32 depth, u32 block_height, u32 block_depth) {
|
||||||
std::vector<u8> unswizzled_data(width * height * bytes_per_pixel);
|
std::vector<u8> unswizzled_data(width * height * depth * bytes_per_pixel);
|
||||||
CopySwizzledData(width / tile_size, height / tile_size, depth, bytes_per_pixel, bytes_per_pixel,
|
CopySwizzledData(width / tile_size, height / tile_size, depth, bytes_per_pixel, bytes_per_pixel,
|
||||||
Memory::GetPointer(address), unswizzled_data.data(), true, block_height,
|
Memory::GetPointer(address), unswizzled_data.data(), true, block_height,
|
||||||
block_depth);
|
block_depth);
|
||||||
|
|
Reference in New Issue