From 1ed7f3e0281de29fd99f7d4802fcc5a1906930f8 Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Mon, 7 Sep 2015 19:22:44 -0300 Subject: GSP: Implement command 0x05, used for flushing caches May fix additional texture caching issues. (Though mostly in homebrew, I haven't seen any commercial software use this to flush anything but command lists.) --- src/core/hle/service/gsp_gpu.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'src/core/hle/service/gsp_gpu.cpp') diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp index c3d0d28a5..481da0c9f 100644 --- a/src/core/hle/service/gsp_gpu.cpp +++ b/src/core/hle/service/gsp_gpu.cpp @@ -377,12 +377,16 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { command.dma_request.size); break; - // ctrulib homebrew sends all relevant command list data with this command, - // hence we do all "interesting" stuff here and do nothing in SET_COMMAND_LIST_FIRST. - // TODO: This will need some rework in the future. - case CommandId::SET_COMMAND_LIST_LAST: + // TODO: This will need some rework in the future. (why?) + case CommandId::SUBMIT_GPU_CMDLIST: { - auto& params = command.set_command_list_last; + auto& params = command.submit_gpu_cmdlist; + + if (params.do_flush) { + // This flag flushes the command list (params.address, params.size) from the cache. + // Command lists are not processed by the hardware renderer, so we don't need to + // actually flush them in Citra. + } WriteGPURegister(static_cast(GPU_REG_INDEX(command_processor_config.address)), Memory::VirtualToPhysicalAddress(params.address) >> 3); @@ -391,6 +395,8 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { // TODO: Not sure if we are supposed to always write this .. seems to trigger processing though WriteGPURegister(static_cast(GPU_REG_INDEX(command_processor_config.trigger)), 1); + // TODO(yuriks): Figure out the meaning of the `flags` field. + break; } @@ -434,7 +440,6 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { break; } - // TODO: Check if texture copies are implemented correctly.. case CommandId::SET_TEXTURE_COPY: { auto& params = command.texture_copy; @@ -456,10 +461,15 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { break; } - // TODO: Figure out what exactly SET_COMMAND_LIST_FIRST and SET_COMMAND_LIST_LAST - // are supposed to do. - case CommandId::SET_COMMAND_LIST_FIRST: + case CommandId::CACHE_FLUSH: { + for (auto& region : command.cache_flush.regions) { + if (region.size == 0) + break; + + VideoCore::g_renderer->hw_rasterizer->NotifyFlush( + Memory::VirtualToPhysicalAddress(region.address), region.size); + } break; } -- cgit v1.2.3