#include "fixtures/D3D12TestFixture.h" #include TEST_F(D3D12TestFixture, Fence_Create_Success) { ASSERT_NE(GetDevice(), nullptr); ComPtr fence; HRESULT hr = GetDevice()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); ASSERT_HRESULT_SUCCEEDED(hr); ASSERT_NE(fence.Get(), nullptr); } TEST_F(D3D12TestFixture, Fence_Get_CompletedValue_Initial) { ComPtr fence; HRESULT hr = GetDevice()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); ASSERT_HRESULT_SUCCEEDED(hr); EXPECT_EQ(fence->GetCompletedValue(), 0); } TEST_F(D3D12TestFixture, Fence_Signal_Wait) { ComPtr fence; HRESULT hr = GetDevice()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); ASSERT_HRESULT_SUCCEEDED(hr); const UINT64 fenceValue = 100; hr = GetCommandQueue()->Signal(fence.Get(), fenceValue); ASSERT_HRESULT_SUCCEEDED(hr); HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr); ASSERT_NE(eventHandle, nullptr); hr = fence->SetEventOnCompletion(fenceValue, eventHandle); ASSERT_HRESULT_SUCCEEDED(hr); DWORD waitResult = WaitForSingleObject(eventHandle, 1000); EXPECT_EQ(waitResult, WAIT_OBJECT_0); EXPECT_EQ(fence->GetCompletedValue(), fenceValue); CloseHandle(eventHandle); } TEST_F(D3D12TestFixture, Fence_Set_EventOnCompletion) { ComPtr fence; HRESULT hr = GetDevice()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); ASSERT_HRESULT_SUCCEEDED(hr); const UINT64 fenceValue = 200; hr = GetCommandQueue()->Signal(fence.Get(), fenceValue); ASSERT_HRESULT_SUCCEEDED(hr); HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr); ASSERT_NE(eventHandle, nullptr); hr = fence->SetEventOnCompletion(fenceValue, eventHandle); ASSERT_HRESULT_SUCCEEDED(hr); DWORD waitResult = WaitForSingleObject(eventHandle, 1000); EXPECT_EQ(waitResult, WAIT_OBJECT_0); EXPECT_EQ(fence->GetCompletedValue(), fenceValue); CloseHandle(eventHandle); } TEST_F(D3D12TestFixture, Fence_Signal_Multiple) { ComPtr fence; HRESULT hr = GetDevice()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); ASSERT_HRESULT_SUCCEEDED(hr); const UINT64 value1 = 1; const UINT64 value2 = 2; const UINT64 value3 = 3; hr = GetCommandQueue()->Signal(fence.Get(), value1); ASSERT_HRESULT_SUCCEEDED(hr); hr = GetCommandQueue()->Signal(fence.Get(), value2); ASSERT_HRESULT_SUCCEEDED(hr); hr = GetCommandQueue()->Signal(fence.Get(), value3); ASSERT_HRESULT_SUCCEEDED(hr); HANDLE eventHandle = CreateEvent(nullptr, FALSE, FALSE, nullptr); ASSERT_NE(eventHandle, nullptr); hr = fence->SetEventOnCompletion(value3, eventHandle); ASSERT_HRESULT_SUCCEEDED(hr); DWORD waitResult = WaitForSingleObject(eventHandle, 1000); EXPECT_EQ(waitResult, WAIT_OBJECT_0); EXPECT_EQ(fence->GetCompletedValue(), value3); CloseHandle(eventHandle); }