Skip to content

Commit 815f08a

Browse files
azhirnovTheMostDiligent
authored andcommitted
Vulkan: added EnableDeviceSimulation(), fixed queue priority
1 parent 2f8f225 commit 815f08a

File tree

7 files changed

+70
-50
lines changed

7 files changed

+70
-50
lines changed

Graphics/GraphicsEngineVulkan/include/VulkanUtilities/VulkanInstance.hpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,17 @@ class VulkanInstance : public std::enable_shared_from_this<VulkanInstance>
4444
VulkanInstance& operator = ( VulkanInstance&&) = delete;
4545
// clang-format on
4646

47-
static std::shared_ptr<VulkanInstance> Create(uint32_t ApiVersion,
48-
bool EnableValidation,
49-
uint32_t InstanceExtensionCount,
50-
const char* const* ppInstanceExtensionNames,
51-
VkAllocationCallbacks* pVkAllocator);
47+
struct CreateInfo
48+
{
49+
uint32_t ApiVersion = 0;
50+
bool EnableValidation = false;
51+
bool EnableDeviceSimulation = false;
52+
uint32_t InstanceExtensionCount = 0;
53+
const char* const* ppInstanceExtensionNames = nullptr;
54+
VkAllocationCallbacks* pVkAllocator = nullptr;
55+
};
56+
static std::shared_ptr<VulkanInstance> Create(const CreateInfo& CI);
57+
5258
~VulkanInstance();
5359

5460
std::shared_ptr<VulkanInstance> GetSharedPtr()
@@ -76,11 +82,7 @@ class VulkanInstance : public std::enable_shared_from_this<VulkanInstance>
7682
const std::vector<VkPhysicalDevice>& GetVkPhysicalDevices() const { return m_PhysicalDevices; }
7783

7884
private:
79-
VulkanInstance(uint32_t ApiVersion,
80-
bool EnableValidation,
81-
uint32_t InstanceExtensionCount,
82-
const char* const* ppInstanceExtensionNames,
83-
VkAllocationCallbacks* pVkAllocator);
85+
explicit VulkanInstance(const CreateInfo& CI);
8486

8587
bool m_DebugUtilsEnabled = false;
8688
VkAllocationCallbacks* const m_pVkAllocator;

Graphics/GraphicsEngineVulkan/interface/EngineFactoryVk.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ DILIGENT_BEGIN_INTERFACE(IEngineFactoryVk, IEngineFactory)
9898
const SwapChainDesc REF SwapChainDesc,
9999
const NativeWindow REF Window,
100100
ISwapChain** ppSwapChain) PURE;
101+
102+
/// Enable device simulation layer (if available).
103+
104+
/// Vulkan instance will be created with the device simulation layer.
105+
/// Use VK_DEVSIM_FILENAME environment variable to define the path to the .json file.
106+
///
107+
/// \remarks Use this function before calling EnumerateAdapters() and CreateDeviceAndContextsVk().
108+
VIRTUAL void METHOD(EnableDeviceSimulation)(THIS) PURE;
101109
};
102110
DILIGENT_END_INTERFACE
103111

@@ -109,6 +117,7 @@ DILIGENT_END_INTERFACE
109117

110118
# define IEngineFactoryVk_CreateDeviceAndContextsVk(This, ...) CALL_IFACE_METHOD(EngineFactoryVk, CreateDeviceAndContextsVk, This, __VA_ARGS__)
111119
# define IEngineFactoryVk_CreateSwapChainVk(This, ...) CALL_IFACE_METHOD(EngineFactoryVk, CreateSwapChainVk, This, __VA_ARGS__)
120+
# define IEngineFactoryVk_EnableDeviceSimulation(This) CALL_IFACE_METHOD(EngineFactoryVk, EnableDeviceSimulation, This)
112121

113122
// clang-format on
114123

Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class EngineFactoryVkImpl final : public EngineFactoryBase<IEngineFactoryVk>
105105
Uint32& NumAdapters,
106106
GraphicsAdapterInfo* Adapters) const override final;
107107

108+
virtual void DILIGENT_CALL_TYPE EnableDeviceSimulation() override final
109+
{
110+
m_EnableDeviceSimulation = true;
111+
}
112+
108113
#if PLATFORM_ANDROID
109114
virtual void InitAndroidFileSystem(struct ANativeActivity* NativeActivity,
110115
const char* NativeActivityClassName,
@@ -116,6 +121,8 @@ class EngineFactoryVkImpl final : public EngineFactoryBase<IEngineFactoryVk>
116121

117122
// To track that there is only one render device
118123
RefCntWeakPtr<IRenderDevice> m_wpDevice;
124+
125+
bool m_EnableDeviceSimulation = false;
119126
};
120127

121128

