Fix RHI swap chain queue binding and restore minimal GT checks

This commit is contained in:
2026-03-25 21:50:57 +08:00
parent 8f76564ded
commit 30b5f93157
13 changed files with 127 additions and 74 deletions

View File

@@ -65,7 +65,7 @@ public:
RHIBuffer* CreateBuffer(const BufferDesc& desc) override;
RHITexture* CreateTexture(const TextureDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) override;
RHICommandList* CreateCommandList(const CommandListDesc& desc) override;
RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override;
RHIShader* CreateShader(const ShaderCompileDesc& desc) override;
@@ -114,8 +114,6 @@ private:
ComPtr<ID3D12Device> m_device;
ComPtr<IDXGIFactory4> m_factory;
ComPtr<IDXGIAdapter1> m_adapter;
ComPtr<ID3D12CommandQueue> m_commandQueue;
AdapterInfo m_adapterInfo;
RHICapabilities m_capabilities;
RHIDeviceInfo m_deviceInfo;

View File

@@ -36,7 +36,7 @@ public:
RHIBuffer* CreateBuffer(const BufferDesc& desc) override;
RHITexture* CreateTexture(const TextureDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override;
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) override;
RHICommandList* CreateCommandList(const CommandListDesc& desc) override;
RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override;
RHIShader* CreateShader(const ShaderCompileDesc& desc) override;
@@ -90,4 +90,4 @@ private:
};
} // namespace RHI
} // namespace XCEngine
} // namespace XCEngine

View File

@@ -34,7 +34,7 @@ public:
virtual RHIBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual RHITexture* CreateTexture(const TextureDesc& desc) = 0;
virtual RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) = 0;
virtual RHISwapChain* CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) = 0;
virtual RHICommandList* CreateCommandList(const CommandListDesc& desc) = 0;
virtual RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) = 0;
virtual RHIShader* CreateShader(const ShaderCompileDesc& desc) = 0;
@@ -69,4 +69,4 @@ public:
};
} // namespace RHI
} // namespace XCEngine
} // namespace XCEngine

View File

@@ -78,24 +78,12 @@ bool D3D12Device::Initialize(const RHIDeviceDesc& desc) {
return false;
}
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
queueDesc.Priority = 0;
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.NodeMask = 0;
if (FAILED(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)))) {
return false;
}
QueryAdapterInfo();
m_initialized = true;
return true;
}
void D3D12Device::Shutdown() {
if (m_commandQueue) {
m_commandQueue.Reset();
}
if (m_device) {
m_device.Reset();
}
@@ -398,10 +386,19 @@ RHIFence* D3D12Device::CreateFence(const FenceDesc& desc) {
return nullptr;
}
RHISwapChain* D3D12Device::CreateSwapChain(const SwapChainDesc& desc) {
RHISwapChain* D3D12Device::CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) {
if (presentQueue == nullptr) {
return nullptr;
}
auto* nativeQueue = static_cast<ID3D12CommandQueue*>(presentQueue->GetNativeHandle());
if (nativeQueue == nullptr) {
return nullptr;
}
auto* swapChain = new D3D12SwapChain();
HWND hwnd = static_cast<HWND>(desc.windowHandle);
if (swapChain->Initialize(m_factory.Get(), m_commandQueue.Get(), hwnd,
if (swapChain->Initialize(m_factory.Get(), nativeQueue, hwnd,
desc.width, desc.height, desc.bufferCount)) {
return swapChain;
}

View File

@@ -334,13 +334,19 @@ RHITexture* OpenGLDevice::CreateTexture(const TextureDesc& desc) {
return texture;
}
RHISwapChain* OpenGLDevice::CreateSwapChain(const SwapChainDesc& desc) {
RHISwapChain* OpenGLDevice::CreateSwapChain(const SwapChainDesc& desc, RHICommandQueue* presentQueue) {
if (presentQueue == nullptr) {
return nullptr;
}
auto* swapChain = new OpenGLSwapChain();
HWND hwnd = static_cast<HWND>(desc.windowHandle);
if (hwnd) {
swapChain->Initialize(this, hwnd, desc.width, desc.height);
if (hwnd && swapChain->Initialize(this, hwnd, desc.width, desc.height)) {
return swapChain;
}
return swapChain;
delete swapChain;
return nullptr;
}
RHICommandList* OpenGLDevice::CreateCommandList(const CommandListDesc& desc) {
@@ -579,4 +585,4 @@ void* OpenGLDevice::GetNativeHandle() const {
}
} // namespace RHI
} // namespace XCEngine
} // namespace XCEngine