From 6b08194728fe024b6064abd5a5d244f88304ae86 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 16 Feb 2016 01:21:22 -0500 Subject: [PATCH] D3D12: Get rid of safe deletion macros Anything these macros provided can be obsoleted by using the correct standard library types. --- Source/Core/VideoBackends/D3D12/D3DBase.cpp | 31 ++++++++++--------- Source/Core/VideoBackends/D3D12/D3DBase.h | 13 ++++---- .../Core/VideoBackends/D3D12/D3DTexture.cpp | 8 +++-- Source/Core/VideoBackends/D3D12/D3DUtil.cpp | 31 ++++++++++--------- .../D3D12/ShaderConstantsManager.cpp | 17 +++++----- .../Core/VideoBackends/D3D12/TextureCache.cpp | 4 +-- .../Core/VideoBackends/D3D12/TextureCache.h | 4 ++- .../VideoBackends/D3D12/VertexManager.cpp | 8 ++--- .../Core/VideoBackends/D3D12/VertexManager.h | 5 +-- 9 files changed, 63 insertions(+), 58 deletions(-) diff --git a/Source/Core/VideoBackends/D3D12/D3DBase.cpp b/Source/Core/VideoBackends/D3D12/D3DBase.cpp index 54565ec273..c95142e133 100644 --- a/Source/Core/VideoBackends/D3D12/D3DBase.cpp +++ b/Source/Core/VideoBackends/D3D12/D3DBase.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include "Common/CommonTypes.h" #include "Common/MsgHandler.h" @@ -46,7 +47,7 @@ namespace D3D ID3D12Device* device12 = nullptr; ID3D12CommandQueue* command_queue = nullptr; -D3DCommandListManager* command_list_mgr = nullptr; +std::unique_ptr command_list_mgr; ID3D12GraphicsCommandList* current_command_list = nullptr; ID3D12RootSignature* default_root_signature = nullptr; @@ -55,10 +56,10 @@ D3D12_CPU_DESCRIPTOR_HANDLE null_srv_cpu_shadow = {}; unsigned int resource_descriptor_size = 0; unsigned int sampler_descriptor_size = 0; -D3DDescriptorHeapManager* gpu_descriptor_heap_mgr = nullptr; -D3DDescriptorHeapManager* sampler_descriptor_heap_mgr = nullptr; -D3DDescriptorHeapManager* dsv_descriptor_heap_mgr = nullptr; -D3DDescriptorHeapManager* rtv_descriptor_heap_mgr = nullptr; +std::unique_ptr gpu_descriptor_heap_mgr; +std::unique_ptr sampler_descriptor_heap_mgr; +std::unique_ptr dsv_descriptor_heap_mgr; +std::unique_ptr rtv_descriptor_heap_mgr; std::array gpu_descriptor_heaps; HWND hWnd; @@ -558,7 +559,7 @@ HRESULT Create(HWND wnd) CreateDescriptorHeaps(); CreateRootSignatures(); - command_list_mgr = new D3DCommandListManager( + command_list_mgr = std::make_unique( D3D12_COMMAND_LIST_TYPE_DIRECT, device12, command_queue @@ -605,7 +606,7 @@ void CreateDescriptorHeaps() gpu_descriptor_heap_desc.NumDescriptors = 500000; gpu_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; - gpu_descriptor_heap_mgr = new D3DDescriptorHeapManager(&gpu_descriptor_heap_desc, device12, 50000); + gpu_descriptor_heap_mgr = std::make_unique(&gpu_descriptor_heap_desc, device12, 50000); gpu_descriptor_heaps[0] = gpu_descriptor_heap_mgr->GetDescriptorHeap(); @@ -641,7 +642,7 @@ void CreateDescriptorHeaps() sampler_descriptor_heap_desc.NumDescriptors = 2000; sampler_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; - sampler_descriptor_heap_mgr = new D3DDescriptorHeapManager(&sampler_descriptor_heap_desc, device12); + sampler_descriptor_heap_mgr = std::make_unique(&sampler_descriptor_heap_desc, device12); gpu_descriptor_heaps[1] = sampler_descriptor_heap_mgr->GetDescriptorHeap(); } @@ -652,7 +653,7 @@ void CreateDescriptorHeaps() dsv_descriptor_heap_desc.NumDescriptors = 2000; dsv_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; - dsv_descriptor_heap_mgr = new D3DDescriptorHeapManager(&dsv_descriptor_heap_desc, device12); + dsv_descriptor_heap_mgr = std::make_unique(&dsv_descriptor_heap_desc, device12); } { @@ -662,7 +663,7 @@ void CreateDescriptorHeaps() rtv_descriptor_heap_desc.NumDescriptors = 1000000; rtv_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; - rtv_descriptor_heap_mgr = new D3DDescriptorHeapManager(&rtv_descriptor_heap_desc, device12); + rtv_descriptor_heap_mgr = std::make_unique(&rtv_descriptor_heap_desc, device12); } } @@ -757,15 +758,15 @@ void Close() SAFE_RELEASE(s_swap_chain); - SAFE_DELETE(command_list_mgr); + command_list_mgr.reset(); command_queue->Release(); default_root_signature->Release(); - SAFE_DELETE(gpu_descriptor_heap_mgr); - SAFE_DELETE(sampler_descriptor_heap_mgr); - SAFE_DELETE(rtv_descriptor_heap_mgr); - SAFE_DELETE(dsv_descriptor_heap_mgr); + gpu_descriptor_heap_mgr.reset(); + sampler_descriptor_heap_mgr.reset(); + rtv_descriptor_heap_mgr.reset(); + dsv_descriptor_heap_mgr.reset(); ULONG remaining_references = device12->Release(); if ((!s_debug_device12 && remaining_references) || (s_debug_device12 && remaining_references > 1)) diff --git a/Source/Core/VideoBackends/D3D12/D3DBase.h b/Source/Core/VideoBackends/D3D12/D3DBase.h index f8a61ad793..21cd9650ea 100644 --- a/Source/Core/VideoBackends/D3D12/D3DBase.h +++ b/Source/Core/VideoBackends/D3D12/D3DBase.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "../../Externals/d3dx12/d3dx12.h" @@ -25,8 +26,6 @@ namespace DX12 { #define SAFE_RELEASE(x) { if (x) (x)->Release(); (x) = nullptr; } -#define SAFE_DELETE(x) { delete (x); (x) = nullptr; } -#define SAFE_DELETE_ARRAY(x) { delete[] (x); (x) = nullptr; } #define CHECK(cond, Message, ...) if (!(cond)) { __debugbreak(); PanicAlert(__FUNCTION__ " failed in %s at line %d: " Message, __FILE__, __LINE__, __VA_ARGS__); } // DEBUGCHECK is for high-frequency functions that we only want to check on debug builds. @@ -80,17 +79,17 @@ extern ID3D12Device* device12; extern unsigned int resource_descriptor_size; extern unsigned int sampler_descriptor_size; -extern D3DDescriptorHeapManager* gpu_descriptor_heap_mgr; -extern D3DDescriptorHeapManager* sampler_descriptor_heap_mgr; -extern D3DDescriptorHeapManager* dsv_descriptor_heap_mgr; -extern D3DDescriptorHeapManager* rtv_descriptor_heap_mgr; +extern std::unique_ptr gpu_descriptor_heap_mgr; +extern std::unique_ptr sampler_descriptor_heap_mgr; +extern std::unique_ptr dsv_descriptor_heap_mgr; +extern std::unique_ptr rtv_descriptor_heap_mgr; extern std::array gpu_descriptor_heaps; extern D3D12_CPU_DESCRIPTOR_HANDLE null_srv_cpu; extern D3D12_CPU_DESCRIPTOR_HANDLE null_srv_cpu_shadow; -extern D3DCommandListManager* command_list_mgr; +extern std::unique_ptr command_list_mgr; extern ID3D12GraphicsCommandList* current_command_list; extern ID3D12RootSignature* default_root_signature; diff --git a/Source/Core/VideoBackends/D3D12/D3DTexture.cpp b/Source/Core/VideoBackends/D3D12/D3DTexture.cpp index 9b56fa5e4a..6ad5da8d59 100644 --- a/Source/Core/VideoBackends/D3D12/D3DTexture.cpp +++ b/Source/Core/VideoBackends/D3D12/D3DTexture.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include + #include "Common/CommonTypes.h" #include "Common/MsgHandler.h" #include "VideoBackends/D3D12/D3DBase.h" @@ -19,11 +21,11 @@ namespace DX12 namespace D3D { -static D3DStreamBuffer* s_texture_upload_stream_buffer = nullptr; +static std::unique_ptr s_texture_upload_stream_buffer; void CleanupPersistentD3DTextureResources() { - SAFE_DELETE(s_texture_upload_stream_buffer); + s_texture_upload_stream_buffer.reset(); } void ReplaceRGBATexture2D(ID3D12Resource* texture12, const u8* buffer, unsigned int width, unsigned int height, unsigned int src_pitch, unsigned int level, D3D12_RESOURCE_STATES current_resource_state) @@ -32,7 +34,7 @@ void ReplaceRGBATexture2D(ID3D12Resource* texture12, const u8* buffer, unsigned if (!s_texture_upload_stream_buffer) { - s_texture_upload_stream_buffer = new D3DStreamBuffer(4 * 1024 * 1024, 64 * 1024 * 1024, nullptr); + s_texture_upload_stream_buffer = std::make_unique(4 * 1024 * 1024, 64 * 1024 * 1024, nullptr); } bool current_command_list_executed = s_texture_upload_stream_buffer->AllocateSpaceInBuffer(upload_size, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT); diff --git a/Source/Core/VideoBackends/D3D12/D3DUtil.cpp b/Source/Core/VideoBackends/D3D12/D3DUtil.cpp index 3bbeb55c04..606c4a466f 100644 --- a/Source/Core/VideoBackends/D3D12/D3DUtil.cpp +++ b/Source/Core/VideoBackends/D3D12/D3DUtil.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include "VideoBackends/D3D12/D3DBase.h" @@ -58,11 +59,11 @@ class UtilVertexBuffer public: explicit UtilVertexBuffer(size_t size) { - m_stream_buffer = new D3DStreamBuffer(size, size * 4, nullptr); + m_stream_buffer = std::make_unique(size, size * 4, nullptr); } + ~UtilVertexBuffer() { - SAFE_DELETE(m_stream_buffer); } size_t GetSize() const { return m_stream_buffer->GetSize(); } @@ -97,14 +98,14 @@ public: } private: - D3DStreamBuffer* m_stream_buffer = nullptr; + std::unique_ptr m_stream_buffer; }; CD3DFont font; -UtilVertexBuffer* util_vbuf_stq = nullptr; -UtilVertexBuffer* util_vbuf_cq = nullptr; -UtilVertexBuffer* util_vbuf_clearq = nullptr; -UtilVertexBuffer* util_vbuf_efbpokequads = nullptr; +static std::unique_ptr util_vbuf_stq; +static std::unique_ptr util_vbuf_cq; +static std::unique_ptr util_vbuf_clearq; +static std::unique_ptr util_vbuf_efbpokequads; static const unsigned int s_max_num_vertices = 8000 * 6; @@ -541,10 +542,10 @@ static size_t clearq_offset; void InitUtils() { - util_vbuf_stq = new UtilVertexBuffer(0x10000); - util_vbuf_cq = new UtilVertexBuffer(0x10000); - util_vbuf_clearq = new UtilVertexBuffer(0x10000); - util_vbuf_efbpokequads = new UtilVertexBuffer(0x100000); + util_vbuf_stq = std::make_unique(0x10000); + util_vbuf_cq = std::make_unique(0x10000); + util_vbuf_clearq = std::make_unique(0x10000); + util_vbuf_efbpokequads = std::make_unique(0x100000); D3D12_SAMPLER_DESC point_sampler_desc = { D3D12_FILTER_MIN_MAG_MIP_POINT, @@ -590,10 +591,10 @@ void ShutdownUtils() { font.Shutdown(); - SAFE_DELETE(util_vbuf_stq); - SAFE_DELETE(util_vbuf_cq); - SAFE_DELETE(util_vbuf_clearq); - SAFE_DELETE(util_vbuf_efbpokequads); + util_vbuf_stq.reset(); + util_vbuf_cq.reset(); + util_vbuf_clearq.reset(); + util_vbuf_efbpokequads.reset(); } void SetPointCopySampler() diff --git a/Source/Core/VideoBackends/D3D12/ShaderConstantsManager.cpp b/Source/Core/VideoBackends/D3D12/ShaderConstantsManager.cpp index 049145f352..b531c0a11b 100644 --- a/Source/Core/VideoBackends/D3D12/ShaderConstantsManager.cpp +++ b/Source/Core/VideoBackends/D3D12/ShaderConstantsManager.cpp @@ -2,11 +2,12 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. -#include "D3DBase.h" -#include "D3DCommandListManager.h" -#include "D3DStreamBuffer.h" +#include -#include "ShaderConstantsManager.h" +#include "VideoBackends/D3D12/D3DBase.h" +#include "VideoBackends/D3D12/D3DCommandListManager.h" +#include "VideoBackends/D3D12/D3DStreamBuffer.h" +#include "VideoBackends/D3D12/ShaderConstantsManager.h" #include "VideoCommon/GeometryShaderManager.h" #include "VideoCommon/PixelShaderManager.h" @@ -25,7 +26,7 @@ enum SHADER_STAGE SHADER_STAGE_COUNT = 3 }; -static std::array s_shader_constant_stream_buffers = {}; +static std::array, SHADER_STAGE_COUNT> s_shader_constant_stream_buffers; static const unsigned int s_shader_constant_buffer_padded_sizes[SHADER_STAGE_COUNT] = { (sizeof(GeometryShaderConstants) + 0xff) & ~0xff, @@ -37,14 +38,14 @@ void ShaderConstantsManager::Init() { // Allow a large maximum size, as we want to minimize stalls here std::generate(std::begin(s_shader_constant_stream_buffers), std::end(s_shader_constant_stream_buffers), []() { - return new D3DStreamBuffer(2 * 1024 * 1024, 64 * 1024 * 1024, nullptr); + return std::make_unique(2 * 1024 * 1024, 64 * 1024 * 1024, nullptr); }); } void ShaderConstantsManager::Shutdown() { - for (auto& it : s_shader_constant_stream_buffers) - SAFE_DELETE(it); + for (auto& buffer : s_shader_constant_stream_buffers) + buffer.reset(); } bool ShaderConstantsManager::LoadAndSetGeometryShaderConstants() diff --git a/Source/Core/VideoBackends/D3D12/TextureCache.cpp b/Source/Core/VideoBackends/D3D12/TextureCache.cpp index cafe0dc651..d88fce86c7 100644 --- a/Source/Core/VideoBackends/D3D12/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D12/TextureCache.cpp @@ -563,7 +563,7 @@ TextureCache::TextureCache() m_palette_pixel_shaders[GX_TL_RGB565] = GetConvertShader12(std::string("RGB565")); m_palette_pixel_shaders[GX_TL_RGB5A3] = GetConvertShader12(std::string("RGB5A3")); - m_palette_stream_buffer = new D3DStreamBuffer(sizeof(u16) * 256 * 1024, sizeof(u16) * 256 * 1024 * 16, nullptr); + m_palette_stream_buffer = std::make_unique(sizeof(u16) * 256 * 1024, sizeof(u16) * 256 * 1024 * 16, nullptr); // Right now, there are only two variants of palette_uniform data. So, we'll just create an upload heap to permanently store both of these. CheckHR( @@ -604,8 +604,6 @@ TextureCache::~TextureCache() s_efb_copy_stream_buffer.reset(); - SAFE_DELETE(m_palette_stream_buffer); - if (s_texture_cache_entry_readback_buffer) { D3D::command_list_mgr->DestroyResourceAfterCurrentCommandListExecuted(s_texture_cache_entry_readback_buffer); diff --git a/Source/Core/VideoBackends/D3D12/TextureCache.h b/Source/Core/VideoBackends/D3D12/TextureCache.h index b9ef56fd98..3747cd9e0c 100644 --- a/Source/Core/VideoBackends/D3D12/TextureCache.h +++ b/Source/Core/VideoBackends/D3D12/TextureCache.h @@ -4,6 +4,8 @@ #pragma once +#include + #include "VideoBackends/D3D12/D3DTexture.h" #include "VideoCommon/TextureCacheBase.h" @@ -59,7 +61,7 @@ private: void CompileShaders() override { } void DeleteShaders() override { } - D3DStreamBuffer* m_palette_stream_buffer = nullptr; + std::unique_ptr m_palette_stream_buffer; ID3D12Resource* m_palette_uniform_buffer = nullptr; D3D12_SHADER_BYTECODE m_palette_pixel_shaders[3] = {}; diff --git a/Source/Core/VideoBackends/D3D12/VertexManager.cpp b/Source/Core/VideoBackends/D3D12/VertexManager.cpp index 14c68d17f7..6bdfd2e272 100644 --- a/Source/Core/VideoBackends/D3D12/VertexManager.cpp +++ b/Source/Core/VideoBackends/D3D12/VertexManager.cpp @@ -44,8 +44,8 @@ void VertexManager::CreateDeviceObjects() m_vertex_draw_offset = 0; m_index_draw_offset = 0; - m_vertex_stream_buffer = new D3DStreamBuffer(VertexManager::MAXVBUFFERSIZE * 2, MAX_VBUFFER_SIZE, &m_vertex_stream_buffer_reallocated); - m_index_stream_buffer = new D3DStreamBuffer(VertexManager::MAXIBUFFERSIZE * sizeof(u16) * 2, VertexManager::MAXIBUFFERSIZE * sizeof(u16) * 16, &m_index_stream_buffer_reallocated); + m_vertex_stream_buffer = std::make_unique(MAXVBUFFERSIZE * 2, MAX_VBUFFER_SIZE, &m_vertex_stream_buffer_reallocated); + m_index_stream_buffer = std::make_unique(MAXIBUFFERSIZE * sizeof(u16) * 2, MAXIBUFFERSIZE * sizeof(u16) * 16, &m_index_stream_buffer_reallocated); SetIndexBuffer(); @@ -57,8 +57,8 @@ void VertexManager::CreateDeviceObjects() void VertexManager::DestroyDeviceObjects() { - SAFE_DELETE(m_vertex_stream_buffer); - SAFE_DELETE(m_index_stream_buffer); + m_vertex_stream_buffer.reset(); + m_index_stream_buffer.reset(); m_vertex_cpu_buffer.clear(); m_index_cpu_buffer.clear(); diff --git a/Source/Core/VideoBackends/D3D12/VertexManager.h b/Source/Core/VideoBackends/D3D12/VertexManager.h index d7e7394f6b..4deac9f897 100644 --- a/Source/Core/VideoBackends/D3D12/VertexManager.h +++ b/Source/Core/VideoBackends/D3D12/VertexManager.h @@ -4,6 +4,7 @@ #pragma once +#include #include "VideoCommon/VertexManagerBase.h" namespace DX12 @@ -34,8 +35,8 @@ private: u32 m_vertex_draw_offset; u32 m_index_draw_offset; - D3DStreamBuffer* m_vertex_stream_buffer = nullptr; - D3DStreamBuffer* m_index_stream_buffer = nullptr; + std::unique_ptr m_vertex_stream_buffer; + std::unique_ptr m_index_stream_buffer; bool m_vertex_stream_buffer_reallocated = false; bool m_index_stream_buffer_reallocated = false;