Skip to content

Commit

Permalink
GPU Testing Framework: added vk_compatibility option
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMostDiligent committed Feb 5, 2025
1 parent d67e526 commit e101e29
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 42 deletions.
2 changes: 1 addition & 1 deletion Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<VkDeviceQueueGlobalPriorityCreateInfoEXT> QueueGlobalPriority;
Expand Down
5 changes: 3 additions & 2 deletions Tests/GPUTestFramework/include/GPUTestingEnvironment.hpp
Original file line number Diff line number Diff line change
@@ -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");
Expand Down Expand Up @@ -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;
};
Expand Down
83 changes: 44 additions & 39 deletions Tests/GPUTestFramework/src/GPUTestingEnvironment.cpp
Original file line number Diff line number Diff line change
@@ -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");
Expand Down Expand Up @@ -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);
}
Expand All @@ -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<DisplayModeAttribs> DisplayModes = EnumerateDisplayModes(AdapterInfo, i);

const char* AdapterTypeStr = nullptr;
switch (AdapterInfo.Type)
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -341,21 +341,21 @@ 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);

EnumerateAdapters(pFactoryOpenGL, Version{},
[](const GraphicsAdapterInfo& AdapterInfo, Uint32 AdapterId) {
return std::vector<DisplayModeAttribs>{};
});
auto Window = CreateNativeWindow();
NativeWindow Window = CreateNativeWindow();

EngineGLCreateInfo EngineCI;

Expand All @@ -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);

Expand Down Expand Up @@ -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<Uint32>(IgnoreDebugMessages.size());
EngineCI.ppIgnoreDebugMessageNames = IgnoreDebugMessages.data();

Expand Down Expand Up @@ -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);

Expand All @@ -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) \
{ \
Expand All @@ -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<Uint8>(i), "Invalid context index");
if (i < m_NumImmediateContexts)
{
Expand All @@ -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: ";
Expand Down Expand Up @@ -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();
Expand All @@ -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",
Expand Down Expand Up @@ -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();
Expand All @@ -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();
Expand All @@ -724,9 +725,9 @@ RefCntAutoPtr<ITexture> 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<ITexture> pTexture;
m_pDevice->CreateTexture(TexDesc, pInitData ? &TexData : nullptr, &pTexture);
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -1041,15 +1046,15 @@ 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;
LOG_ERROR_AND_THROW("Requested device type (", GetRenderDeviceTypeString(TestEnvCI.deviceType),
") 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;
Expand Down

0 comments on commit e101e29

Please sign in to comment.