From e101e2984cf3015ed5f9f41a93d42c2f9c7b5387 Mon Sep 17 00:00:00 2001 From: assiduous Date: Sun, 2 Feb 2025 13:18:38 -0800 Subject: [PATCH] GPU Testing Framework: added vk_compatibility option --- .../src/EngineFactoryVk.cpp | 2 +- .../include/GPUTestingEnvironment.hpp | 5 +- .../src/GPUTestingEnvironment.cpp | 83 ++++++++++--------- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp b/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp index 92f589a16..e10a8af64 100644 --- a/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp @@ -753,7 +753,7 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En const GraphicsAdapterInfo AdapterInfo = GetPhysicalDeviceGraphicsAdapterInfo(*PhysicalDevice); VerifyEngineCreateInfo(EngineCI, AdapterInfo); const DeviceFeatures EnabledFeatures = EnableDeviceFeatures(AdapterInfo.Features, EngineCI.Features); - const DeviceFeaturesVk AdapterFeaturesVk = PhysicalDeviceFeaturesToDeviceFeaturesVk(PhysicalDevice->GetExtFeatures(), DEVICE_FEATURE_STATE_ENABLED); + const DeviceFeaturesVk AdapterFeaturesVk = PhysicalDeviceFeaturesToDeviceFeaturesVk(PhysicalDevice->GetExtFeatures(), DEVICE_FEATURE_STATE_OPTIONAL); const DeviceFeaturesVk EnabledFeaturesVk = EnableDeviceFeaturesVk(AdapterFeaturesVk, EngineCI.FeaturesVk); std::vector QueueGlobalPriority; diff --git a/Tests/GPUTestFramework/include/GPUTestingEnvironment.hpp b/Tests/GPUTestFramework/include/GPUTestingEnvironment.hpp index d80787101..98b51a99c 100644 --- a/Tests/GPUTestFramework/include/GPUTestingEnvironment.hpp +++ b/Tests/GPUTestFramework/include/GPUTestingEnvironment.hpp @@ -1,5 +1,5 @@ /* - * Copyright 2019-2023 Diligent Graphics LLC + * Copyright 2019-2025 Diligent Graphics LLC * Copyright 2015-2019 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -60,7 +60,8 @@ class GPUTestingEnvironment : public TestingEnvironment Uint32 NumDeferredContexts = 4; bool EnableDeviceSimulation = false; - DeviceFeatures Features{DEVICE_FEATURE_STATE_OPTIONAL}; + DeviceFeatures Features{DEVICE_FEATURE_STATE_OPTIONAL}; + DeviceFeaturesVk FeaturesVk{DEVICE_FEATURE_STATE_OPTIONAL}; DebugMessageCallbackType MessageCallback = TestingEnvironment::MessageCallback; }; diff --git a/Tests/GPUTestFramework/src/GPUTestingEnvironment.cpp b/Tests/GPUTestFramework/src/GPUTestingEnvironment.cpp index a29e47c2f..1d0b10728 100644 --- a/Tests/GPUTestFramework/src/GPUTestingEnvironment.cpp +++ b/Tests/GPUTestFramework/src/GPUTestingEnvironment.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2019-2024 Diligent Graphics LLC + * Copyright 2019-2025 Diligent Graphics LLC * Copyright 2015-2019 Egor Yusov * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -146,7 +146,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap pFactory->EnumerateAdapters(MinVersion, NumAdapters, Adapters.data()); // Validate adapter info - for (auto& Adapter : Adapters) + for (GraphicsAdapterInfo& Adapter : Adapters) { VERIFY_EXPR(Adapter.NumQueues >= 1); } @@ -155,8 +155,8 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap LOG_INFO_MESSAGE("Found ", Adapters.size(), " compatible ", (Adapters.size() == 1 ? "adapter" : "adapters")); for (Uint32 i = 0; i < Adapters.size(); ++i) { - const auto& AdapterInfo = Adapters[i]; - const auto DisplayModes = EnumerateDisplayModes(AdapterInfo, i); + const GraphicsAdapterInfo& AdapterInfo = Adapters[i]; + const std::vector DisplayModes = EnumerateDisplayModes(AdapterInfo, i); const char* AdapterTypeStr = nullptr; switch (AdapterInfo.Type) @@ -185,11 +185,11 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap if (AdapterId >= Adapters.size()) AdapterId = 0; - constexpr auto QueueMask = COMMAND_QUEUE_TYPE_PRIMARY_MASK; - auto* Queues = Adapters[AdapterId].Queues; + constexpr COMMAND_QUEUE_TYPE QueueMask = COMMAND_QUEUE_TYPE_PRIMARY_MASK; + CommandQueueInfo* Queues = Adapters[AdapterId].Queues; for (Uint32 q = 0, Count = Adapters[AdapterId].NumQueues; q < Count; ++q) { - auto& CurQueue = Queues[q]; + CommandQueueInfo& CurQueue = Queues[q]; if (CurQueue.MaxDeviceContexts == 0) continue; @@ -231,14 +231,14 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap { # if ENGINE_DLL // Load the dll and import GetEngineFactoryD3D11() function - auto GetEngineFactoryD3D11 = LoadGraphicsEngineD3D11(); + GetEngineFactoryD3D11Type GetEngineFactoryD3D11 = LoadGraphicsEngineD3D11(); if (GetEngineFactoryD3D11 == nullptr) { LOG_ERROR_AND_THROW("Failed to load the engine"); } # endif - auto* pFactoryD3D11 = GetEngineFactoryD3D11(); + IEngineFactoryD3D11* pFactoryD3D11 = GetEngineFactoryD3D11(); pFactoryD3D11->SetMessageCallback(EnvCI.MessageCallback); pFactoryD3D11->SetBreakOnError(false); @@ -275,13 +275,13 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap { # if ENGINE_DLL // Load the dll and import GetEngineFactoryD3D12() function - auto GetEngineFactoryD3D12 = LoadGraphicsEngineD3D12(); + GetEngineFactoryD3D12Type GetEngineFactoryD3D12 = LoadGraphicsEngineD3D12(); if (GetEngineFactoryD3D12 == nullptr) { LOG_ERROR_AND_THROW("Failed to load the engine"); } # endif - auto* pFactoryD3D12 = GetEngineFactoryD3D12(); + IEngineFactoryD3D12* pFactoryD3D12 = GetEngineFactoryD3D12(); pFactoryD3D12->SetMessageCallback(EnvCI.MessageCallback); pFactoryD3D12->SetBreakOnError(false); @@ -341,13 +341,13 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap # if EXPLICITLY_LOAD_ENGINE_GL_DLL // Declare function pointer // Load the dll and import GetEngineFactoryOpenGL() function - auto GetEngineFactoryOpenGL = LoadGraphicsEngineOpenGL(); + GetEngineFactoryOpenGLType GetEngineFactoryOpenGL = LoadGraphicsEngineOpenGL(); if (GetEngineFactoryOpenGL == nullptr) { LOG_ERROR_AND_THROW("Failed to load the engine"); } # endif - auto* pFactoryOpenGL = GetEngineFactoryOpenGL(); + IEngineFactoryOpenGL* pFactoryOpenGL = GetEngineFactoryOpenGL(); pFactoryOpenGL->SetMessageCallback(EnvCI.MessageCallback); pFactoryOpenGL->SetBreakOnError(false); @@ -355,7 +355,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap [](const GraphicsAdapterInfo& AdapterInfo, Uint32 AdapterId) { return std::vector{}; }); - auto Window = CreateNativeWindow(); + NativeWindow Window = CreateNativeWindow(); EngineGLCreateInfo EngineCI; @@ -378,14 +378,14 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap { # if EXPLICITLY_LOAD_ENGINE_VK_DLL // Load the dll and import GetEngineFactoryVk() function - auto GetEngineFactoryVk = LoadGraphicsEngineVk(); + GetEngineFactoryVkType GetEngineFactoryVk = LoadGraphicsEngineVk(); if (GetEngineFactoryVk == nullptr) { LOG_ERROR_AND_THROW("Failed to load the engine"); } # endif - auto* pFactoryVk = GetEngineFactoryVk(); + IEngineFactoryVk* pFactoryVk = GetEngineFactoryVk(); pFactoryVk->SetMessageCallback(EnvCI.MessageCallback); pFactoryVk->SetBreakOnError(false); @@ -422,6 +422,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap //EngineCI.DeviceLocalMemoryReserveSize = 32 << 20; //EngineCI.HostVisibleMemoryReserveSize = 48 << 20; EngineCI.Features = EnvCI.Features; + EngineCI.FeaturesVk = EnvCI.FeaturesVk; EngineCI.IgnoreDebugMessageCount = static_cast(IgnoreDebugMessages.size()); EngineCI.ppIgnoreDebugMessageNames = IgnoreDebugMessages.data(); @@ -470,13 +471,13 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap case RENDER_DEVICE_TYPE_WEBGPU: { # if EXPLICITLY_LOAD_ENGINE_WEBGPU_DLL - auto GetEngineFactoryWebGPU = LoadGraphicsEngineWebGPU(); + GetEngineFactoryWebGPUType GetEngineFactoryWebGPU = LoadGraphicsEngineWebGPU(); if (GetEngineFactoryWebGPU == nullptr) { LOG_ERROR_AND_THROW("Failed to load the engine"); } # endif - auto* pFactoryWGPU = GetEngineFactoryWebGPU(); + IEngineFactoryWebGPU* pFactoryWGPU = GetEngineFactoryWebGPU(); pFactoryWGPU->SetMessageCallback(MessageCallback); pFactoryWGPU->SetBreakOnError(false); @@ -493,7 +494,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap } { - const auto& ActualFeats = m_pDevice->GetDeviceInfo().Features; + const DeviceFeatures& ActualFeats = m_pDevice->GetDeviceInfo().Features; #define CHECK_FEATURE_STATE(Feature) \ if (EnvCI.Features.Feature != DEVICE_FEATURE_STATE_OPTIONAL && EnvCI.Features.Feature != ActualFeats.Feature) \ { \ @@ -515,7 +516,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap if (ppContexts[i] == nullptr) LOG_ERROR_AND_THROW("Context must not be null"); - const auto CtxDesc = ppContexts[i]->GetDesc(); + const DeviceContextDesc CtxDesc = ppContexts[i]->GetDesc(); VERIFY(CtxDesc.ContextId == static_cast(i), "Invalid context index"); if (i < m_NumImmediateContexts) { @@ -531,16 +532,16 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap for (size_t i = 0; i < ContextCI.size(); ++i) { - const auto& CtxCI = ContextCI[i]; - const auto CtxDesc = m_pDeviceContexts[i]->GetDesc(); + const ImmediateContextCreateInfo& CtxCI = ContextCI[i]; + const DeviceContextDesc CtxDesc = m_pDeviceContexts[i]->GetDesc(); if (CtxCI.QueueId != CtxDesc.QueueId) LOG_ERROR_MESSAGE("QueueId mismatch"); if (i != CtxDesc.ContextId) LOG_ERROR_MESSAGE("CommandQueueId mismatch"); } - const auto& AdapterInfo = m_pDevice->GetAdapterInfo(); - std::string AdapterInfoStr; + const GraphicsAdapterInfo& AdapterInfo = m_pDevice->GetAdapterInfo(); + std::string AdapterInfoStr; AdapterInfoStr = "Adapter description: "; AdapterInfoStr += AdapterInfo.Description; AdapterInfoStr += ". Vendor: "; @@ -593,7 +594,7 @@ GPUTestingEnvironment::GPUTestingEnvironment(const CreateInfo& EnvCI, const Swap // Create archiver factory { # if EXPLICITLY_LOAD_ARCHIVER_FACTORY_DLL - auto GetArchiverFactory = LoadArchiverFactory(); + GetArchiverFactoryType GetArchiverFactory = LoadArchiverFactory(); if (GetArchiverFactory != nullptr) { m_ArchiverFactory = GetArchiverFactory(); @@ -611,14 +612,14 @@ GPUTestingEnvironment::~GPUTestingEnvironment() { for (Uint32 i = 0; i < GetNumImmediateContexts(); ++i) { - auto* pCtx = GetDeviceContext(i); + IDeviceContext* pCtx = GetDeviceContext(i); pCtx->Flush(); pCtx->FinishFrame(); if (i == 0) { - const auto& Stats = pCtx->GetStats(); - const auto& CmdCounters = Stats.CommandCounters; + const DeviceContextStats& Stats = pCtx->GetStats(); + const DeviceContextCommandCounters& CmdCounters = Stats.CommandCounters; LOG_INFO_MESSAGE( "Device context stats" "\n Command counters", @@ -691,7 +692,7 @@ void GPUTestingEnvironment::ReleaseResources() // later causing out-of-memory error. for (Uint32 i = 0; i < GetNumImmediateContexts(); ++i) { - auto* pCtx = GetDeviceContext(i); + IDeviceContext* pCtx = GetDeviceContext(i); pCtx->Flush(); pCtx->FinishFrame(); pCtx->WaitForIdle(); @@ -703,7 +704,7 @@ void GPUTestingEnvironment::Reset() { for (Uint32 i = 0; i < GetNumImmediateContexts(); ++i) { - auto* pCtx = GetDeviceContext(i); + IDeviceContext* pCtx = GetDeviceContext(i); pCtx->Flush(); pCtx->FinishFrame(); pCtx->InvalidateState(); @@ -724,9 +725,9 @@ RefCntAutoPtr GPUTestingEnvironment::CreateTexture(const char* Name, T TexDesc.Width = Width; TexDesc.Height = Height; - const auto FmtAttribs = GetTextureFormatAttribs(Fmt); - TextureSubResData Mip0Data{pInitData, FmtAttribs.ComponentSize * FmtAttribs.NumComponents * Width}; - TextureData TexData{&Mip0Data, 1}; + const TextureFormatAttribs& FmtAttribs = GetTextureFormatAttribs(Fmt); + TextureSubResData Mip0Data{pInitData, FmtAttribs.ComponentSize * FmtAttribs.NumComponents * Width}; + TextureData TexData{&Mip0Data, 1}; RefCntAutoPtr pTexture; m_pDevice->CreateTexture(TexDesc, pInitData ? &TexData : nullptr, &pTexture); @@ -868,14 +869,14 @@ static bool ParseFeatureState(const char* Arg, DeviceFeatures& Features) DeviceFeatures::Enumerate(Features, [Arg](const char* FeatName, DEVICE_FEATURE_STATE& State) // { - const auto NameLen = strlen(FeatName); + const size_t NameLen = strlen(FeatName); if (strncmp(FeatName, Arg, NameLen) != 0) return true; if (Arg[NameLen] != '=') return true; // Continue processing - const auto Value = Arg + NameLen + 1; + const char* Value = Arg + NameLen + 1; static const std::string Off = "Off"; static const std::string On = "On"; @@ -907,7 +908,7 @@ GPUTestingEnvironment* GPUTestingEnvironment::Initialize(int argc, char** argv) { const std::string AdapterArgName = "--adapter="; - const auto* arg = argv[i]; + const char* arg = argv[i]; if (strcmp(arg, "--mode=d3d11") == 0) { TestEnvCI.deviceType = RENDER_DEVICE_TYPE_D3D11; @@ -953,7 +954,7 @@ GPUTestingEnvironment* GPUTestingEnvironment::Initialize(int argc, char** argv) } else if (AdapterArgName.compare(0, AdapterArgName.length(), arg, AdapterArgName.length()) == 0) { - const auto* AdapterStr = arg + AdapterArgName.length(); + const char* AdapterStr = arg + AdapterArgName.length(); if (strcmp(AdapterStr, "sw") == 0) TestEnvCI.AdapterType = ADAPTER_TYPE_SOFTWARE; else @@ -971,6 +972,10 @@ GPUTestingEnvironment* GPUTestingEnvironment::Initialize(int argc, char** argv) { TestEnvCI.EnableDeviceSimulation = true; } + else if (strcmp(arg, "--vk_compatibility") == 0) + { + TestEnvCI.FeaturesVk = DeviceFeaturesVk{DEVICE_FEATURE_STATE_DISABLED}; + } else if (ParseFeatureState(arg, TestEnvCI.Features)) { // Feature state has been updated by ParseFeatureState @@ -1041,7 +1046,7 @@ GPUTestingEnvironment* GPUTestingEnvironment::Initialize(int argc, char** argv) LOG_ERROR_AND_THROW("Unsupported device type"); } - const auto DeviceType = pEnv->GetDevice()->GetDeviceInfo().Type; + const RENDER_DEVICE_TYPE DeviceType = pEnv->GetDevice()->GetDeviceInfo().Type; if (DeviceType != TestEnvCI.deviceType) { delete pEnv; @@ -1049,7 +1054,7 @@ GPUTestingEnvironment* GPUTestingEnvironment::Initialize(int argc, char** argv) ") does not match the type of the device that was created (", GetRenderDeviceTypeString(DeviceType), ")."); } - const auto AdapterType = pEnv->GetDevice()->GetAdapterInfo().Type; + const ADAPTER_TYPE AdapterType = pEnv->GetDevice()->GetAdapterInfo().Type; if (TestEnvCI.AdapterType != ADAPTER_TYPE_UNKNOWN && TestEnvCI.AdapterType != AdapterType) { delete pEnv;