feat(RHI): 实现 RHIDevice 抽象基类

This commit is contained in:
2026-03-17 17:45:01 +08:00
parent af718279ff
commit 14fb51e61e
5 changed files with 309 additions and 39 deletions

View File

@@ -6,6 +6,7 @@
#include <string>
#include <vector>
#include "../RHIDevice.h"
#include "../RHIEnums.h"
#include "../RHITypes.h"
#include "D3D12Enum.h"
@@ -44,13 +45,13 @@ struct AdapterInfo {
bool isSoftware;
};
class D3D12Device {
class D3D12Device : public RHIDevice {
public:
D3D12Device();
~D3D12Device();
~D3D12Device() override;
bool Initialize(bool enableDebugLayer = false);
void Shutdown();
bool Initialize(const RHIDeviceDesc& desc) override;
void Shutdown() override;
ID3D12Device* GetDevice() const { return m_device.Get(); }
IDXGIFactory4* GetFactory() const { return m_factory.Get(); }
@@ -65,20 +66,33 @@ public:
void SetDeviceRemoved() { m_isDeviceRemoved = true; }
bool IsDeviceRemoved() const { return m_isDeviceRemoved; }
// Factory methods
D3D12CommandQueue* CreateCommandQueue(const CommandQueueDesc& desc);
D3D12CommandList* CreateCommandList(const CommandListDesc& desc);
RHIBuffer* CreateBuffer(const BufferDesc& desc) override;
RHITexture* CreateTexture(const TextureDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override;
RHICommandList* CreateCommandList(const CommandListDesc& desc) override;
RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override;
RHIShader* CompileShader(const ShaderCompileDesc& desc) override;
RHIPipelineState* CreatePipelineState(const PipelineStateDesc& desc) override;
RHIFence* CreateFence(const FenceDesc& desc) override;
RHISampler* CreateSampler(const SamplerDesc& desc) override;
const RHICapabilities& GetCapabilities() const override;
const RHIDeviceInfo& GetDeviceInfo() const override;
void* GetNativeDevice() override;
void* GetNativeHandle() const override;
bool PollEvents() override;
void SwapBuffers() override;
bool ShouldClose() const override;
void SetShouldClose(bool shouldClose) override;
D3D12CommandQueue* CreateCommandQueueImpl(const CommandQueueDesc& desc);
D3D12CommandList* CreateCommandListImpl(const CommandListDesc& desc);
D3D12CommandAllocator* CreateCommandAllocator(const CommandAllocatorDesc& desc);
D3D12Fence* CreateFence(const FenceDesc& desc);
D3D12DescriptorHeap* CreateDescriptorHeap(const DescriptorHeapDesc& desc);
D3D12QueryHeap* CreateQueryHeap(const QueryHeapDesc& desc);
D3D12RootSignature* CreateRootSignature(const RootSignatureDesc& desc);
D3D12PipelineState* CreatePipelineState(const PipelineStateDesc& desc);
D3D12Sampler* CreateSampler(const SamplerDesc& desc);
D3D12Texture* CreateTexture(const TextureDesc& desc);
D3D12Buffer* CreateBuffer(const BufferDesc& desc);
D3D12SwapChain* CreateSwapChain(const SwapChainDesc& desc);
D3D12Shader* CompileShader(const ShaderCompileDesc& desc);
D3D12RenderTargetView* CreateRenderTargetView(D3D12Buffer* resource, const RenderTargetViewDesc& desc);
D3D12DepthStencilView* CreateDepthStencilView(D3D12Buffer* resource, const DepthStencilViewDesc& desc);
@@ -86,8 +100,6 @@ public:
D3D12UnorderedAccessView* CreateUnorderedAccessView(D3D12Buffer* resource, const UnorderedAccessViewDesc& desc);
D3D12ConstantBufferView* CreateConstantBufferView(D3D12Buffer* resource, const ConstantBufferViewDesc& desc);
void* GetNativeHandle() const;
private:
bool CreateDXGIFactory(bool enableDebugLayer);
bool CreateDevice(IDXGIAdapter1* adapter);
@@ -98,6 +110,8 @@ private:
ComPtr<IDXGIAdapter1> m_adapter;
AdapterInfo m_adapterInfo;
RHICapabilities m_capabilities;
RHIDeviceInfo m_deviceInfo;
bool m_isDeviceRemoved;
bool m_initialized;
};

View File

@@ -3,37 +3,52 @@
#include <string>
#include <GLFW/glfw3.h>
#include "../RHIDevice.h"
#include "../RHICapabilities.h"
namespace XCEngine {
namespace RHI {
struct OpenGLDeviceInfo {
std::string vendor;
std::string renderer;
std::string version;
int majorVersion;
int minorVersion;
};
class OpenGLDevice {
class OpenGLDevice : public RHIDevice {
public:
OpenGLDevice();
~OpenGLDevice();
~OpenGLDevice() override;
bool Initialize(const RHIDeviceDesc& desc) override;
void Shutdown() override;
bool CreateRenderWindow(int width, int height, const char* title, bool enableDebug = false);
bool InitializeWithExistingWindow(GLFWwindow* window);
void Shutdown();
GLFWwindow* GetWindow() const { return m_window; }
const OpenGLDeviceInfo& GetDeviceInfo() const { return m_deviceInfo; }
const OpenGLDeviceInfo& GetDeviceInfoImpl() const { return m_deviceInfo; }
void SwapBuffers();
bool PollEvents();
void SetShouldClose(bool shouldClose);
bool ShouldClose() const;
void SwapBuffers() override;
bool PollEvents() override;
void SetShouldClose(bool shouldClose) override;
bool ShouldClose() const override;
RHIBuffer* CreateBuffer(const BufferDesc& desc) override;
RHITexture* CreateTexture(const TextureDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override;
RHICommandList* CreateCommandList(const CommandListDesc& desc) override;
RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override;
RHIShader* CompileShader(const ShaderCompileDesc& desc) override;
RHIPipelineState* CreatePipelineState(const PipelineStateDesc& desc) override;
RHIFence* CreateFence(const FenceDesc& desc) override;
RHISampler* CreateSampler(const SamplerDesc& desc) override;
const RHICapabilities& GetCapabilities() const override;
const RHIDeviceInfo& GetDeviceInfo() const override;
void* GetNativeDevice() override;
void* GetNativeHandle() const override;
private:
GLFWwindow* m_window;
OpenGLDeviceInfo m_deviceInfo;
RHICapabilities m_capabilities;
RHIDeviceInfo m_deviceInfoBase;
bool m_initialized;
bool m_ownsWindow;
};