@@ -346,7 +353,7 @@ void EngineFactoryVkImpl::EnumerateAdapters(Version MinVersion,
346353
// Create instance with maximum available version.
347354
// If Volk is not enabled then version will be 1.0
348355
const uint32_t APIVersion = VK_MAKE_VERSION(0xFF, 0xFF, 0);
349-
auto Instance = VulkanUtilities::VulkanInstance::Create(APIVersion, false, 0, nullptr, nullptr);
356+
auto Instance = VulkanUtilities::VulkanInstance::Create({APIVersion, false, m_EnableDeviceSimulation, 0, nullptr, nullptr});
350357

351358
if (Adapters == nullptr)
352359
{
@@ -397,15 +404,24 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En
397404
EngineCI.GraphicsAPIVersion;
398405

399406
auto Instance = VulkanUtilities::VulkanInstance::Create(
400-
VK_MAKE_VERSION(GraphicsAPIVersion.Major, GraphicsAPIVersion.Minor, 0),
401-
EngineCI.EnableValidation,
402-
EngineCI.InstanceExtensionCount,
403-
EngineCI.ppInstanceExtensionNames,
404-
reinterpret_cast<VkAllocationCallbacks*>(EngineCI.pVkAllocator));
407+
{
408+
VK_MAKE_VERSION(GraphicsAPIVersion.Major, GraphicsAPIVersion.Minor, 0),
409+
EngineCI.EnableValidation,
410+
m_EnableDeviceSimulation,
411+
EngineCI.InstanceExtensionCount,
412+
EngineCI.ppInstanceExtensionNames,
413+
reinterpret_cast<VkAllocationCallbacks*>(EngineCI.pVkAllocator) //
414+
});
405415

406416
auto vkDevice = Instance->SelectPhysicalDevice(EngineCI.AdapterId);
407417
auto PhysicalDevice = VulkanUtilities::VulkanPhysicalDevice::Create(vkDevice, *Instance);
408418

419+
std::vector<const char*> DeviceExtensions =
420+
{
421+
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
422+
VK_KHR_MAINTENANCE1_EXTENSION_NAME // To allow negative viewport height
423+
};
424+
409425
// Enable device features if they are supported and throw an error if not supported, but required by user.
410426
const auto AdapterInfo = GetPhysicalDeviceGraphicsAdapterInfo(*PhysicalDevice);
411427
VerifyEngineCreateInfo(EngineCI, AdapterInfo);
@@ -455,8 +471,9 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En
455471
Priority = ContextInfo.Priority;
456472
}
457473

