From a18d95f6cfd27ea75c8e276a3dd5ff2340620130 Mon Sep 17 00:00:00 2001 From: DH Date: Mon, 30 Sep 2024 21:44:05 +0300 Subject: [PATCH] gpu2: implement IT_EVENT_WRITE_EOS --- rpcsx-gpu2/Pipe.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/rpcsx-gpu2/Pipe.cpp b/rpcsx-gpu2/Pipe.cpp index cc8868cb0..da8aef903 100644 --- a/rpcsx-gpu2/Pipe.cpp +++ b/rpcsx-gpu2/Pipe.cpp @@ -846,16 +846,24 @@ bool GraphicsPipe::eventWriteEos(Queue &queue) { auto pointer = RemoteMemory{queue.vmId}.getPointer(address); context.vgtEventInitiator = eventType; + auto &cache = device->caches[queue.vmId]; switch (cmd) { case 1: { // store GDS data to memory auto sizeDw = rx::getBits(dataInfo, 31, 16); auto gdsIndexDw = rx::getBits(dataInfo, 15, 0); - rx::die("unimplemented event write eos gds data"); + std::println("event write eos: gds data {:x}-{:x}", gdsIndexDw, + gdsIndexDw + sizeDw); + auto size = sizeof(std::uint32_t) * sizeDw; + + auto gds = cache.getGdsBuffer().getData(); + cache.invalidate(scheduler, address, size); + std::memcpy(pointer, gds + gdsIndexDw * sizeof(std::uint32_t), size); break; } case 2: // after GDS writes confirm, store 32 bit DATA to memory as fence + cache.invalidate(scheduler, address, sizeof(std::uint32_t)); *pointer = dataInfo; break;