mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 12:05:23 +00:00
d3d12: Add missing hunk + properly clean our D3D allocations
This commit is contained in:
parent
07ea311b3a
commit
b016fbc9e4
5 changed files with 49 additions and 23 deletions
|
@ -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();
|
||||
|
|
|
@ -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<D3D12_INPUT_ELEMENT_DESC> 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();
|
||||
|
|
|
@ -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<void>(rsx_fp.addr));
|
||||
if (It != cacheFS.end())
|
||||
binary2FS::const_iterator It = m_cacheFS.find(vm::get_ptr<void>(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<u64, ID3D12PipelineState *>::const_iterator It = cachePSO.find(key);
|
||||
if (It == cachePSO.end())
|
||||
std::unordered_map<u64, ID3D12PipelineState *>::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<u8>(rsx_fp.addr));
|
||||
void *fpShadowCopy = malloc(actualFPSize);
|
||||
memcpy(fpShadowCopy, vm::get_ptr<u8>(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<D3D12_INPUT_ELEMENT_DESC> &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];
|
||||
};
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <d3d12.h>
|
||||
#include "Emu/RSX/RSXFragmentProgram.h"
|
||||
#include "Emu/RSX/RSXVertexProgram.h"
|
||||
#include <wrl/client.h>
|
||||
|
||||
|
||||
enum class SHADER_TYPE
|
||||
|
@ -22,7 +23,7 @@ public:
|
|||
~Shader() {}
|
||||
|
||||
u32 Id;
|
||||
ID3DBlob *bytecode;
|
||||
Microsoft::WRL::ComPtr<ID3DBlob> bytecode;
|
||||
|
||||
/**
|
||||
* Decompile a fragment shader located in the PS3's Memory. This function operates synchronously.
|
||||
|
@ -145,11 +146,11 @@ typedef std::unordered_map<void *, Shader, HashFragmentProgram, FragmentProgramC
|
|||
class PipelineStateObjectCache
|
||||
{
|
||||
private:
|
||||
size_t currentShaderId;
|
||||
binary2VS cacheVS;
|
||||
binary2FS cacheFS;
|
||||
size_t m_currentShaderId;
|
||||
binary2VS m_cacheVS;
|
||||
binary2FS m_cacheFS;
|
||||
// Key is vertex << 32 | fragment ids
|
||||
std::unordered_map<u64, ID3D12PipelineState *> cachePSO;
|
||||
std::unordered_map<u64, ID3D12PipelineState *> m_cachePSO;
|
||||
|
||||
bool SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader);
|
||||
bool SearchVp(const RSXVertexProgram& rsx_vp, Shader& shader);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue