#include "fixtures/D3D12TestFixture.h" #include "XCEngine/RHI/D3D12/D3D12Fence.h" #include using namespace XCEngine::RHI; TEST_F(D3D12TestFixture, Fence_Create_Success) { ASSERT_NE(GetDevice(), nullptr); FenceDesc desc = {}; desc.initialValue = 0; desc.flags = 0; RHIFence* fence = GetDevice()->CreateFence(desc); ASSERT_NE(fence, nullptr); fence->Shutdown(); delete fence; } TEST_F(D3D12TestFixture, Fence_Get_CompletedValue_Initial) { FenceDesc desc = {}; desc.initialValue = 0; desc.flags = 0; RHIFence* fence = GetDevice()->CreateFence(desc); ASSERT_NE(fence, nullptr); EXPECT_EQ(fence->GetCompletedValue(), 0); fence->Shutdown(); delete fence; } TEST_F(D3D12TestFixture, Fence_Signal_Wait) { FenceDesc desc = {}; desc.initialValue = 0; desc.flags = 0; RHIFence* fence = GetDevice()->CreateFence(desc); ASSERT_NE(fence, nullptr); const UINT64 fenceValue = 100; GetCommandQueue()->Signal(fence, fenceValue); fence->Wait(fenceValue); EXPECT_EQ(fence->GetCompletedValue(), fenceValue); fence->Shutdown(); delete fence; } TEST_F(D3D12TestFixture, Fence_Set_EventOnCompletion) { FenceDesc desc = {}; desc.initialValue = 0; desc.flags = 0; auto* fence = new D3D12Fence(); ASSERT_TRUE(fence->Initialize(GetDevice()->GetDevice(), 200)); const UINT64 fenceValue = 200; GetCommandQueue()->Signal(fence, fenceValue); HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr); ASSERT_NE(eventHandle, nullptr); fence->GetFence()->SetEventOnCompletion(fenceValue, eventHandle); DWORD waitResult = WaitForSingleObject(eventHandle, 1000); EXPECT_EQ(waitResult, WAIT_OBJECT_0); EXPECT_EQ(fence->GetCompletedValue(), fenceValue); CloseHandle(eventHandle); fence->Shutdown(); delete fence; } TEST_F(D3D12TestFixture, Fence_Signal_Multiple) { FenceDesc desc = {}; desc.initialValue = 0; desc.flags = 0; RHIFence* fence = GetDevice()->CreateFence(desc); ASSERT_NE(fence, nullptr); const UINT64 value1 = 1; const UINT64 value2 = 2; const UINT64 value3 = 3; GetCommandQueue()->Signal(fence, value1); GetCommandQueue()->Signal(fence, value2); GetCommandQueue()->Signal(fence, value3); auto* d3d12fence = static_cast(fence); HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr); ASSERT_NE(eventHandle, nullptr); d3d12fence->GetFence()->SetEventOnCompletion(value3, eventHandle); DWORD waitResult = WaitForSingleObject(eventHandle, 1000); EXPECT_EQ(waitResult, WAIT_OBJECT_0); EXPECT_EQ(fence->GetCompletedValue(), value3); CloseHandle(eventHandle); fence->Shutdown(); delete fence; }