174 lines
6.1 KiB
C++
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
|