diff options
Diffstat (limited to 'src/video_core/textures/decoders.cpp')
| -rw-r--r-- | src/video_core/textures/decoders.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index fcc636e0b..52d067a2d 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp | |||
| @@ -35,7 +35,7 @@ void incrpdep(u32& value) { | |||
| 35 | 35 | ||
| 36 | template <bool TO_LINEAR, u32 BYTES_PER_PIXEL> | 36 | template <bool TO_LINEAR, u32 BYTES_PER_PIXEL> |
| 37 | void SwizzleImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 height, u32 depth, | 37 | void SwizzleImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 height, u32 depth, |
| 38 | u32 block_height, u32 block_depth, u32 stride_alignment) { | 38 | u32 block_height, u32 block_depth, u32 stride) { |
| 39 | // The origin of the transformation can be configured here, leave it as zero as the current API | 39 | // The origin of the transformation can be configured here, leave it as zero as the current API |
| 40 | // doesn't expose it. | 40 | // doesn't expose it. |
| 41 | static constexpr u32 origin_x = 0; | 41 | static constexpr u32 origin_x = 0; |
| @@ -45,7 +45,6 @@ void SwizzleImpl(std::span<u8> output, std::span<const u8> input, u32 width, u32 | |||
| 45 | // We can configure here a custom pitch | 45 | // We can configure here a custom pitch |
| 46 | // As it's not exposed 'width * BYTES_PER_PIXEL' will be the expected pitch. | 46 | // As it's not exposed 'width * BYTES_PER_PIXEL' will be the expected pitch. |
| 47 | const u32 pitch = width * BYTES_PER_PIXEL; | 47 | const u32 pitch = width * BYTES_PER_PIXEL; |
| 48 | const u32 stride = Common::AlignUpLog2(width, stride_alignment) * BYTES_PER_PIXEL; | ||
| 49 | 48 | ||
| 50 | const u32 gobs_in_x = Common::DivCeilLog2(stride, GOB_SIZE_X_SHIFT); | 49 | const u32 gobs_in_x = Common::DivCeilLog2(stride, GOB_SIZE_X_SHIFT); |
| 51 | const u32 block_size = gobs_in_x << (GOB_SIZE_SHIFT + block_height + block_depth); | 50 | const u32 block_size = gobs_in_x << (GOB_SIZE_SHIFT + block_height + block_depth); |
| @@ -179,15 +178,23 @@ void Swizzle(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixe | |||
| 179 | void UnswizzleTexture(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, | 178 | void UnswizzleTexture(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, |
| 180 | u32 width, u32 height, u32 depth, u32 block_height, u32 block_depth, | 179 | u32 width, u32 height, u32 depth, u32 block_height, u32 block_depth, |
| 181 | u32 stride_alignment) { | 180 | u32 stride_alignment) { |
| 181 | const u32 stride = Common::AlignUpLog2(width, stride_alignment) * bytes_per_pixel; | ||
| 182 | const u32 new_bpp = std::min(4U, static_cast<u32>(std::countr_zero(width * bytes_per_pixel))); | ||
| 183 | width = (width * bytes_per_pixel) >> new_bpp; | ||
| 184 | bytes_per_pixel = 1U << new_bpp; | ||
| 182 | Swizzle<false>(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, | 185 | Swizzle<false>(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, |
| 183 | stride_alignment); | 186 | stride); |
| 184 | } | 187 | } |
| 185 | 188 | ||
| 186 | void SwizzleTexture(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, u32 width, | 189 | void SwizzleTexture(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, u32 width, |
| 187 | u32 height, u32 depth, u32 block_height, u32 block_depth, | 190 | u32 height, u32 depth, u32 block_height, u32 block_depth, |
| 188 | u32 stride_alignment) { | 191 | u32 stride_alignment) { |
| 192 | const u32 stride = Common::AlignUpLog2(width, stride_alignment) * bytes_per_pixel; | ||
| 193 | const u32 new_bpp = std::min(4U, static_cast<u32>(std::countr_zero(width * bytes_per_pixel))); | ||
| 194 | width = (width * bytes_per_pixel) >> new_bpp; | ||
| 195 | bytes_per_pixel = 1U << new_bpp; | ||
| 189 | Swizzle<true>(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, | 196 | Swizzle<true>(output, input, bytes_per_pixel, width, height, depth, block_height, block_depth, |
| 190 | stride_alignment); | 197 | stride); |
| 191 | } | 198 | } |
| 192 | 199 | ||
| 193 | void SwizzleSubrect(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, u32 width, | 200 | void SwizzleSubrect(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixel, u32 width, |