d3d12: Use ComPtr<> instead of manually releasing some structures

This commit is contained in:
Vincent Lejeune 2015-08-14 23:29:48 +02:00
commit 09cc127dd9
8 changed files with 55 additions and 66 deletions

View file

@ -3,12 +3,15 @@
#include <d3d12.h> #include <d3d12.h>
#include <cassert> #include <cassert>
#include <wrl/client.h>
#include "utilities/Log.h" #include "utilities/Log.h"
#include "Emu/Memory/vm.h" #include "Emu/Memory/vm.h"
#include "Emu/RSX/GCM.h" #include "Emu/RSX/GCM.h"
#pragma comment (lib, "dxgi.lib") #pragma comment (lib, "dxgi.lib")
using namespace Microsoft::WRL;
#define SAFE_RELEASE(x) if (x) x->Release(); #define SAFE_RELEASE(x) if (x) x->Release();
// From DX12 D3D11On12 Sample (MIT Licensed) // From DX12 D3D11On12 Sample (MIT Licensed)

View file

@ -279,7 +279,7 @@ std::vector<D3D12_VERTEX_BUFFER_VIEW> D3D12GSRender::UploadVertexBuffers(bool in
{ {
std::vector<D3D12_VERTEX_BUFFER_VIEW> result; std::vector<D3D12_VERTEX_BUFFER_VIEW> result;
const std::vector<VertexBufferFormat> &vertexBufferFormat = FormatVertexData(m_vertex_data); const std::vector<VertexBufferFormat> &vertexBufferFormat = FormatVertexData(m_vertex_data);
m_IASet = getIALayout(m_device, vertexBufferFormat, m_vertex_data); m_IASet = getIALayout(m_device.Get(), vertexBufferFormat, m_vertex_data);
const u32 data_offset = indexed_draw ? 0 : m_draw_array_first; const u32 data_offset = indexed_draw ? 0 : m_draw_array_first;
@ -302,7 +302,7 @@ std::vector<D3D12_VERTEX_BUFFER_VIEW> D3D12GSRender::UploadVertexBuffers(bool in
vertexBuffer = It->second; vertexBuffer = It->second;
else else
{ {
vertexBuffer = createVertexBuffer(vbf, m_vertex_data, m_device, m_vertexIndexData); vertexBuffer = createVertexBuffer(vbf, m_vertex_data, m_device.Get(), m_vertexIndexData);
m_vertexCache[key] = vertexBuffer; m_vertexCache[key] = vertexBuffer;
} }

View file

@ -242,8 +242,7 @@ D3D12GSRender::D3D12GSRender()
D3D12_COMMAND_QUEUE_DESC copyQueueDesc = {}, graphicQueueDesc = {}; D3D12_COMMAND_QUEUE_DESC copyQueueDesc = {}, graphicQueueDesc = {};
copyQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_COPY; copyQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_COPY;
graphicQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; graphicQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
ThrowIfFailed(m_device->CreateCommandQueue(&copyQueueDesc, IID_PPV_ARGS(&m_commandQueueCopy))); ThrowIfFailed(m_device->CreateCommandQueue(&graphicQueueDesc, IID_PPV_ARGS(m_commandQueueGraphic.GetAddressOf())));
ThrowIfFailed(m_device->CreateCommandQueue(&graphicQueueDesc, IID_PPV_ARGS(&m_commandQueueGraphic)));
g_descriptorStrideSRVCBVUAV = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); g_descriptorStrideSRVCBVUAV = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
g_descriptorStrideDSV = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); g_descriptorStrideDSV = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
@ -266,7 +265,7 @@ D3D12GSRender::D3D12GSRender()
swapChain.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; swapChain.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
swapChain.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChain.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
ThrowIfFailed(dxgiFactory->CreateSwapChain(m_commandQueueGraphic, &swapChain, (IDXGISwapChain**)&m_swapChain)); ThrowIfFailed(dxgiFactory->CreateSwapChain(m_commandQueueGraphic.Get(), &swapChain, (IDXGISwapChain**)m_swapChain.GetAddressOf()));
m_swapChain->GetBuffer(0, IID_PPV_ARGS(&m_backBuffer[0])); m_swapChain->GetBuffer(0, IID_PPV_ARGS(&m_backBuffer[0]));
m_swapChain->GetBuffer(1, IID_PPV_ARGS(&m_backBuffer[1])); m_swapChain->GetBuffer(1, IID_PPV_ARGS(&m_backBuffer[1]));
@ -277,9 +276,9 @@ D3D12GSRender::D3D12GSRender()
rttDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; rttDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
rttDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rttDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
m_device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&m_backbufferAsRendertarget[0])); m_device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&m_backbufferAsRendertarget[0]));
m_device->CreateRenderTargetView(m_backBuffer[0], &rttDesc, m_backbufferAsRendertarget[0]->GetCPUDescriptorHandleForHeapStart()); m_device->CreateRenderTargetView(m_backBuffer[0].Get(), &rttDesc, m_backbufferAsRendertarget[0]->GetCPUDescriptorHandleForHeapStart());
m_device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&m_backbufferAsRendertarget[1])); m_device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&m_backbufferAsRendertarget[1]));
m_device->CreateRenderTargetView(m_backBuffer[1], &rttDesc, m_backbufferAsRendertarget[1]->GetCPUDescriptorHandleForHeapStart()); m_device->CreateRenderTargetView(m_backBuffer[1].Get(), &rttDesc, m_backbufferAsRendertarget[1]->GetCPUDescriptorHandleForHeapStart());
// Common root signatures // Common root signatures
for (unsigned textureCount = 0; textureCount < 17; textureCount++) for (unsigned textureCount = 0; textureCount < 17; textureCount++)
@ -331,16 +330,16 @@ D3D12GSRender::D3D12GSRender()
m_device->CreateRootSignature(0, m_device->CreateRootSignature(0,
rootSignatureBlob->GetBufferPointer(), rootSignatureBlob->GetBufferPointer(),
rootSignatureBlob->GetBufferSize(), rootSignatureBlob->GetBufferSize(),
IID_PPV_ARGS(&m_rootSignatures[textureCount])); IID_PPV_ARGS(m_rootSignatures[textureCount].GetAddressOf()));
} }
m_perFrameStorage[0].Init(m_device); m_perFrameStorage[0].Init(m_device.Get());
m_perFrameStorage[0].Reset(); m_perFrameStorage[0].Reset();
m_perFrameStorage[1].Init(m_device); m_perFrameStorage[1].Init(m_device.Get());
m_perFrameStorage[1].Reset(); m_perFrameStorage[1].Reset();
initConvertShader(); initConvertShader();
m_outputScalingPass.Init(m_device); m_outputScalingPass.Init(m_device.Get());
D3D12_HEAP_PROPERTIES hp = {}; D3D12_HEAP_PROPERTIES hp = {};
hp.Type = D3D12_HEAP_TYPE_DEFAULT; hp.Type = D3D12_HEAP_TYPE_DEFAULT;
@ -354,14 +353,14 @@ D3D12GSRender::D3D12GSRender()
IID_PPV_ARGS(&m_dummyTexture)) IID_PPV_ARGS(&m_dummyTexture))
); );
m_readbackResources.Init(m_device, 1024 * 1024 * 128, D3D12_HEAP_TYPE_READBACK, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS); m_readbackResources.Init(m_device.Get(), 1024 * 1024 * 128, D3D12_HEAP_TYPE_READBACK, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS);
m_UAVHeap.Init(m_device, 1024 * 1024 * 128, D3D12_HEAP_TYPE_DEFAULT, D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES); m_UAVHeap.Init(m_device.Get(), 1024 * 1024 * 128, D3D12_HEAP_TYPE_DEFAULT, D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES);
m_rtts.Init(m_device); m_rtts.Init(m_device.Get());
m_constantsData.Init(m_device, 1024 * 1024 * 64, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_NONE); m_constantsData.Init(m_device.Get(), 1024 * 1024 * 64, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_NONE);
m_vertexIndexData.Init(m_device, 1024 * 1024 * 384, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS); m_vertexIndexData.Init(m_device.Get(), 1024 * 1024 * 384, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS);
m_textureUploadData.Init(m_device, 1024 * 1024 * 256, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS); m_textureUploadData.Init(m_device.Get(), 1024 * 1024 * 256, D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS);
} }
D3D12GSRender::~D3D12GSRender() D3D12GSRender::~D3D12GSRender()
@ -378,22 +377,12 @@ D3D12GSRender::~D3D12GSRender()
m_convertRootSignature->Release(); m_convertRootSignature->Release();
m_perFrameStorage[0].Release(); m_perFrameStorage[0].Release();
m_perFrameStorage[1].Release(); m_perFrameStorage[1].Release();
m_commandQueueGraphic->Release();
m_commandQueueCopy->Release();
m_backbufferAsRendertarget[0]->Release();
m_backBuffer[0]->Release();
m_backbufferAsRendertarget[1]->Release();
m_backBuffer[1]->Release();
m_rtts.Release(); m_rtts.Release();
for (unsigned i = 0; i < 17; i++)
m_rootSignatures[i]->Release();
for (auto &tmp : m_texToClean) for (auto &tmp : m_texToClean)
tmp->Release(); tmp->Release();
for (auto &tmp : m_texturesCache) for (auto &tmp : m_texturesCache)
tmp.second->Release(); tmp.second->Release();
m_swapChain->Release();
m_outputScalingPass.Release(); m_outputScalingPass.Release();
m_device->Release();
unloadD3D12FunctionPointers(); unloadD3D12FunctionPointers();
} }
@ -559,7 +548,7 @@ void D3D12GSRender::Draw()
return; return;
} }
commandList->SetGraphicsRootSignature(m_rootSignatures[m_PSO->second]); commandList->SetGraphicsRootSignature(m_rootSignatures[m_PSO->second].Get());
commandList->OMSetStencilRef(m_stencil_func_ref); commandList->OMSetStencilRef(m_stencil_func_ref);
// Constants // Constants
@ -821,7 +810,7 @@ void D3D12GSRender::Flip()
resourceToFlip = m_rtts.m_currentlyBoundRenderTargets[0]; resourceToFlip = m_rtts.m_currentlyBoundRenderTargets[0];
} }
commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_backBuffer[m_swapChain->GetCurrentBackBufferIndex()], D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_backBuffer[m_swapChain->GetCurrentBackBufferIndex()].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
D3D12_VIEWPORT viewport = D3D12_VIEWPORT viewport =
{ {
@ -893,7 +882,7 @@ void D3D12GSRender::Flip()
if (m_rtts.m_currentlyBoundRenderTargets[0] != nullptr) if (m_rtts.m_currentlyBoundRenderTargets[0] != nullptr)
commandList->DrawInstanced(4, 1, 0, 0); commandList->DrawInstanced(4, 1, 0, 0);
commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_backBuffer[m_swapChain->GetCurrentBackBufferIndex()], D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_backBuffer[m_swapChain->GetCurrentBackBufferIndex()].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
if (isFlipSurfaceInLocalMemory(m_surface_color_target) && m_rtts.m_currentlyBoundRenderTargets[0] != nullptr) if (isFlipSurfaceInLocalMemory(m_surface_color_target) && m_rtts.m_currentlyBoundRenderTargets[0] != nullptr)
commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_rtts.m_currentlyBoundRenderTargets[0], D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET)); commandList->ResourceBarrier(1, &getResourceBarrierTransition(m_rtts.m_currentlyBoundRenderTargets[0], D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET));
ThrowIfFailed(commandList->Close()); ThrowIfFailed(commandList->Close());

