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_commandQueueCopy->Release();
m_backbufferAsRendertarget[0]->Release(); m_backbufferAsRendertarget[0]->Release();
m_backbufferAsRendertarget[1]->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[0]->Release();
m_backBuffer[1]->Release(); m_backBuffer[1]->Release();
m_swapChain->Release(); m_swapChain->Release();

View file

@ -57,6 +57,11 @@ private:
ID3D12Resource *m_constantsBuffer; ID3D12Resource *m_constantsBuffer;
ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap; ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap;
size_t m_constantsBufferOffset, m_constantsBufferIndex; size_t m_constantsBufferOffset, m_constantsBufferIndex;
ID3D12Resource *m_scaleOffsetBuffer;
ID3D12DescriptorHeap *m_scaleOffsetDescriptorHeap;
size_t m_currentScaleOffsetBufferIndex;
std::vector<D3D12_INPUT_ELEMENT_DESC> m_IASet; std::vector<D3D12_INPUT_ELEMENT_DESC> m_IASet;
D3D12RenderTargetSets *m_fbo; D3D12RenderTargetSets *m_fbo;
ID3D12Device* m_device; ID3D12Device* m_device;
@ -83,6 +88,7 @@ private:
bool LoadProgram(); bool LoadProgram();
void EnableVertexData(bool indexed_draw = false); void EnableVertexData(bool indexed_draw = false);
void setScaleOffset();
void FillVertexShaderConstantsBuffer(); void FillVertexShaderConstantsBuffer();
void FillPixelShaderConstantsBuffer(); void FillPixelShaderConstantsBuffer();
/*void DisableVertexData(); /*void DisableVertexData();

View file

@ -27,16 +27,19 @@ size_t getFPBinarySize(void *ptr)
} }
PipelineStateObjectCache::PipelineStateObjectCache() : currentShaderId(0) PipelineStateObjectCache::PipelineStateObjectCache() : m_currentShaderId(0)
{} {}
PipelineStateObjectCache::~PipelineStateObjectCache() PipelineStateObjectCache::~PipelineStateObjectCache()
{} {
for (auto pair : m_cachePSO)
pair.second->Release();
}
bool PipelineStateObjectCache::SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader) bool PipelineStateObjectCache::SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader)
{ {
binary2FS::const_iterator It = cacheFS.find(vm::get_ptr<void>(rsx_fp.addr)); binary2FS::const_iterator It = m_cacheFS.find(vm::get_ptr<void>(rsx_fp.addr));
if (It != cacheFS.end()) if (It != m_cacheFS.end())
{ {
shader = It->second; shader = It->second;
return true; return true;
@ -46,8 +49,8 @@ bool PipelineStateObjectCache::SearchFp(const RSXFragmentProgram& rsx_fp, Shader
bool PipelineStateObjectCache::SearchVp(const RSXVertexProgram& rsx_vp, Shader& shader) bool PipelineStateObjectCache::SearchVp(const RSXVertexProgram& rsx_vp, Shader& shader)
{ {
binary2VS::const_iterator It = cacheVS.find((void*)rsx_vp.data.data()); binary2VS::const_iterator It = m_cacheVS.find((void*)rsx_vp.data.data());
if (It != cacheVS.end()) if (It != m_cacheVS.end())
{ {
shader = It->second; shader = It->second;
return true; return true;
@ -59,8 +62,8 @@ ID3D12PipelineState *PipelineStateObjectCache::GetProg(u32 fp, u32 vp) const
{ {
u64 vpLong = vp; u64 vpLong = vp;
u64 key = vpLong << 32 | fp; u64 key = vpLong << 32 | fp;
std::unordered_map<u64, ID3D12PipelineState *>::const_iterator It = cachePSO.find(key); std::unordered_map<u64, ID3D12PipelineState *>::const_iterator It = m_cachePSO.find(key);
if (It == cachePSO.end()) if (It == m_cachePSO.end())
return nullptr; return nullptr;
return It->second; return It->second;
} }
@ -70,8 +73,8 @@ void PipelineStateObjectCache::AddVertexProgram(Shader& vp, RSXVertexProgram& rs
size_t actualVPSize = rsx_vp.data.size() * 4; size_t actualVPSize = rsx_vp.data.size() * 4;
void *fpShadowCopy = malloc(actualVPSize); void *fpShadowCopy = malloc(actualVPSize);
memcpy(fpShadowCopy, rsx_vp.data.data(), actualVPSize); memcpy(fpShadowCopy, rsx_vp.data.data(), actualVPSize);
vp.Id = (u32)currentShaderId++; vp.Id = (u32)m_currentShaderId++;
cacheVS.insert(std::make_pair(fpShadowCopy, vp)); m_cacheVS.insert(std::make_pair(fpShadowCopy, vp));
} }
void PipelineStateObjectCache::AddFragmentProgram(Shader& fp, RSXFragmentProgram& rsx_fp) 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)); size_t actualFPSize = getFPBinarySize(vm::get_ptr<u8>(rsx_fp.addr));
void *fpShadowCopy = malloc(actualFPSize); void *fpShadowCopy = malloc(actualFPSize);
memcpy(fpShadowCopy, vm::get_ptr<u8>(rsx_fp.addr), actualFPSize); memcpy(fpShadowCopy, vm::get_ptr<u8>(rsx_fp.addr), actualFPSize);
fp.Id = (u32)currentShaderId++; fp.Id = (u32)m_currentShaderId++;
cacheFS.insert(std::make_pair(fpShadowCopy, fp)); m_cacheFS.insert(std::make_pair(fpShadowCopy, fp));
} }
void PipelineStateObjectCache::Add(ID3D12PipelineState *prog, Shader& fp, Shader& vp) void PipelineStateObjectCache::Add(ID3D12PipelineState *prog, Shader& fp, Shader& vp)
{ {
u64 vpLong = vp.Id; u64 vpLong = vp.Id;
u64 key = vpLong << 32 | fp.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) 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) void Shader::Compile(SHADER_TYPE st)
{ {
static const char VSstring[] = TO_STRING( static const char VSstring[] = TO_STRING(
cbuffer CONSTANT : register(b0) cbuffer SCALE_OFFSET : register(b0)
{ {
float4x4 scaleOffsetMat; float4x4 scaleOffsetMat;
};
cbuffer CONSTANT : register(b1)
{
float4 vc[468]; float4 vc[468];
}; };

View file

@ -4,6 +4,7 @@
#include <d3d12.h> #include <d3d12.h>
#include "Emu/RSX/RSXFragmentProgram.h" #include "Emu/RSX/RSXFragmentProgram.h"
#include "Emu/RSX/RSXVertexProgram.h" #include "Emu/RSX/RSXVertexProgram.h"
#include <wrl/client.h>
enum class SHADER_TYPE enum class SHADER_TYPE
@ -22,7 +23,7 @@ public:
~Shader() {} ~Shader() {}
u32 Id; u32 Id;
ID3DBlob *bytecode; Microsoft::WRL::ComPtr<ID3DBlob> bytecode;
/** /**
* Decompile a fragment shader located in the PS3's Memory. This function operates synchronously. * 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 class PipelineStateObjectCache
{ {
private: private:
size_t currentShaderId; size_t m_currentShaderId;
binary2VS cacheVS; binary2VS m_cacheVS;
binary2FS cacheFS; binary2FS m_cacheFS;
// Key is vertex << 32 | fragment ids // 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 SearchFp(const RSXFragmentProgram& rsx_fp, Shader& shader);
bool SearchVp(const RSXVertexProgram& rsx_vp, 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) D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDepthFormat, size_t width, size_t height)
{ {
D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {}; D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {};
descriptorHeapDesc.NumDescriptors = 1; descriptorHeapDesc.NumDescriptors = 1;
descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; descriptorHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
@ -80,8 +79,8 @@ D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDep
D3D12_RESOURCE_DESC resourceDesc = {}; D3D12_RESOURCE_DESC resourceDesc = {};
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
resourceDesc.Width = width; resourceDesc.Width = (UINT)width;
resourceDesc.Height = height; resourceDesc.Height = (UINT)height;
resourceDesc.DepthOrArraySize = 1; resourceDesc.DepthOrArraySize = 1;
resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
resourceDesc.SampleDesc.Count = 1; resourceDesc.SampleDesc.Count = 1;
@ -118,7 +117,11 @@ D3D12RenderTargetSets::D3D12RenderTargetSets(ID3D12Device *device, u8 surfaceDep
D3D12RenderTargetSets::~D3D12RenderTargetSets() 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 D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderTargetSets::getRTTCPUHandle(u8 baseFBO) const