From bbc6f314eb56ab1cf0a4b800750130de515cdd0f Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Fri, 11 Jul 2014 19:01:14 +0200 Subject: GPU: Properly implement display transfers. --- src/core/hw/gpu.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/core/hw') diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp index a400338b..e05e1b02 100644 --- a/src/core/hw/gpu.cpp +++ b/src/core/hw/gpu.cpp @@ -177,7 +177,25 @@ inline void Write(u32 addr, const T data) { case Registers::DisplayTriggerTransfer: g_regs.display_transfer.trigger = data; if (g_regs.display_transfer.trigger & 1) { - // TODO: Perform display transfer! + u8* source_pointer = Memory::GetPointer(g_regs.display_transfer.GetPhysicalInputAddress()); + u8* dest_pointer = Memory::GetPointer(g_regs.display_transfer.GetPhysicalOutputAddress()); + + + // TODO: Perform display transfer correctly! + for (int y = 0; y < g_regs.display_transfer.output_height; ++y) { + // TODO: Copy size is just guesswork! + memcpy(dest_pointer + y * g_regs.display_transfer.output_width * 4, + source_pointer + y * g_regs.display_transfer.input_width * 4, + g_regs.display_transfer.output_width * 4); + } + + // Clear previous contents until we implement proper buffer clearing + memset(source_pointer, 0x20, g_regs.display_transfer.input_width*g_regs.display_transfer.input_height*4); + DEBUG_LOG(GPU, "DisplayTriggerTransfer: %x bytes from %x(%xx%x)-> %x(%xx%x), dst format %x", + g_regs.display_transfer.output_height * g_regs.display_transfer.output_width * 4, + g_regs.display_transfer.GetPhysicalInputAddress(), (int)g_regs.display_transfer.input_width, (int)g_regs.display_transfer.input_height, + g_regs.display_transfer.GetPhysicalOutputAddress(), (int)g_regs.display_transfer.output_width, (int)g_regs.display_transfer.output_height, + (int)g_regs.display_transfer.output_format); } break; -- cgit v1.2.3