test: 添加 D3D12 引擎测试框架
- 修复 engine/CMakeLists.txt 路径问题 - 在 tests/D3D12_engine/test/ 创建测试框架 - 添加基础测试夹具 D3D12TestFixture - 添加 13 个基础测试用例 - 所有测试通过
This commit is contained in:
77
tests/D3D12_engine/test/fixtures/D3D12TestFixture.cpp
vendored
Normal file
77
tests/D3D12_engine/test/fixtures/D3D12TestFixture.cpp
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "D3D12TestFixture.h"
|
||||
|
||||
ComPtr<ID3D12Device> D3D12TestFixture::mDevice;
|
||||
|
||||
void D3D12TestFixture::SetUpTestSuite() {
|
||||
HRESULT hr = D3D12CreateDevice(
|
||||
nullptr,
|
||||
D3D_FEATURE_LEVEL_12_0,
|
||||
IID_PPV_ARGS(&mDevice)
|
||||
);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
GTEST_SKIP() << "Failed to create D3D12 device";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void D3D12TestFixture::TearDownTestSuite() {
|
||||
mDevice.Reset();
|
||||
}
|
||||
|
||||
void D3D12TestFixture::SetUp() {
|
||||
if (!mDevice) {
|
||||
GTEST_SKIP() << "D3D12 device not available";
|
||||
return;
|
||||
}
|
||||
|
||||
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
|
||||
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
|
||||
|
||||
HRESULT hr = mDevice->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&mCommandQueue));
|
||||
if (FAILED(hr)) {
|
||||
GTEST_SKIP() << "Failed to create command queue";
|
||||
return;
|
||||
}
|
||||
|
||||
hr = mDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&mCommandAllocator));
|
||||
if (FAILED(hr)) {
|
||||
GTEST_SKIP() << "Failed to create command allocator";
|
||||
return;
|
||||
}
|
||||
|
||||
hr = mDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, mCommandAllocator.Get(), nullptr, IID_PPV_ARGS(&mCommandList));
|
||||
if (FAILED(hr)) {
|
||||
GTEST_SKIP() << "Failed to create command list";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void D3D12TestFixture::TearDown() {
|
||||
if (mCommandQueue) {
|
||||
WaitForGPU();
|
||||
}
|
||||
mCommandList.Reset();
|
||||
mCommandAllocator.Reset();
|
||||
mCommandQueue.Reset();
|
||||
}
|
||||
|
||||
void D3D12TestFixture::WaitForGPU() {
|
||||
if (!mCommandQueue || !mDevice) return;
|
||||
|
||||
ComPtr<ID3D12Fence> fence;
|
||||
UINT64 fenceValue = 1;
|
||||
|
||||
HRESULT hr = mDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));
|
||||
if (SUCCEEDED(hr)) {
|
||||
mCommandQueue->Signal(fence.Get(), fenceValue);
|
||||
if (fence->GetCompletedValue() < fenceValue) {
|
||||
HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
||||
if (eventHandle) {
|
||||
fence->SetEventOnCompletion(fenceValue, eventHandle);
|
||||
WaitForSingleObject(eventHandle, INFINITE);
|
||||
CloseHandle(eventHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
36
tests/D3D12_engine/test/fixtures/D3D12TestFixture.h
vendored
Normal file
36
tests/D3D12_engine/test/fixtures/D3D12TestFixture.h
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <d3d12.h>
|
||||
#include <dxgi1_4.h>
|
||||
#include <wrl/client.h>
|
||||
|
||||
#include "XCEngine/RHI/D3D12/D3D12Device.h"
|
||||
#include "XCEngine/RHI/D3D12/D3D12CommandQueue.h"
|
||||
#include "XCEngine/RHI/D3D12/D3D12CommandAllocator.h"
|
||||
#include "XCEngine/RHI/D3D12/D3D12CommandList.h"
|
||||
#include "XCEngine/RHI/D3D12/D3D12Fence.h"
|
||||
|
||||
using namespace Microsoft::WRL;
|
||||
|
||||
class D3D12TestFixture : public ::testing::Test {
|
||||
protected:
|
||||
static void SetUpTestSuite();
|
||||
static void TearDownTestSuite();
|
||||
|
||||
void SetUp() override;
|
||||
void TearDown() override;
|
||||
|
||||
ID3D12Device* GetDevice() { return mDevice.Get(); }
|
||||
ID3D12CommandQueue* GetCommandQueue() { return mCommandQueue.Get(); }
|
||||
ID3D12CommandList* GetCommandList() { return mCommandList.Get(); }
|
||||
ID3D12CommandAllocator* GetCommandAllocator() { return mCommandAllocator.Get(); }
|
||||
|
||||
void WaitForGPU();
|
||||
|
||||
private:
|
||||
static ComPtr<ID3D12Device> mDevice;
|
||||
ComPtr<ID3D12CommandQueue> mCommandQueue;
|
||||
ComPtr<ID3D12CommandAllocator> mCommandAllocator;
|
||||
ComPtr<ID3D12CommandList> mCommandList;
|
||||
};
|
||||
Reference in New Issue
Block a user