diff options
| author | 2018-10-14 14:42:38 -0400 | |
|---|---|---|
| committer | 2018-10-14 14:42:38 -0400 | |
| commit | b82bbfba77ef1afe1cc4f8beb2c273c8b66092c8 (patch) | |
| tree | 000e7462c1c946a96f7536140d29ea3237181913 /src/video_core/engines | |
| parent | Merge pull request #1492 from lioncash/proc (diff) | |
| parent | Shorten the implementation of 3D swizzle to only 3 functions (diff) | |
| download | yuzu-b82bbfba77ef1afe1cc4f8beb2c273c8b66092c8.tar.gz yuzu-b82bbfba77ef1afe1cc4f8beb2c273c8b66092c8.tar.xz yuzu-b82bbfba77ef1afe1cc4f8beb2c273c8b66092c8.zip | |
Merge pull request #1480 from FernandoS27/neue-swizzle
Introduce 3D Swizzle seamlessly
Diffstat (limited to 'src/video_core/engines')
| -rw-r--r-- | src/video_core/engines/fermi_2d.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_dma.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_dma.h | 4 |
3 files changed, 18 insertions, 10 deletions
diff --git a/src/video_core/engines/fermi_2d.cpp b/src/video_core/engines/fermi_2d.cpp index 912e785b9..597b279b9 100644 --- a/src/video_core/engines/fermi_2d.cpp +++ b/src/video_core/engines/fermi_2d.cpp | |||
| @@ -62,14 +62,16 @@ void Fermi2D::HandleSurfaceCopy() { | |||
| 62 | u8* dst_buffer = Memory::GetPointer(dest_cpu); | 62 | u8* dst_buffer = Memory::GetPointer(dest_cpu); |
| 63 | if (!regs.src.linear && regs.dst.linear) { | 63 | if (!regs.src.linear && regs.dst.linear) { |
| 64 | // If the input is tiled and the output is linear, deswizzle the input and copy it over. | 64 | // If the input is tiled and the output is linear, deswizzle the input and copy it over. |
| 65 | Texture::CopySwizzledData(regs.src.width, regs.src.height, src_bytes_per_pixel, | 65 | Texture::CopySwizzledData(regs.src.width, regs.src.height, regs.src.depth, |
| 66 | dst_bytes_per_pixel, src_buffer, dst_buffer, true, | 66 | src_bytes_per_pixel, dst_bytes_per_pixel, src_buffer, |
| 67 | regs.src.BlockHeight()); | 67 | dst_buffer, true, regs.src.BlockHeight(), |
| 68 | regs.src.BlockDepth()); | ||
| 68 | } else { | 69 | } else { |
| 69 | // If the input is linear and the output is tiled, swizzle the input and copy it over. | 70 | // If the input is linear and the output is tiled, swizzle the input and copy it over. |
| 70 | Texture::CopySwizzledData(regs.src.width, regs.src.height, src_bytes_per_pixel, | 71 | Texture::CopySwizzledData(regs.src.width, regs.src.height, regs.src.depth, |
| 71 | dst_bytes_per_pixel, dst_buffer, src_buffer, false, | 72 | src_bytes_per_pixel, dst_bytes_per_pixel, dst_buffer, |
| 72 | regs.dst.BlockHeight()); | 73 | src_buffer, false, regs.dst.BlockHeight(), |
| 74 | regs.dst.BlockDepth()); | ||
| 73 | } | 75 | } |
| 74 | } | 76 | } |
| 75 | } | 77 | } |
diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp index aa7481b8c..bf2a21bb6 100644 --- a/src/video_core/engines/maxwell_dma.cpp +++ b/src/video_core/engines/maxwell_dma.cpp | |||
| @@ -68,12 +68,14 @@ void MaxwellDMA::HandleCopy() { | |||
| 68 | 68 | ||
| 69 | if (regs.exec.is_dst_linear && !regs.exec.is_src_linear) { | 69 | if (regs.exec.is_dst_linear && !regs.exec.is_src_linear) { |
| 70 | // If the input is tiled and the output is linear, deswizzle the input and copy it over. | 70 | // If the input is tiled and the output is linear, deswizzle the input and copy it over. |
| 71 | Texture::CopySwizzledData(regs.src_params.size_x, regs.src_params.size_y, 1, 1, src_buffer, | 71 | Texture::CopySwizzledData(regs.src_params.size_x, regs.src_params.size_y, |
| 72 | dst_buffer, true, regs.src_params.BlockHeight()); | 72 | regs.src_params.size_z, 1, 1, src_buffer, dst_buffer, true, |
| 73 | regs.src_params.BlockHeight(), regs.src_params.BlockDepth()); | ||
| 73 | } else { | 74 | } else { |
| 74 | // If the input is linear and the output is tiled, swizzle the input and copy it over. | 75 | // If the input is linear and the output is tiled, swizzle the input and copy it over. |
| 75 | Texture::CopySwizzledData(regs.dst_params.size_x, regs.dst_params.size_y, 1, 1, dst_buffer, | 76 | Texture::CopySwizzledData(regs.dst_params.size_x, regs.dst_params.size_y, |
| 76 | src_buffer, false, regs.dst_params.BlockHeight()); | 77 | regs.dst_params.size_z, 1, 1, dst_buffer, src_buffer, false, |
| 78 | regs.dst_params.BlockHeight(), regs.dst_params.BlockDepth()); | ||
| 77 | } | 79 | } |
| 78 | } | 80 | } |
| 79 | 81 | ||
diff --git a/src/video_core/engines/maxwell_dma.h b/src/video_core/engines/maxwell_dma.h index 311ccb616..df19e02e2 100644 --- a/src/video_core/engines/maxwell_dma.h +++ b/src/video_core/engines/maxwell_dma.h | |||
| @@ -43,6 +43,10 @@ public: | |||
| 43 | u32 BlockHeight() const { | 43 | u32 BlockHeight() const { |
| 44 | return 1 << block_height; | 44 | return 1 << block_height; |
| 45 | } | 45 | } |
| 46 | |||
| 47 | u32 BlockDepth() const { | ||
| 48 | return 1 << block_depth; | ||
| 49 | } | ||
| 46 | }; | 50 | }; |
| 47 | 51 | ||
| 48 | static_assert(sizeof(Parameters) == 24, "Parameters has wrong size"); | 52 | static_assert(sizeof(Parameters) == 24, "Parameters has wrong size"); |