diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 87d6b5fb56..a80791dc5c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -174,6 +174,15 @@ D3D12GSRender::~D3D12GSRender() m_commandQueueCopy->Release(); m_backbufferAsRendertarget[0]->Release(); m_backbufferAsRendertarget[1]->Release(); + m_constantsBufferDescriptorsHeap->Release(); + m_scaleOffsetDescriptorHeap->Release(); + m_constantsBuffer->Release(); + m_scaleOffsetBuffer->Release(); + for (unsigned i = 0; i < 32; i++) + m_vertexBuffer[i]->Release(); + if (m_fbo) + delete m_fbo; + m_rootSignature->Release(); m_backBuffer[0]->Release(); m_backBuffer[1]->Release(); m_swapChain->Release(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 80d8b0ea5d..0d091451a7 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -57,6 +57,11 @@ private: ID3D12Resource *m_constantsBuffer; ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap; size_t m_constantsBufferOffset, m_constantsBufferIndex; + + ID3D12Resource *m_scaleOffsetBuffer; + ID3D12DescriptorHeap *m_scaleOffsetDescriptorHeap; + size_t m_currentScaleOffsetBufferIndex; + std::vector m_IASet; D3D12RenderTargetSets *m_fbo; ID3D12Device* m_device; @@ -83,6 +88,7 @@ private: bool LoadProgram(); void EnableVertexData(bool indexed_draw = false); + void setScaleOffset(); void FillVertexShaderConstantsBuffer(); void FillPixelShaderConstantsBuffer(); /*void DisableVertexData(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp index 568c394945..601f06fa45 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp @@ -27,16 +27,19 @@ size_t getFPBinarySize(void *ptr) } -PipelineStateObjectCache::PipelineStateObjectCache() : currentShaderId(0) +PipelineStateObjectCache::PipelineStateObjectCache() : m_currentShaderId(0) {} PipelineStateObjectCache::~PipelineStateObjectCache() -{} +{ + for (auto pair : m_cachePSO) + pair.second->Release(); +} bool PipelineStateObjectCache::SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader) { - binary2FS::const_iterator It = cacheFS.find(vm::get_ptr(rsx_fp.addr)); - if (It != cacheFS.end()) + binary2FS::const_iterator It = m_cacheFS.find(vm::get_ptr(rsx_fp.addr)); + if (It != m_cacheFS.end()) { shader = It->second; return true; @@ -46,8 +49,8 @@ bool PipelineStateObjectCache::SearchFp(const RSXFragmentProgram& rsx_fp, Shader bool PipelineStateObjectCache::SearchVp(const RSXVertexProgram& rsx_vp, Shader& shader) { - binary2VS::const_iterator It = cacheVS.find((void*)rsx_vp.data.data()); - if (It != cacheVS.end()) + binary2VS::const_iterator It = m_cacheVS.find((void*)rsx_vp.data.data()); + if (It != m_cacheVS.end()) { shader = It->second; return true; @@ -59,8 +62,8 @@ ID3D12PipelineState *PipelineStateObjectCache::GetProg(u32 fp, u32 vp) const { u64 vpLong = vp; u64 key = vpLong << 32 | fp; - std::unordered_map::const_iterator It = cachePSO.find(key); - if (It == cachePSO.end()) + std::unordered_map::const_iterator It = m_cachePSO.find(key); + if (It == m_cachePSO.end()) return nullptr; return It->second; } @@ -70,8 +73,8 @@ void PipelineStateObjectCache::AddVertexProgram(Shader& vp, RSXVertexProgram& rs size_t actualVPSize = rsx_vp.data.size() * 4; void *fpShadowCopy = malloc(actualVPSize); memcpy(fpShadowCopy, rsx_vp.data.data(), actualVPSize); - vp.Id = (u32)currentShaderId++; - cacheVS.insert(std::make_pair(fpShadowCopy, vp)); + vp.Id = (u32)m_currentShaderId++; + m_cacheVS.insert(std::make_pair(fpShadowCopy, vp)); } void PipelineStateObjectCache::AddFragmentProgram(Shader& fp, RSXFragmentProgram& rsx_fp) @@ -79,15 +82,15 @@ void PipelineStateObjectCache::AddFragmentProgram(Shader& fp, RSXFragmentProgram size_t actualFPSize = getFPBinarySize(vm::get_ptr(rsx_fp.addr)); void *fpShadowCopy = malloc(actualFPSize); memcpy(fpShadowCopy, vm::get_ptr(rsx_fp.addr), actualFPSize); - fp.Id = (u32)currentShaderId++; - cacheFS.insert(std::make_pair(fpShadowCopy, fp)); + fp.Id = (u32)m_currentShaderId++; + m_cacheFS.insert(std::make_pair(fpShadowCopy, fp)); } void PipelineStateObjectCache::Add(ID3D12PipelineState *prog, Shader& fp, Shader& vp) { u64 vpLong = vp.Id; u64 key = vpLong << 32 | fp.Id; - cachePSO.insert(std::make_pair(key, prog)); + m_cachePSO.insert(std::make_pair(key, prog)); } ID3D12PipelineState *PipelineStateObjectCache::getGraphicPipelineState(ID3D12Device *device, ID3D12RootSignature *rootSignature, RSXVertexProgram *vertexShader, RSXFragmentProgram *fragmentShader, const std::vector &IASet) @@ -253,9 +256,13 @@ ID3D12PipelineState *PipelineStateObjectCache::getGraphicPipelineState(ID3D12Dev void Shader::Compile(SHADER_TYPE st) { static const char VSstring[] = TO_STRING( - cbuffer CONSTANT : register(b0) + cbuffer SCALE_OFFSET : register(b0) { float4x4 scaleOffsetMat; + }; + + cbuffer CONSTANT : register(b1) + { float4 vc[468]; }; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h index f8fa6a5ea2..f3fb266d4b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h @@ -4,6 +4,7 @@ #include #include "Emu/RSX/RSXFragmentProgram.h" #include "Emu/RSX/RSXVertexProgram.h" +#include enum class SHADER_TYPE @@ -22,7 +23,7 @@ public: ~Shader() {} u32 Id; - ID3DBlob *bytecode; + Microsoft::WRL::ComPtr bytecode; /** * Decompile a fragment shader located in the PS3's Memory. This function operates synchronously. @@ -145,11 +146,11 @@ typedef std::unordered_map cachePSO; + std::unordered_map m_cachePSO; bool SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader); bool SearchVp(const RSXVertexProgram& rsx_vp, Shader& shader); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index e6c34301cf..f991353060 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -11,7 +11,6 @@ D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDepthFormat, size_t width, size_t height) { - D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {}; descriptorHeapDesc.NumDescriptors = 1; descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; @@ -80,8 +79,8 @@ D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDep D3D12_RESOURCE_DESC resourceDesc = {}; resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; - resourceDesc.Width = width; - resourceDesc.Height = height; + resourceDesc.Width = (UINT)width; + resourceDesc.Height = (UINT)height; resourceDesc.DepthOrArraySize = 1; resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; resourceDesc.SampleDesc.Count = 1; @@ -118,7 +117,11 @@ D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDep D3D12RenderTargetSets::~D3D12RenderTargetSets() { - + for (unsigned i = 0; i < 4; i++) + m_rtts[i]->Release(); + m_rttDescriptorHeap->Release(); + m_depthStencilTexture->Release(); + m_depthStencilDescriptorHeap->Release(); } D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderTargetSets::getRTTCPUHandle(u8 baseFBO) const