From a17c41b4e18ff0c5dda69dfdb7c911593b63485f Mon Sep 17 00:00:00 2001 From: DHrpcs3 Date: Sun, 10 Jan 2016 23:22:55 +0200 Subject: [PATCH] nv4097::get_report: use DMA --- rpcs3/Emu/RSX/RSXThread.cpp | 2 ++ rpcs3/Emu/RSX/rsx_methods.cpp | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 6d8bfd7b1c..2e7f52fb1c 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -654,6 +654,8 @@ namespace rsx method_registers[NV4097_SET_ZSTENCIL_CLEAR_VALUE] = 0xffffffff; + method_registers[NV4097_SET_CONTEXT_DMA_REPORT] = CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_REPORT; + // Reset vertex attrib array for (int i = 0; i < limits::vertex_count; i++) { diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index cd18c7b6eb..578e4080fc 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -269,9 +269,19 @@ namespace rsx { u8 type = arg >> 24; u32 offset = arg & 0xffffff; + u32 report_dma = method_registers[NV4097_SET_CONTEXT_DMA_REPORT]; + u32 location; - //TODO: use DMA - vm::ps3::ptr result = { rsx->local_mem_addr + offset, vm::addr }; + switch (report_dma) + { + case CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_REPORT: location = CELL_GCM_LOCATION_LOCAL; break; + case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN: location = CELL_GCM_LOCATION_MAIN; break; + default: + LOG_WARNING(RSX, "nv4097::get_report: bad report dma: 0x%x", report_dma); + return; + } + + vm::ps3::ptr result = { get_address(offset, location), vm::addr }; result->timer = rsx->timestamp();