summaryrefslogtreecommitdiff
path: root/src/core/hle
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-08-18 20:52:40 -0700
committerGravatar Yuri Kunde Schlesner2015-08-18 20:52:40 -0700
commita9fc6598092f2d4f3105ebf7284685b687fa4e75 (patch)
treecd6b5895a3ddf1edc18ac6eb498a103e5c4a95b0 /src/core/hle
parentMerge pull request #1047 from aroulin/shader-ex2-lg2 (diff)
parentGPU: Implement TextureCopy-mode display transfers (diff)
downloadyuzu-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.cpp25
-rw-r--r--src/core/hle/service/gsp_gpu.h11
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 };