Nameless Engine
Loading...
Searching...
No Matches
DirectXResourceManager.h
1#pragma once
2
3// Standard.
4#include <memory>
5#include <variant>
6
7// Custom.
8#include "misc/Error.h"
9#include "render/directx/descriptors/DirectXDescriptorHeap.h"
10#include "render/general/resource/GpuResourceManager.h"
11#include "material/TextureFilteringPreference.h"
12
13// External.
14#include "directx/d3dx12.h"
15#include "D3D12MemoryAllocator/include/D3D12MemAlloc.h"
16
17// OS.
18#include <wrl.h>
19
20namespace ne {
21 using namespace Microsoft::WRL;
22
23 class DirectXResource;
24 class DirectXRenderer;
25 class UploadBuffer;
26
29 public:
30 DirectXResourceManager() = delete;
32 DirectXResourceManager& operator=(const DirectXResourceManager&) = delete;
33
34 virtual ~DirectXResourceManager() override;
35
43 static DXGI_FORMAT
44 convertTextureResourceFormatToDxFormat(ShaderReadWriteTextureResourceFormat format);
45
53 static std::variant<std::unique_ptr<DirectXResourceManager>, Error>
55
64 virtual std::variant<std::unique_ptr<GpuResource>, Error> loadTextureFromDisk(
65 const std::string& sResourceName, const std::filesystem::path& pathToTextureFile) override;
66
98 virtual std::variant<std::unique_ptr<UploadBuffer>, Error> createResourceWithCpuWriteAccess(
99 const std::string& sResourceName,
100 size_t iElementSizeInBytes,
101 size_t iElementCount,
102 std::optional<bool> isUsedInShadersAsArrayResource) override;
103
129 virtual std::variant<std::unique_ptr<GpuResource>, Error> createResourceWithData(
130 const std::string& sResourceName,
131 const void* pBufferData,
132 size_t iElementSizeInBytes,
133 size_t iElementCount,
134 ResourceUsageType usage,
135 bool bIsShaderReadWriteResource) override;
136
152 virtual std::variant<std::unique_ptr<GpuResource>, Error> createResource(
153 const std::string& sResourceName,
154 size_t iElementSizeInBytes,
155 size_t iElementCount,
156 ResourceUsageType usage,
157 bool bIsShaderReadWriteResource) override;
158
169 virtual std::variant<std::unique_ptr<GpuResource>, Error> createShaderReadWriteTextureResource(
170 const std::string& sResourceName,
171 unsigned int iWidth,
172 unsigned int iHeight,
173 ShaderReadWriteTextureResourceFormat format) override;
174
180 virtual size_t getTotalVideoMemoryInMb() const override;
181
187 virtual size_t getUsedVideoMemoryInMb() const override;
188
200 std::variant<std::unique_ptr<DirectXResource>, Error> createResource(
201 const std::string& sResourceName,
202 const D3D12MA::ALLOCATION_DESC& allocationDesc,
203 const D3D12_RESOURCE_DESC& resourceDesc,
204 const D3D12_RESOURCE_STATES& initialResourceState,
205 const std::optional<D3D12_CLEAR_VALUE>& resourceClearValue);
206
216 std::variant<std::vector<std::unique_ptr<DirectXResource>>, Error>
217 makeRtvResourcesFromSwapChainBuffer(IDXGISwapChain3* pSwapChain, unsigned int iSwapChainBufferCount);
218
225
232
239
246
252 virtual std::string getCurrentStateInfo() override;
253
254 private:
267 ComPtr<D3D12MA::Allocator>&& pMemoryAllocator,
268 std::unique_ptr<DirectXDescriptorHeap>&& pRtvHeap,
269 std::unique_ptr<DirectXDescriptorHeap>&& pDsvHeap,
270 std::unique_ptr<DirectXDescriptorHeap>&& pCbvSrvUavHeap,
271 std::unique_ptr<DirectXDescriptorHeap>&& pSamplerHeap);
272
286 static inline size_t makeMultipleOf256(size_t iNumber) {
287 // We are adding 255 and then masking off
288 // the lower 2 bytes which store all bits < 256.
289
290 // Example: Suppose iNumber = 300.
291 // (300 + 255) & ~255
292 // 555 & ~255
293 // 0x022B & ~0x00ff
294 // 0x022B & 0xff00
295 // 0x0200
296 // 512
297 return (iNumber + 255) & ~255; // NOLINT
298 }
299
311 virtual std::variant<std::unique_ptr<GpuResource>, Error> createShadowMapTexture(
312 const std::string& sResourceName,
313 unsigned int iTextureSize,
314 bool bPointLightColorCubemap) override;
315
332 std::variant<std::unique_ptr<GpuResource>, Error> createResourceWithData(
333 const std::string& sResourceName,
334 const D3D12_RESOURCE_DESC& finalResourceDescription,
335 const std::vector<D3D12_SUBRESOURCE_DATA>& vSubresourcesToCopy,
336 const D3D12_RESOURCE_DESC& uploadResourceDescription,
337 bool bIsTextureResource,
338 size_t iElementSizeInBytes = 0,
339 size_t iElementCount = 0,
340 TextureFilteringPreference filteringPreference =
341 TextureFilteringPreference::FROM_RENDER_SETTINGS);
342
344 ComPtr<D3D12MA::Allocator> pMemoryAllocator;
345
347 std::unique_ptr<DirectXDescriptorHeap> pRtvHeap;
348
350 std::unique_ptr<DirectXDescriptorHeap> pDsvHeap;
351
353 std::unique_ptr<DirectXDescriptorHeap> pCbvSrvUavHeap;
354
356 std::unique_ptr<DirectXDescriptorHeap> pSamplerHeap;
357 };
358} // namespace ne
Definition: DirectXDescriptorHeap.h:206
Definition: DirectXRenderer.h:36
Definition: DirectXResourceManager.h:28
static std::variant< std::unique_ptr< DirectXResourceManager >, Error > create(DirectXRenderer *pRenderer)
Definition: DirectXResourceManager.cpp:18
virtual std::variant< std::unique_ptr< UploadBuffer >, Error > createResourceWithCpuWriteAccess(const std::string &sResourceName, size_t iElementSizeInBytes, size_t iElementCount, std::optional< bool > isUsedInShadersAsArrayResource) override
Definition: DirectXResourceManager.cpp:226
ComPtr< D3D12MA::Allocator > pMemoryAllocator
Definition: DirectXResourceManager.h:344
virtual std::variant< std::unique_ptr< GpuResource >, Error > createShaderReadWriteTextureResource(const std::string &sResourceName, unsigned int iWidth, unsigned int iHeight, ShaderReadWriteTextureResourceFormat format) override
Definition: DirectXResourceManager.cpp:340
std::unique_ptr< DirectXDescriptorHeap > pSamplerHeap
Definition: DirectXResourceManager.h:356
DirectXDescriptorHeap * getSamplerHeap() const
Definition: DirectXResourceManager.h:245
DirectXDescriptorHeap * getRtvHeap() const
Definition: DirectXResourceManager.cpp:510
static DXGI_FORMAT convertTextureResourceFormatToDxFormat(ShaderReadWriteTextureResourceFormat format)
Definition: DirectXResourceManager.cpp:577
DirectXDescriptorHeap * getDsvHeap() const
Definition: DirectXResourceManager.cpp:512
DirectXDescriptorHeap * getCbvSrvUavHeap() const
Definition: DirectXResourceManager.cpp:514
std::unique_ptr< DirectXDescriptorHeap > pRtvHeap
Definition: DirectXResourceManager.h:347
std::unique_ptr< DirectXDescriptorHeap > pCbvSrvUavHeap
Definition: DirectXResourceManager.h:353
std::unique_ptr< DirectXDescriptorHeap > pDsvHeap
Definition: DirectXResourceManager.h:350
virtual std::variant< std::unique_ptr< GpuResource >, Error > loadTextureFromDisk(const std::string &sResourceName, const std::filesystem::path &pathToTextureFile) override
Definition: DirectXResourceManager.cpp:78
virtual size_t getUsedVideoMemoryInMb() const override
Definition: DirectXResourceManager.cpp:456
virtual std::string getCurrentStateInfo() override
Definition: DirectXResourceManager.cpp:516
virtual std::variant< std::unique_ptr< GpuResource >, Error > createResource(const std::string &sResourceName, size_t iElementSizeInBytes, size_t iElementCount, ResourceUsageType usage, bool bIsShaderReadWriteResource) override
Definition: DirectXResourceManager.cpp:301
virtual std::variant< std::unique_ptr< GpuResource >, Error > createResourceWithData(const std::string &sResourceName, const void *pBufferData, size_t iElementSizeInBytes, size_t iElementCount, ResourceUsageType usage, bool bIsShaderReadWriteResource) override
Definition: DirectXResourceManager.cpp:264
virtual std::variant< std::unique_ptr< GpuResource >, Error > createShadowMapTexture(const std::string &sResourceName, unsigned int iTextureSize, bool bPointLightColorCubemap) override
Definition: DirectXResourceManager.cpp:379
virtual size_t getTotalVideoMemoryInMb() const override
Definition: DirectXResourceManager.cpp:449
static size_t makeMultipleOf256(size_t iNumber)
Definition: DirectXResourceManager.h:286
std::variant< std::vector< std::unique_ptr< DirectXResource > >, Error > makeRtvResourcesFromSwapChainBuffer(IDXGISwapChain3 *pSwapChain, unsigned int iSwapChainBufferCount)
Definition: DirectXResourceManager.cpp:487
Definition: Error.h:27
Definition: GpuResourceManager.h:43
Renderer *const pRenderer
Definition: GpuResourceManager.h:300