diff options
| author | 2015-08-18 20:52:40 -0700 | |
|---|---|---|
| committer | 2015-08-18 20:52:40 -0700 | |
| commit | a9fc6598092f2d4f3105ebf7284685b687fa4e75 (patch) | |
| tree | cd6b5895a3ddf1edc18ac6eb498a103e5c4a95b0 /src/core/hle | |
| parent | Merge pull request #1047 from aroulin/shader-ex2-lg2 (diff) | |
| parent | GPU: Implement TextureCopy-mode display transfers (diff) | |
| download | yuzu-a9fc6598092f2d4f3105ebf7284685b687fa4e75.tar.gz yuzu-a9fc6598092f2d4f3105ebf7284685b687fa4e75.tar.xz yuzu-a9fc6598092f2d4f3105ebf7284685b687fa4e75.zip | |
Merge pull request #996 from yuriks/texture-copy
GPU: Implement TextureCopy-mode display transfers
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/gsp_gpu.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/service/gsp_gpu.h | 11 |
2 files changed, 25 insertions, 11 deletions
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp index e93c1b436..3c41e656c 100644 --- a/src/core/hle/service/gsp_gpu.cpp +++ b/src/core/hle/service/gsp_gpu.cpp | |||
| @@ -418,7 +418,7 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 418 | 418 | ||
| 419 | case CommandId::SET_DISPLAY_TRANSFER: | 419 | case CommandId::SET_DISPLAY_TRANSFER: |
| 420 | { | 420 | { |
| 421 | auto& params = command.image_copy; | 421 | auto& params = command.display_transfer; |
| 422 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.input_address)), | 422 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.input_address)), |
| 423 | Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); | 423 | Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); |
| 424 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.output_address)), | 424 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.output_address)), |
| @@ -433,17 +433,22 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 433 | // TODO: Check if texture copies are implemented correctly.. | 433 | // TODO: Check if texture copies are implemented correctly.. |
| 434 | case CommandId::SET_TEXTURE_COPY: | 434 | case CommandId::SET_TEXTURE_COPY: |
| 435 | { | 435 | { |
| 436 | auto& params = command.image_copy; | 436 | auto& params = command.texture_copy; |
| 437 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.input_address)), | 437 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.input_address), |
| 438 | Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); | 438 | Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); |
| 439 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.output_address)), | 439 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.output_address), |
| 440 | Memory::VirtualToPhysicalAddress(params.out_buffer_address) >> 3); | 440 | Memory::VirtualToPhysicalAddress(params.out_buffer_address) >> 3); |
| 441 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.input_size)), params.in_buffer_size); | 441 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.texture_copy.size), |
| 442 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.output_size)), params.out_buffer_size); | 442 | params.size); |
| 443 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.flags)), params.flags); | 443 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.texture_copy.input_size), |
| 444 | 444 | params.in_width_gap); | |
| 445 | // TODO: Should this register be set to 1 or should instead its value be OR-ed with 1? | 445 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.texture_copy.output_size), |
| 446 | WriteGPURegister(static_cast<u32>(GPU_REG_INDEX(display_transfer_config.trigger)), 1); | 446 | params.out_width_gap); |
| 447 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.flags), | ||
| 448 | params.flags); | ||
| 449 | |||
| 450 | // NOTE: Actual GSP ORs 1 with current register instead of overwriting. Doesn't seem to matter. | ||
| 451 | WriteGPURegister((u32)GPU_REG_INDEX(display_transfer_config.trigger), 1); | ||
| 447 | break; | 452 | break; |
| 448 | } | 453 | } |
| 449 | 454 | ||
diff --git a/src/core/hle/service/gsp_gpu.h b/src/core/hle/service/gsp_gpu.h index c89d0a467..8bcb30ad1 100644 --- a/src/core/hle/service/gsp_gpu.h +++ b/src/core/hle/service/gsp_gpu.h | |||
| @@ -127,7 +127,16 @@ struct Command { | |||
| 127 | u32 in_buffer_size; | 127 | u32 in_buffer_size; |
| 128 | u32 out_buffer_size; | 128 | u32 out_buffer_size; |
| 129 | u32 flags; | 129 | u32 flags; |
| 130 | } image_copy; | 130 | } display_transfer; |
| 131 | |||
| 132 | struct { | ||
| 133 | u32 in_buffer_address; | ||
| 134 | u32 out_buffer_address; | ||
| 135 | u32 size; | ||
| 136 | u32 in_width_gap; | ||
| 137 | u32 out_width_gap; | ||
| 138 | u32 flags; | ||
| 139 | } texture_copy; | ||
| 131 | 140 | ||
| 132 | u8 raw_data[0x1C]; | 141 | u8 raw_data[0x1C]; |
| 133 | }; | 142 | }; |