View file

@ -230,6 +230,17 @@ struct GarbageCollectionThread
class D3D12GSRender : public GSRender class D3D12GSRender : public GSRender
{ {
private: private:
/** D3D12 structures.
* Note: they should be declared in reverse order of destruction
*/
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12CommandQueue> m_commandQueueGraphic;
ComPtr<struct IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Resource> m_backBuffer[2];
ComPtr<ID3D12DescriptorHeap> m_backbufferAsRendertarget[2];
// m_rootSignatures[N] is RS with N texture/sample
ComPtr<ID3D12RootSignature> m_rootSignatures[17];
/** /**
* Mutex protecting m_texturesCache and m_Textoclean access * Mutex protecting m_texturesCache and m_Textoclean access
* Memory protection fault catch can be generated by any thread and * Memory protection fault catch can be generated by any thread and
@ -253,8 +264,6 @@ private:
PipelineStateObjectCache m_cachePSO; PipelineStateObjectCache m_cachePSO;
std::pair<ID3D12PipelineState *, size_t> *m_PSO; std::pair<ID3D12PipelineState *, size_t> *m_PSO;
// m_rootSignatures[N] is RS with N texture/sample
ID3D12RootSignature *m_rootSignatures[17];
struct struct
{ {
@ -346,22 +355,15 @@ private:
RenderTargets m_rtts; RenderTargets m_rtts;
std::vector<D3D12_INPUT_ELEMENT_DESC> m_IASet; std::vector<D3D12_INPUT_ELEMENT_DESC> m_IASet;
ID3D12Device* m_device;
size_t g_descriptorStrideSRVCBVUAV; size_t g_descriptorStrideSRVCBVUAV;
size_t g_descriptorStrideDSV; size_t g_descriptorStrideDSV;
size_t g_descriptorStrideRTV; size_t g_descriptorStrideRTV;
size_t g_descriptorStrideSamplers; size_t g_descriptorStrideSamplers;
ID3D12CommandQueue *m_commandQueueCopy;
ID3D12CommandQueue *m_commandQueueGraphic;
// Used to fill unused texture slot // Used to fill unused texture slot
ID3D12Resource *m_dummyTexture; ID3D12Resource *m_dummyTexture;
struct IDXGISwapChain3 *m_swapChain;
//BackBuffers
ID3D12Resource* m_backBuffer[2];
ID3D12DescriptorHeap *m_backbufferAsRendertarget[2];
size_t m_lastWidth, m_lastHeight, m_lastDepth; size_t m_lastWidth, m_lastHeight, m_lastDepth;
public: public:
GSFrameBase2 *m_frame; GSFrameBase2 *m_frame;

View file

@ -10,8 +10,9 @@
#define TO_STRING(x) #x #define TO_STRING(x) #x
void Shader::Compile(const std::string &code, SHADER_TYPE st) void Shader::Compile(const std::string &code, SHADER_TYPE st)
{ HRESULT hr; {
Microsoft::WRL::ComPtr<ID3DBlob> errorBlob; HRESULT hr;
ComPtr<ID3DBlob> errorBlob;
switch (st) switch (st)
{ {
case SHADER_TYPE::SHADER_TYPE_VERTEX: case SHADER_TYPE::SHADER_TYPE_VERTEX:
@ -27,9 +28,6 @@ void Shader::Compile(const std::string &code, SHADER_TYPE st)
} }
} }
bool D3D12GSRender::LoadProgram() bool D3D12GSRender::LoadProgram()
{ {
if (!m_cur_fragment_prog) if (!m_cur_fragment_prog)
@ -287,7 +285,7 @@ bool D3D12GSRender::LoadProgram()
prop.IASet = m_IASet; prop.IASet = m_IASet;
m_PSO = m_cachePSO.getGraphicPipelineState(m_cur_vertex_prog, m_cur_fragment_prog, prop, std::make_pair(m_device, m_rootSignatures)); m_PSO = m_cachePSO.getGraphicPipelineState(m_cur_vertex_prog, m_cur_fragment_prog, prop, std::make_pair(m_device.Get(), m_rootSignatures));
return m_PSO != nullptr; return m_PSO != nullptr;
} }

View file

@ -1,15 +1,12 @@
#pragma once #pragma once
#if defined (DX12_SUPPORT) #if defined (DX12_SUPPORT)
#include <d3d12.h> #include "D3D12.h"
#include <wrl/client.h>
#include "../Common/ProgramStateCache.h" #include "../Common/ProgramStateCache.h"
#include "D3D12VertexProgramDecompiler.h" #include "D3D12VertexProgramDecompiler.h"
#include "D3D12FragmentProgramDecompiler.h" #include "D3D12FragmentProgramDecompiler.h"
#include "Utilities/File.h" #include "Utilities/File.h"
struct D3D12PipelineProperties struct D3D12PipelineProperties
{ {
D3D12_PRIMITIVE_TOPOLOGY_TYPE Topology; D3D12_PRIMITIVE_TOPOLOGY_TYPE Topology;
@ -66,7 +63,7 @@ public:
~Shader() {} ~Shader() {}
u32 id; u32 id;
Microsoft::WRL::ComPtr<ID3DBlob> bytecode; ComPtr<ID3DBlob> bytecode;
std::vector<size_t> FragmentConstantOffsetCache; std::vector<size_t> FragmentConstantOffsetCache;
size_t m_textureCount; size_t m_textureCount;
@ -86,7 +83,7 @@ struct D3D12Traits
typedef Shader FragmentProgramData; typedef Shader FragmentProgramData;
typedef std::pair<ID3D12PipelineState *, size_t> PipelineData; typedef std::pair<ID3D12PipelineState *, size_t> PipelineData;
typedef D3D12PipelineProperties PipelineProperties; typedef D3D12PipelineProperties PipelineProperties;
typedef std::pair<ID3D12Device *, ID3D12RootSignature **> ExtraData; typedef std::pair<ID3D12Device *, ComPtr<ID3D12RootSignature> *> ExtraData;
static static
void RecompileFragmentProgram(RSXFragmentProgram *RSXFP, FragmentProgramData& fragmentProgramData, size_t ID) void RecompileFragmentProgram(RSXFragmentProgram *RSXFP, FragmentProgramData& fragmentProgramData, size_t ID)
@ -145,7 +142,7 @@ struct D3D12Traits
graphicPipelineStateDesc.PS.BytecodeLength = fragmentProgramData.bytecode->GetBufferSize(); graphicPipelineStateDesc.PS.BytecodeLength = fragmentProgramData.bytecode->GetBufferSize();
graphicPipelineStateDesc.PS.pShaderBytecode = fragmentProgramData.bytecode->GetBufferPointer(); graphicPipelineStateDesc.PS.pShaderBytecode = fragmentProgramData.bytecode->GetBufferPointer();
graphicPipelineStateDesc.pRootSignature = extraData.second[fragmentProgramData.m_textureCount]; graphicPipelineStateDesc.pRootSignature = extraData.second[fragmentProgramData.m_textureCount].Get();
result->second = fragmentProgramData.m_textureCount; result->second = fragmentProgramData.m_textureCount;
graphicPipelineStateDesc.BlendState = pipelineProperties.Blend; graphicPipelineStateDesc.BlendState = pipelineProperties.Blend;

View file

@ -59,66 +59,66 @@ void D3D12GSRender::PrepareRenderTargets(ID3D12GraphicsCommandList *copycmdlist)
{ {
case CELL_GCM_SURFACE_TARGET_0: case CELL_GCM_SURFACE_TARGET_0:
{ {
ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle);
break; break;
} }
case CELL_GCM_SURFACE_TARGET_1: case CELL_GCM_SURFACE_TARGET_1:
{ {
ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 0, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 0, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle);
break; break;
} }
case CELL_GCM_SURFACE_TARGET_MRT1: case CELL_GCM_SURFACE_TARGET_MRT1:
{ {
ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle);
} }
break; break;
case CELL_GCM_SURFACE_TARGET_MRT2: case CELL_GCM_SURFACE_TARGET_MRT2:
{ {
ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttC = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 2, address_c, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttC = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 2, address_c, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttC, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttC, &rttViewDesc, Handle);
break; break;
} }
case CELL_GCM_SURFACE_TARGET_MRT3: case CELL_GCM_SURFACE_TARGET_MRT3:
{ {
ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttA = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 0, address_a, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttA, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttB = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 1, address_b, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttB, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttC = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 2, address_c, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttC = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 2, address_c, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttC, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttC, &rttViewDesc, Handle);
Handle.ptr += g_RTTIncrement; Handle.ptr += g_RTTIncrement;
ID3D12Resource *rttD = m_rtts.bindAddressAsRenderTargets(m_device, copycmdlist, 3, address_d, m_surface_clip_w, m_surface_clip_h, m_surface_color_format, ID3D12Resource *rttD = m_rtts.bindAddressAsRenderTargets(m_device.Get(), copycmdlist, 3, address_d, m_surface_clip_w, m_surface_clip_h, m_surface_color_format,
m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f); m_clear_surface_color_r / 255.0f, m_clear_surface_color_g / 255.0f, m_clear_surface_color_b / 255.0f, m_clear_surface_color_a / 255.0f);
m_device->CreateRenderTargetView(rttD, &rttViewDesc, Handle); m_device->CreateRenderTargetView(rttD, &rttViewDesc, Handle);
break; break;
} }
} }
ID3D12Resource *ds = m_rtts.bindAddressAsDepthStencil(m_device, copycmdlist, address_z, m_surface_clip_w, m_surface_clip_h, m_surface_depth_format, 1., 0); ID3D12Resource *ds = m_rtts.bindAddressAsDepthStencil(m_device.Get(), copycmdlist, address_z, m_surface_clip_w, m_surface_clip_h, m_surface_depth_format, 1., 0);
D3D12_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = {}; D3D12_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = {};
switch (m_surface_depth_format) switch (m_surface_depth_format)

View file

@ -758,7 +758,7 @@ size_t D3D12GSRender::UploadTextures(ID3D12GraphicsCommandList *cmdlist)
} }
else else
{ {
vramTexture = uploadSingleTexture(m_textures[i], m_device, cmdlist, m_textureUploadData); vramTexture = uploadSingleTexture(m_textures[i], m_device.Get(), cmdlist, m_textureUploadData);
m_texturesCache[texaddr] = vramTexture; m_texturesCache[texaddr] = vramTexture;
u32 s = (u32)align(getTextureSize(m_textures[i]), 4096); u32 s = (u32)align(getTextureSize(m_textures[i]), 4096);