#pragma once #include #include #include 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 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 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 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 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