458-
if (Instance->IsExtensionEnabled(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME))
474+
if (PhysicalDevice->IsExtensionSupported(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME))
459475
{
476+
DeviceExtensions.push_back(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME);
460477
QueueGlobalPriority.resize(QueueInfos.size());
461478
for (Uint32 QInd = 0; QInd < QueueInfos.size(); ++QInd)
462479
{
@@ -538,12 +555,6 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& En
538555
vkEnabledFeatures.shaderStorageBufferArrayDynamicIndexing = vkDeviceFeatures.shaderStorageBufferArrayDynamicIndexing;
539556
vkEnabledFeatures.shaderStorageImageArrayDynamicIndexing = vkDeviceFeatures.shaderStorageImageArrayDynamicIndexing;
540557

541-
std::vector<const char*> DeviceExtensions =
542-
{
543-
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
544-
VK_KHR_MAINTENANCE1_EXTENSION_NAME // To allow negative viewport height
545-
};
546-
547558
using ExtensionFeatures = VulkanUtilities::VulkanPhysicalDevice::ExtensionFeatures;
548559
const ExtensionFeatures& DeviceExtFeatures = PhysicalDevice->GetExtFeatures();
549560
ExtensionFeatures EnabledExtFeats = {};

Graphics/GraphicsEngineVulkan/src/VulkanUtilities/VulkanInstance.cpp

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,14 @@ bool VulkanInstance::IsExtensionEnabled(const char* ExtensionName) const
7979
return false;
8080
}
8181

82-
std::shared_ptr<VulkanInstance> VulkanInstance::Create(uint32_t ApiVersion,
83-
bool EnableValidation,
84-
uint32_t InstanceExtensionCount,
85-
const char* const* ppInstanceExtensionNames,
86-
VkAllocationCallbacks* pVkAllocator)
82+
std::shared_ptr<VulkanInstance> VulkanInstance::Create(const CreateInfo& CI)
8783
{
88-
auto Instance = new VulkanInstance{ApiVersion, EnableValidation, InstanceExtensionCount, ppInstanceExtensionNames, pVkAllocator};
84+
auto Instance = new VulkanInstance{CI};
8985
return std::shared_ptr<VulkanInstance>{Instance};
9086
}
9187

92-
VulkanInstance::VulkanInstance(uint32_t ApiVersion,
93-
bool EnableValidation,
94-
uint32_t InstanceExtensionCount,
95-
const char* const* ppInstanceExtensionNames,
96-
VkAllocationCallbacks* pVkAllocator) :
97-
m_pVkAllocator{pVkAllocator}
88+
VulkanInstance::VulkanInstance(const CreateInfo& CI) :
89+
m_pVkAllocator{CI.pVkAllocator}
9890
{
9991
#if DILIGENT_USE_VOLK
10092
if (volkInitialize() != VK_SUCCESS)
@@ -161,21 +153,18 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion,
161153
InstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
162154
}
163155

164-
if (IsExtensionAvailable(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME))
156+
if (CI.ppInstanceExtensionNames != nullptr)
165157
{
166-
InstanceExtensions.push_back(VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME);
167-
}
168-
169-
if (ppInstanceExtensionNames != nullptr)
170-
{
171-
for (uint32_t ext = 0; ext < InstanceExtensionCount; ++ext)
172-
InstanceExtensions.push_back(ppInstanceExtensionNames[ext]);
158+
for (uint32_t ext = 0; ext < CI.InstanceExtensionCount; ++ext)
159+
InstanceExtensions.push_back(CI.ppInstanceExtensionNames[ext]);
173160
}
174161
else
175162
{
176-
if (InstanceExtensionCount != 0)
177-
LOG_ERROR_MESSAGE("Global extensions pointer is null while extensions count is ", InstanceExtensionCount,
163+
if (CI.InstanceExtensionCount != 0)
164+
{
165+
LOG_ERROR_MESSAGE("Global extensions pointer is null while extensions count is ", CI.InstanceExtensionCount,
178166
". Please initialize 'ppInstanceExtensionNames' member of EngineVkCreateInfo struct.");
167+
}
179168
}
180169

181170
for (const auto* ExtName : InstanceExtensions)
@@ -184,7 +173,7 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion,
184173
LOG_ERROR_AND_THROW("Required extension ", ExtName, " is not available");
185174
}
186175

187-
if (EnableValidation)
176+
if (CI.EnableValidation)
188177
{
189178
m_DebugUtilsEnabled = IsExtensionAvailable(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
190179
if (m_DebugUtilsEnabled)
@@ -197,6 +186,7 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion,
197186
}
198187
}
199188

189+
auto ApiVersion = CI.ApiVersion;
200190
#if DILIGENT_USE_VOLK
201191
if (vkEnumerateInstanceVersion != nullptr && ApiVersion > VK_API_VERSION_1_0)
202192
{
@@ -216,8 +206,8 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion,
216206

217207
std::vector<const char*> InstanceLayers;
218208

219-
// Set to 1 and define environment variable VK_DEVSIM_FILENAME to enable device simulation layer
220-
#if 0
209+
// Use VK_DEVSIM_FILENAME environment variable to define the simulation layer
210+
if (CI.EnableDeviceSimulation)
221211
{
222212
static const char* DeviceSimulationLayer = "VK_LAYER_LUNARG_device_simulation";
223213

@@ -227,9 +217,8 @@ VulkanInstance::VulkanInstance(uint32_t ApiVersion,
227217
InstanceLayers.push_back(DeviceSimulationLayer);
228218
}
229219
}
230-
#endif
231220

232-
if (EnableValidation)
221+
if (CI.EnableValidation)
233222
{
234223
for (size_t l = 0; l < _countof(VulkanUtilities::ValidationLayerNames); ++l)
235224
{

Tests/DiligentCoreAPITest/include/TestingEnvironment.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class TestingEnvironment : public ::testing::Environment
5656
Uint32 AdapterId = DEFAULT_ADAPTER_ID;
5757
Uint32 NumDeferredContexts = 4;
5858
bool ForceNonSeparablePrograms = false;
59+
bool EnableDeviceSimulation = false;
5960
};
6061
TestingEnvironment(const CreateInfo& CI, const SwapChainDesc& SCDesc);
6162

Tests/DiligentCoreAPITest/src/TestingEnvironment.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,10 @@ TestingEnvironment::TestingEnvironment(const CreateInfo& CI, const SwapChainDesc
386386
# endif
387387

388388
auto* pFactoryVk = GetEngineFactoryVk();
389+
390+
if (CI.EnableDeviceSimulation)
391+
pFactoryVk->EnableDeviceSimulation();
392+
389393
EnumerateAdapters(pFactoryVk, Version{});
390394
AddContext(COMMAND_QUEUE_TYPE_GRAPHICS, "Graphics", CI.AdapterId);
391395
AddContext(COMMAND_QUEUE_TYPE_COMPUTE, "Compute", CI.AdapterId);

Tests/DiligentCoreAPITest/src/main.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ int main(int argc, char** argv)
127127
{
128128
TestEnvCI.ForceNonSeparablePrograms = true;
129129
}
130+
else if (strcmp(arg, "--vk_dev_sim") == 0)
131+
{
132+
TestEnvCI.EnableDeviceSimulation = true;
133+
}
130134
}
131135

132136
if (TestEnvCI.deviceType == RENDER_DEVICE_TYPE_UNDEFINED)

0 commit comments

Comments
 (0)