Skip to content

Commit da19039

Browse files
committed
feat: add instance create info options for custom layers and layer settings
1 parent f31639f commit da19039

3 files changed

Lines changed: 47 additions & 2 deletions

File tree

include/misc/instance_create_info.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ namespace Anvil
3030
typedef std::function<void (Anvil::DebugMessageSeverityFlags in_severity,
3131
const char* in_message)> DebugCallbackFunction;
3232

33+
enum class LayerSettingType : uint32_t { Bool32 = 0, Int32, Int64, Uint32, Uint64, Float32, Float64, String };
34+
35+
struct LayerSetting {
36+
const char *pLayerName;
37+
const char *pSettingName;
38+
LayerSettingType type;
39+
uint32_t valueCount;
40+
const void *pValues;
41+
};
42+
3343
class InstanceCreateInfo
3444
{
3545
public:
@@ -59,6 +69,8 @@ namespace Anvil
5969
**/
6070
static Anvil::InstanceCreateInfoUniquePtr create(const std::string& in_app_name,
6171
const std::string& in_engine_name,
72+
std::vector<std::string> &&in_layers,
73+
std::vector<LayerSetting> &&in_layer_settings,
6274
Anvil::DebugCallbackFunction in_opt_validation_callback_proc,
6375
bool in_mt_safe,
6476
const std::vector<std::string>& in_opt_disallowed_instance_level_extensions = std::vector<std::string>() );
@@ -78,6 +90,10 @@ namespace Anvil
7890
return m_app_version;
7991
}
8092

