From 8cc9642b96ff5adc430c8e7ae7ceec71e7f309d9 Mon Sep 17 00:00:00 2001 From: vlj Date: Sun, 21 Jun 2015 00:51:38 +0200 Subject: [PATCH] Completly unclean way to track texture modification between frames --- rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp | 17 +++++++++++++++++ rpcs3/Emu/RSX/D3D12/D3D12GSRender.h | 1 + rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp | 5 +++++ 3 files changed, 23 insertions(+) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index ca3564072a..fe42fc79ba 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -392,9 +392,26 @@ void D3D12GSRender::Shader::Release() m_samplerDescriptorHeap->Release(); } +extern std::function gfxHandler; + D3D12GSRender::D3D12GSRender() : GSRender(), m_PSO(nullptr) { + + gfxHandler = [this](u32 addr) { + LOG_ERROR(RSX, "CATCH SEGFAULT %x", addr); + for (auto tmp : texaddrs) + { + if (addr - tmp.first < tmp.second) + { + LOG_ERROR(RSX, "Modified %x range, starting again", tmp.first); + vm::page_protect(tmp.first, tmp.second, 0, vm::page_writable, 0); + return true; + } + } + + return false; + }; loadD3D12FunctionPointers(); if (Ini.GSDebugOutputEnable.GetValue()) { diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index eccf800f9e..2fa3efa42b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -202,6 +202,7 @@ struct GarbageCollectionThread class D3D12GSRender : public GSRender { private: + std::vector > texaddrs; // Address, size GarbageCollectionThread m_GC; // Copy of RTT to be used as texture std::unordered_map m_texturesRTTs; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index ae258a319f..3f51529d77 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -636,6 +636,11 @@ size_t D3D12GSRender::UploadTextures() m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**)&commandList); getCurrentResourceStorage().m_inflightCommandList.push_back(commandList); m_texturesCache[texaddr] = vramTexture; + + size_t s = powerOf2Align(w * h * 4, 4096); + LOG_ERROR(RSX, "PROTECTING %x of size %d", powerOf2Align(texaddr, 4096), s); + texaddrs.push_back(std::make_pair(texaddr & ~0xfff, s)); + vm::page_protect(texaddr & ~0xfff, s, 0, 0, vm::page_writable); } D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};