51c9e98677
This commit adds a series of HLE methods for handling 3D textures in general. This helps games that generate 3D textures on every frame and may reduce loading times for certain games.
63 lines
2.9 KiB
C++
63 lines
2.9 KiB
C++
// Copyright 2018 yuzu Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
|
#include "common/common_types.h"
|
|
#include "video_core/textures/texture.h"
|
|
|
|
namespace Tegra::Texture {
|
|
|
|
// GOBSize constant. Calculated by 64 bytes in x multiplied by 8 y coords, represents
|
|
// an small rect of (64/bytes_per_pixel)X8.
|
|
inline std::size_t GetGOBSize() {
|
|
return 512;
|
|
}
|
|
|
|
inline std::size_t GetGOBSizeShift() {
|
|
return 9;
|
|
}
|
|
|
|
/// Unswizzles a swizzled texture without changing its format.
|
|
void UnswizzleTexture(u8* unswizzled_data, u8* address, u32 tile_size_x, u32 tile_size_y,
|
|
u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
|
|
u32 block_height = TICEntry::DefaultBlockHeight,
|
|
u32 block_depth = TICEntry::DefaultBlockHeight, u32 width_spacing = 0);
|
|
|
|
/// Unswizzles a swizzled texture without changing its format.
|
|
std::vector<u8> UnswizzleTexture(u8* address, u32 tile_size_x, u32 tile_size_y, u32 bytes_per_pixel,
|
|
u32 width, u32 height, u32 depth,
|
|
u32 block_height = TICEntry::DefaultBlockHeight,
|
|
u32 block_depth = TICEntry::DefaultBlockHeight,
|
|
u32 width_spacing = 0);
|
|
|
|
/// Copies texture data from a buffer and performs swizzling/unswizzling as necessary.
|
|
void CopySwizzledData(u32 width, u32 height, u32 depth, u32 bytes_per_pixel,
|
|
u32 out_bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data,
|
|
bool unswizzle, u32 block_height, u32 block_depth, u32 width_spacing);
|
|
|
|
/// Decodes an unswizzled texture into a A8R8G8B8 texture.
|
|
std::vector<u8> DecodeTexture(const std::vector<u8>& texture_data, TextureFormat format, u32 width,
|
|
u32 height);
|
|
|
|
/// This function calculates the correct size of a texture depending if it's tiled or not.
|
|
std::size_t CalculateSize(bool tiled, u32 bytes_per_pixel, u32 width, u32 height, u32 depth,
|
|
u32 block_height, u32 block_depth);
|
|
|
|
/// Copies an untiled subrectangle into a tiled surface.
|
|
void SwizzleSubrect(u32 subrect_width, u32 subrect_height, u32 source_pitch, u32 swizzled_width,
|
|
u32 bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data, u32 block_height,
|
|
u32 offset_x, u32 offset_y);
|
|
|
|
/// Copies a tiled subrectangle into a linear surface.
|
|
void UnswizzleSubrect(u32 subrect_width, u32 subrect_height, u32 dest_pitch, u32 swizzled_width,
|
|
u32 bytes_per_pixel, u8* swizzled_data, u8* unswizzled_data, u32 block_height,
|
|
u32 offset_x, u32 offset_y);
|
|
|
|
void SwizzleKepler(const u32 width, const u32 height, const u32 dst_x, const u32 dst_y,
|
|
const u32 block_height, const std::size_t copy_size, const u8* source_data,
|
|
u8* swizzle_data);
|
|
|
|
} // namespace Tegra::Texture
|