diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3c85d28b..78e1be16 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -38,7 +38,7 @@ add_subdirectory(memory) add_subdirectory(threading) add_subdirectory(debug) add_subdirectory(D3D12) -add_subdirectory(D3D12_engine/test) +add_subdirectory(RHI/D3D12) # ============================================================ # Test Summary diff --git a/tests/D3D12_engine/test/test_device.cpp b/tests/D3D12_engine/test/test_device.cpp deleted file mode 100644 index 9e1a92f4..00000000 --- a/tests/D3D12_engine/test/test_device.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "fixtures/D3D12TestFixture.h" - -TEST_F(D3D12TestFixture, Device_CreateDevice_Success) { - ASSERT_NE(GetDevice(), nullptr); -} - -TEST_F(D3D12TestFixture, Device_GetCommandQueue_Success) { - ASSERT_NE(GetCommandQueue(), nullptr); -} diff --git a/tests/D3D12_engine/test/test_fence.cpp b/tests/D3D12_engine/test/test_fence.cpp deleted file mode 100644 index 0f0f06c8..00000000 --- a/tests/D3D12_engine/test/test_fence.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "fixtures/D3D12TestFixture.h" - -TEST_F(D3D12TestFixture, Fence_CreateFence_Success) { - ASSERT_NE(GetDevice(), nullptr); -} diff --git a/tests/D3D12_engine/test/CMakeLists.txt b/tests/RHI/D3D12/CMakeLists.txt similarity index 100% rename from tests/D3D12_engine/test/CMakeLists.txt rename to tests/RHI/D3D12/CMakeLists.txt diff --git a/tests/D3D12_engine/test/fixtures/D3D12TestFixture.cpp b/tests/RHI/D3D12/fixtures/D3D12TestFixture.cpp similarity index 100% rename from tests/D3D12_engine/test/fixtures/D3D12TestFixture.cpp rename to tests/RHI/D3D12/fixtures/D3D12TestFixture.cpp diff --git a/tests/D3D12_engine/test/fixtures/D3D12TestFixture.h b/tests/RHI/D3D12/fixtures/D3D12TestFixture.h similarity index 100% rename from tests/D3D12_engine/test/fixtures/D3D12TestFixture.h rename to tests/RHI/D3D12/fixtures/D3D12TestFixture.h diff --git a/tests/D3D12_engine/test/test_buffer.cpp b/tests/RHI/D3D12/test_buffer.cpp similarity index 100% rename from tests/D3D12_engine/test/test_buffer.cpp rename to tests/RHI/D3D12/test_buffer.cpp diff --git a/tests/D3D12_engine/test/test_command_allocator.cpp b/tests/RHI/D3D12/test_command_allocator.cpp similarity index 100% rename from tests/D3D12_engine/test/test_command_allocator.cpp rename to tests/RHI/D3D12/test_command_allocator.cpp diff --git a/tests/D3D12_engine/test/test_command_list.cpp b/tests/RHI/D3D12/test_command_list.cpp similarity index 100% rename from tests/D3D12_engine/test/test_command_list.cpp rename to tests/RHI/D3D12/test_command_list.cpp diff --git a/tests/D3D12_engine/test/test_command_queue.cpp b/tests/RHI/D3D12/test_command_queue.cpp similarity index 100% rename from tests/D3D12_engine/test/test_command_queue.cpp rename to tests/RHI/D3D12/test_command_queue.cpp diff --git a/tests/D3D12_engine/test/test_descriptor_heap.cpp b/tests/RHI/D3D12/test_descriptor_heap.cpp similarity index 100% rename from tests/D3D12_engine/test/test_descriptor_heap.cpp rename to tests/RHI/D3D12/test_descriptor_heap.cpp diff --git a/tests/RHI/D3D12/test_device.cpp b/tests/RHI/D3D12/test_device.cpp new file mode 100644 index 00000000..bdceaaef --- /dev/null +++ b/tests/RHI/D3D12/test_device.cpp @@ -0,0 +1,62 @@ +#include "fixtures/D3D12TestFixture.h" +#include +#include +#include + +TEST_F(D3D12TestFixture, Device_CreateDevice_Success) { + ASSERT_NE(GetDevice(), nullptr); +} + +TEST_F(D3D12TestFixture, Device_GetCommandQueue_Success) { + ASSERT_NE(GetCommandQueue(), nullptr); +} + +TEST_F(D3D12TestFixture, Device_CheckFeatureLevel) { + static const D3D_FEATURE_LEVEL requestedLevels[] = { D3D_FEATURE_LEVEL_12_0 }; + D3D12_FEATURE_DATA_FEATURE_LEVELS featureLevels = {}; + featureLevels.NumFeatureLevels = 1; + featureLevels.pFeatureLevelsRequested = requestedLevels; + + HRESULT hr = GetDevice()->CheckFeatureSupport(D3D12_FEATURE_FEATURE_LEVELS, &featureLevels, sizeof(featureLevels)); + ASSERT_HRESULT_SUCCEEDED(hr); + EXPECT_EQ(featureLevels.MaxSupportedFeatureLevel, D3D_FEATURE_LEVEL_12_0); +} + +TEST_F(D3D12TestFixture, Device_GetDescriptorHandleIncrementSize) { + UINT cbvSrvUavSize = GetDevice()->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + EXPECT_GT(cbvSrvUavSize, 0); + + UINT samplerSize = GetDevice()->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + EXPECT_GT(samplerSize, 0); + + UINT rtvSize = GetDevice()->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + EXPECT_GT(rtvSize, 0); + + UINT dsvSize = GetDevice()->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); + EXPECT_GT(dsvSize, 0); +} + +TEST_F(D3D12TestFixture, Device_CheckShaderModelSupport) { + D3D12_FEATURE_DATA_SHADER_MODEL shaderModel = {}; + shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_0; + + HRESULT hr = GetDevice()->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &shaderModel, sizeof(shaderModel)); + ASSERT_HRESULT_SUCCEEDED(hr); + EXPECT_GE(shaderModel.HighestShaderModel, D3D_SHADER_MODEL_6_0); +} + +TEST_F(D3D12TestFixture, Device_CheckResourceBindingTier) { + D3D12_FEATURE_DATA_D3D12_OPTIONS options = {}; + + HRESULT hr = GetDevice()->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)); + ASSERT_HRESULT_SUCCEEDED(hr); + EXPECT_GE(options.ResourceBindingTier, D3D12_RESOURCE_BINDING_TIER_1); +} + +TEST_F(D3D12TestFixture, Device_CheckTiledResourcesTier) { + D3D12_FEATURE_DATA_D3D12_OPTIONS options = {}; + + HRESULT hr = GetDevice()->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)); + ASSERT_HRESULT_SUCCEEDED(hr); + EXPECT_GE(options.TiledResourcesTier, D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED); +} diff --git a/tests/RHI/D3D12/test_fence.cpp b/tests/RHI/D3D12/test_fence.cpp new file mode 100644 index 00000000..da7ca8d7 --- /dev/null +++ b/tests/RHI/D3D12/test_fence.cpp @@ -0,0 +1,97 @@ +#include "fixtures/D3D12TestFixture.h" +#include + +TEST_F(D3D12TestFixture, Fence_CreateFence_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_GetCompletedValue_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_SignalAndWait) { + 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_SetEventOnCompletion) { + 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_MultipleSignals) { + 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); +} diff --git a/tests/D3D12_engine/test/test_pipeline_state.cpp b/tests/RHI/D3D12/test_pipeline_state.cpp similarity index 100% rename from tests/D3D12_engine/test/test_pipeline_state.cpp rename to tests/RHI/D3D12/test_pipeline_state.cpp diff --git a/tests/D3D12_engine/test/test_root_signature.cpp b/tests/RHI/D3D12/test_root_signature.cpp similarity index 100% rename from tests/D3D12_engine/test/test_root_signature.cpp rename to tests/RHI/D3D12/test_root_signature.cpp diff --git a/tests/D3D12_engine/test/test_shader.cpp b/tests/RHI/D3D12/test_shader.cpp similarity index 100% rename from tests/D3D12_engine/test/test_shader.cpp rename to tests/RHI/D3D12/test_shader.cpp diff --git a/tests/D3D12_engine/test/test_texture.cpp b/tests/RHI/D3D12/test_texture.cpp similarity index 100% rename from tests/D3D12_engine/test/test_texture.cpp rename to tests/RHI/D3D12/test_texture.cpp diff --git a/tests/D3D12_engine/test/test_views.cpp b/tests/RHI/D3D12/test_views.cpp similarity index 100% rename from tests/D3D12_engine/test/test_views.cpp rename to tests/RHI/D3D12/test_views.cpp