93+
const std::vector<LayerSetting> &get_layer_settings() const { return m_layer_settings; }
94+
95+
const std::vector<std::string> &get_layers() const { return m_layers; }
96+
8197
const std::vector<std::string>& get_disallowed_instance_level_extensions() const
8298
{
8399
return m_disallowed_instance_level_extensions;
@@ -167,6 +183,8 @@ namespace Anvil
167183
/* Private functions */
168184
InstanceCreateInfo(const std::string& in_app_name,
169185
const std::string& in_engine_name,
186+
std::vector<std::string> &&in_layers,
187+
std::vector<LayerSetting> &&in_layer_settings,
170188
Anvil::DebugCallbackFunction in_opt_validation_callback_proc,
171189
bool in_mt_safe,
172190
const std::vector<std::string>& in_opt_disallowed_instance_level_extensions);
@@ -179,6 +197,8 @@ namespace Anvil
179197
std::vector<std::string> m_disallowed_instance_level_extensions;
180198
std::string m_engine_name;
181199
uint32_t m_engine_version;
200+
std::vector<std::string> m_layers;
201+
std::vector<LayerSetting> m_layer_settings;
182202
bool m_is_mt_safe;
183203
uint32_t m_n_memory_type_to_use_for_all_alocs;
184204
Anvil::DebugCallbackFunction m_validation_callback;

src/misc/instance_create_info.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
Anvil::InstanceCreateInfo::InstanceCreateInfo(const std::string& in_app_name,
2525
const std::string& in_engine_name,
26+
std::vector<std::string> &&in_layers,
27+
std::vector<LayerSetting> &&in_layer_settings,
2628
Anvil::DebugCallbackFunction in_opt_validation_callback_proc,
2729
bool in_mt_safe,
2830
const std::vector<std::string>& in_opt_disallowed_instance_level_extensions)
@@ -32,6 +34,8 @@ Anvil::InstanceCreateInfo::InstanceCreateInfo(const std::string& in
3234
m_disallowed_instance_level_extensions(in_opt_disallowed_instance_level_extensions),
3335
m_engine_name (in_engine_name),
3436
m_engine_version (0),
37+
m_layers (std::move(in_layers)),
38+
m_layer_settings (std::move(in_layer_settings)),
3539
m_is_mt_safe (in_mt_safe),
3640
m_n_memory_type_to_use_for_all_alocs (UINT32_MAX),
3741
m_validation_callback (in_opt_validation_callback_proc)
@@ -41,6 +45,8 @@ Anvil::InstanceCreateInfo::InstanceCreateInfo(const std::string& in
4145

4246
Anvil::InstanceCreateInfoUniquePtr Anvil::InstanceCreateInfo::create(const std::string& in_app_name,
4347
const std::string& in_engine_name,
48+
std::vector<std::string> &&in_layers,
49+
std::vector<LayerSetting> &&in_layer_settings,
4450
Anvil::DebugCallbackFunction in_opt_validation_callback_proc,
4551
bool in_mt_safe,
4652
const std::vector<std::string>& in_opt_disallowed_instance_level_extensions)
@@ -50,6 +56,8 @@ Anvil::InstanceCreateInfoUniquePtr Anvil::InstanceCreateInfo::create(const std::
5056
result_ptr.reset(
5157
new Anvil::InstanceCreateInfo(in_app_name,
5258
in_engine_name,
59+
std::move(in_layers),
60+
std::move(in_layer_settings),
5361
in_opt_validation_callback_proc,
5462
in_mt_safe,
5563
in_opt_disallowed_instance_level_extensions)

src/wrappers/instance.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ static bool g_instance_func_ptrs_inited = false;
3030
static std::mutex g_vk_func_ptr_init_mutex;
3131
static Anvil::LibraryUniquePtr g_vk_library_ptr;
3232

33-
3433
/** Please see header for specification */
3534
Anvil::Instance::Instance(Anvil::InstanceCreateInfoUniquePtr in_create_info_ptr)
3635
:MTSafetySupportProvider(in_create_info_ptr->is_mt_safe() ),
@@ -415,6 +414,7 @@ bool Anvil::Instance::init()
415414
uint32_t api_version_to_use = 0;
416415
std::vector<const char*> enabled_extensions_raw;
417416
std::vector<const char*> enabled_layers;
417+
std::vector<VkLayerSettingEXT> layerSettings;
418418
std::map<std::string, bool> extension_enabled_status;
419419
bool is_device_group_creation_supported = true;
420420
size_t n_instance_layers = 0;
@@ -430,6 +430,21 @@ bool Anvil::Instance::init()
430430
goto end;
431431
}
432432

433+
enabled_layers.reserve(m_create_info_ptr->get_layers().size());
434+
for(const auto &layer : m_create_info_ptr->get_layers())
435+
enabled_layers.push_back(layer.c_str());
436+
437+
layerSettings.reserve(m_create_info_ptr->get_layer_settings().size());
438+
for(const auto &setting : m_create_info_ptr->get_layer_settings()) {
439+
VkLayerSettingEXT vkSetting;
440+
vkSetting.pLayerName = setting.pLayerName;
441+
vkSetting.pSettingName = setting.pSettingName;
442+
vkSetting.valueCount = setting.valueCount;
443+
vkSetting.type = static_cast<VkLayerSettingTypeEXT>(setting.type);
444+
vkSetting.pValues = setting.pValues;
445+
layerSettings.push_back(vkSetting);
446+
}
447+
433448
/* Enumerate available layers */
434449
enumerate_instance_layers();
435450

@@ -668,11 +683,13 @@ bool Anvil::Instance::init()
668683
app_info.pNext = nullptr;
669684
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
670685

686+
const VkLayerSettingsCreateInfoEXT layer_settings_create_info {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, layerSettings.size(), layerSettings.data()};
687+
671688
create_info.enabledExtensionCount = static_cast<uint32_t>(enabled_extensions_raw.size() );
672689
create_info.enabledLayerCount = static_cast<uint32_t>(enabled_layers.size () );
673690
create_info.flags = 0;
674691
create_info.pApplicationInfo = &app_info;
675-
create_info.pNext = nullptr;
692+
create_info.pNext = &layer_settings_create_info;
676693
create_info.ppEnabledExtensionNames = (enabled_extensions_raw.size() > 0) ? &enabled_extensions_raw.at(0) : nullptr;
677694
create_info.ppEnabledLayerNames = (enabled_layers.size() > 0) ? &enabled_layers.at (0) : nullptr;
678695
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;

0 commit comments

Comments
 (0)