d3d12: Add missing hunk + properly clean our D3D allocations

This commit is contained in:
vlj 2015-05-13 18:55:18 +02:00 committed by Vincent Lejeune
parent 07ea311b3a
commit b016fbc9e4
5 changed files with 49 additions and 23 deletions

View file

@ -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();

View file

@ -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();

View file

@ -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];
};

View file

@ -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);

View file

@ -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