@@ -797,8 +797,33 @@ struct Memory::Impl {
797797 return true ;
798798 }
799799
800+ struct RasterizerDownloadContext {
801+ Impl * impl;
802+ RasterizerDownloadArea * current_area;
803+ size_t core;
804+ size_t size;
805+ };
806+
807+ static void HandleRasterizerDownloadCallback (uint64_t address, void * user_data)
808+ {
809+ RasterizerDownloadContext & context = *((RasterizerDownloadContext *)user_data);
810+ const DAddr end_address = address + context.size ;
811+ if (context.current_area ->startAddress <= address && end_address <= context.current_area ->endAddress )
812+ [[likely]] {
813+ return ;
814+ }
815+ *(context.current_area ) = context.impl ->system .GetVideo ().OnCPURead (address, context.size );
816+ }
817+
800818 void HandleRasterizerDownload (VAddr v_address, size_t size) {
801- UNIMPLEMENTED ();
819+ const auto * p = GetPointerImpl (
820+ v_address, []() {}, []() {});
821+ RasterizerDownloadContext context;
822+ context.impl = this ;
823+ context.core = system.GetCurrentHostThreadID ();
824+ context.current_area = &rasterizer_read_areas[context.core ];
825+ context.size = size;
826+ system.GetVideo ().ApplyOpOnDeviceMemoryPointer (p, scratch_buffers[context.core ].data (), scratch_buffers[context.core ].size (), HandleRasterizerDownloadCallback, &context);
802827 }
803828
804829 struct RasterizerWriteContext {
@@ -858,6 +883,7 @@ struct Memory::Impl {
858883
859884 Core::System& system;
860885 Common::PageTable* current_page_table = nullptr ;
886+ std::array<RasterizerDownloadArea, Core::Hardware::NUM_CPU_CORES > rasterizer_read_areas{};
861887 std::array<GPUDirtyState, Core::Hardware::NUM_CPU_CORES > rasterizer_write_areas{};
862888 std::array<Common::ScratchBuffer<u32 >, Core::Hardware::NUM_CPU_CORES > scratch_buffers{};
863889 std::span<Core::GPUDirtyMemoryManager> gpu_dirty_managers;
0 commit comments