Files
XCEngine/engine/src/RHI/D3D12/D3D12Resources.h

174 lines
6.1 KiB
C++

#pragma once
#include <Rendering\Resources.h>
#include <Rendering\RenderTarget.h>
#include <RHI\D3D12\D3D12RHI.h>
namespace XCEngine {
namespace RHI {
class D3D12Buffer : public IBuffer {
public:
D3D12Buffer(D3D12Device* device, ID3D12Resource* resource, const BufferDesc& desc);
~D3D12Buffer() override;
const BufferDesc& GetDesc() const override { return m_desc; }
void* Map() override;
void Unmap() override;
void* GetNativeResource() const override { return m_resource.Get(); }
ID3D12Resource* GetNative() const { return m_resource.Get(); }
private:
D3D12Device* m_device = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> m_resource;
BufferDesc m_desc;
};
class D3D12VertexBuffer : public IVertexBuffer {
public:
D3D12VertexBuffer(D3D12Buffer* buffer);
~D3D12VertexBuffer() override;
const BufferDesc& GetDesc() const override { return m_buffer->GetDesc(); }
void* Map() override { return m_buffer->Map(); }
void Unmap() override { m_buffer->Unmap(); }
void* GetNativeResource() const override { return m_buffer->GetNativeResource(); }
ID3D12Resource* GetNative() const { return m_buffer->GetNative(); }
private:
D3D12Buffer* m_buffer = nullptr;
};
class D3D12IndexBuffer : public IIndexBuffer {
public:
D3D12IndexBuffer(D3D12Buffer* buffer);
~D3D12IndexBuffer() override;
const BufferDesc& GetDesc() const override { return m_buffer->GetDesc(); }
void* Map() override { return m_buffer->Map(); }
void Unmap() override { m_buffer->Unmap(); }
void* GetNativeResource() const override { return m_buffer->GetNativeResource(); }
ID3D12Resource* GetNative() const { return m_buffer->GetNative(); }
private:
D3D12Buffer* m_buffer = nullptr;
};
class D3D12ConstantBuffer : public IConstantBuffer {
public:
D3D12ConstantBuffer(D3D12Buffer* buffer);
~D3D12ConstantBuffer() override;
const BufferDesc& GetDesc() const override { return m_buffer->GetDesc(); }
void* Map() override { return m_buffer->Map(); }
void Unmap() override { return m_buffer->Unmap(); }
void* GetNativeResource() const override { return m_buffer->GetNativeResource(); }
ID3D12Resource* GetNative() const { return m_buffer->GetNative(); }
private:
D3D12Buffer* m_buffer = nullptr;
};
class D3D12Texture2D : public ITexture2D {
public:
D3D12Texture2D(D3D12Device* device, ID3D12Resource* resource, const TextureDesc& desc);
~D3D12Texture2D() override;
const TextureDesc& GetDesc() const override { return m_desc; }
void CreateSRV() override;
void* GetSRV() override;
void CreateRTV() override;
void* GetRTV() override;
void CreateDSV() override;
void* GetDSV() override;
void* GetNativeResource() const override { return m_resource.Get(); }
ID3D12Resource* GetNative() const { return m_resource.Get(); }
private:
D3D12Device* m_device = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> m_resource;
TextureDesc m_desc;
D3D12_CPU_DESCRIPTOR_HANDLE m_srvHandle = {};
D3D12_CPU_DESCRIPTOR_HANDLE m_rtvHandle = {};
D3D12_CPU_DESCRIPTOR_HANDLE m_dsvHandle = {};
bool m_hasSRV = false;
bool m_hasRTV = false;
bool m_hasDSV = false;
};
bool CreateVertexBuffer(D3D12Device* device, ICommandList* commandList,
const void* data, uint64_t size, uint32_t stride, IVertexBuffer** outBuffer);
bool CreateIndexBuffer(D3D12Device* device, ICommandList* commandList,
const void* data, uint64_t size, IIndexBuffer** outBuffer);
bool CreateConstantBuffer(D3D12Device* device, uint64_t size, IConstantBuffer** outBuffer);
bool CreateTexture2D(D3D12Device* device, ICommandList* commandList,
const void* pixels, uint32_t width, uint32_t height, Format format, ITexture2D** outTexture);
void UpdateConstantBuffer(IConstantBuffer* buffer, const void* data, uint64_t size);
class D3D12DepthStencil : public IDepthStencil {
public:
D3D12DepthStencil(D3D12Device* device, ID3D12Resource* resource, const TextureDesc& desc)
: m_device(device), m_resource(resource), m_desc(desc) {}
~D3D12DepthStencil() override {
m_resource.Reset();
}
const TextureDesc& GetDesc() const override { return m_desc; }
void* GetNativeResource() const override { return m_resource.Get(); }
ID3D12Resource* GetNative() const { return m_resource.Get(); }
void SetDSVHeap(void* heap) override { m_dsvHeap = (D3D12DescriptorHeap*)heap; }
void CreateSRV() override {}
void* GetSRV() override { return nullptr; }
void CreateRTV() override {}
void* GetRTV() override { return nullptr; }
void CreateDSV() override;
void* GetDSV() override { return (void*)m_dsvHandle.ptr; }
private:
D3D12Device* m_device = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> m_resource;
TextureDesc m_desc;
D3D12_CPU_DESCRIPTOR_HANDLE m_dsvHandle = {};
D3D12DescriptorHeap* m_dsvHeap = nullptr;
};
class D3D12RenderTarget : public IRenderTarget {
public:
D3D12RenderTarget(D3D12Device* device, ID3D12Resource* resource, const TextureDesc& desc)
: m_device(device), m_resource(resource), m_desc(desc) {}
~D3D12RenderTarget() override {
m_resource.Reset();
}
const TextureDesc& GetDesc() const override { return m_desc; }
void* GetNativeResource() const override { return m_resource.Get(); }
ID3D12Resource* GetNative() const { return m_resource.Get(); }
void CreateSRV() override {}
void* GetSRV() override { return nullptr; }
void CreateRTV() override;
void* GetRTV() override { return (void*)m_rtvHandle.ptr; }
void CreateDSV() override {}
void* GetDSV() override { return nullptr; }
private:
D3D12Device* m_device = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> m_resource;
TextureDesc m_desc;
D3D12_CPU_DESCRIPTOR_HANDLE m_rtvHandle = {};
};
bool CreateDepthStencil(D3D12Device* device, uint32_t width, uint32_t height, Format format, IDepthStencil** outDepthStencil);
bool CreateRenderTargetFromSwapChain(D3D12Device* device, D3D12SwapChain* swapChain, uint32_t bufferIndex, IRenderTarget** outRenderTarget);
} // namespace RHI
} // namespace XCEngine