MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ create_logical_device()

bool MayaFlux::Core::VKDevice::create_logical_device ( vk::Instance  instance,
const GraphicsBackendInfo backend_info 
)
private

Create the logical device and retrieve queue handles.

Parameters
instanceVulkan instance
backend_infoGraphics backend configuration
Returns
true if logical device creation succeeded

Definition at line 240 of file VKDevice.cpp.

241{
242 if (!m_queue_families.graphics_family.has_value()) {
244 std::source_location::current(),
245 "No graphics queue family found!");
246 }
247
248 std::set<uint32_t> unique_queue_families;
249 unique_queue_families.insert(m_queue_families.graphics_family.value());
250
251 if (m_queue_families.compute_family.has_value()) {
252 unique_queue_families.insert(m_queue_families.compute_family.value());
253 }
254
256 unique_queue_families.insert(m_queue_families.transfer_family.value());
257 }
258
259 std::vector<vk::DeviceQueueCreateInfo> queue_create_infos;
260 float queue_priority = 1.0F;
261
262 for (uint32_t queue_family : unique_queue_families) {
263 vk::DeviceQueueCreateInfo queue_create_info {};
264 queue_create_info.queueFamilyIndex = queue_family;
265 queue_create_info.queueCount = 1;
266 queue_create_info.pQueuePriorities = &queue_priority;
267 queue_create_infos.push_back(queue_create_info);
268 }
269
270 vk::PhysicalDeviceFeatures device_features {};
271 device_features.samplerAnisotropy = backend_info.required_features.sampler_anisotropy;
272 device_features.geometryShader = backend_info.required_features.geometry_shaders;
273 device_features.tessellationShader = backend_info.required_features.tessellation_shaders;
274 device_features.multiViewport = backend_info.required_features.multi_viewport;
275 device_features.fillModeNonSolid = backend_info.required_features.fill_mode_non_solid;
276
277 vk::PhysicalDeviceFeatures2 features2 {};
278 features2.features = device_features;
279
280 vk::PhysicalDeviceVulkan13Features vulkan_13_features {};
281 vulkan_13_features.dynamicRendering = VK_TRUE;
282 vulkan_13_features.synchronization2 = VK_TRUE;
283
284 std::vector<const char*> device_extensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
285
286#ifdef MAYAFLUX_PLATFORM_MACOS
287 auto available_exts = m_physical_device.enumerateDeviceExtensionProperties();
288 bool has_portability = std::ranges::any_of(available_exts,
289 [](const auto& ext) {
290 return strcmp(ext.extensionName, "VK_KHR_portability_subset") == 0;
291 });
292
293 if (has_portability) {
294 device_extensions.push_back("VK_KHR_portability_subset");
295 }
296#else
297 vk::PhysicalDeviceMeshShaderFeaturesEXT mesh_shader_features {};
299 device_extensions.push_back(VK_EXT_MESH_SHADER_EXTENSION_NAME);
300
301 mesh_shader_features.taskShader = VK_TRUE;
302 mesh_shader_features.meshShader = VK_TRUE;
303
304 vulkan_13_features.pNext = &mesh_shader_features;
305 }
306#endif
307
308 features2.pNext = &vulkan_13_features;
309
310 for (const auto& ext : backend_info.required_extensions) {
311 device_extensions.push_back(ext.c_str());
312 }
313
314 vk::DeviceCreateInfo create_info {};
315 create_info.queueCreateInfoCount = static_cast<uint32_t>(queue_create_infos.size());
316 create_info.pQueueCreateInfos = queue_create_infos.data();
317 create_info.pNext = &features2;
318 create_info.enabledExtensionCount = static_cast<uint32_t>(device_extensions.size());
319 create_info.ppEnabledExtensionNames = device_extensions.data();
320
321 try {
322 m_logical_device = m_physical_device.createDevice(create_info);
323 VULKAN_HPP_DEFAULT_DISPATCHER.init(m_logical_device);
324
325 } catch (const std::exception& e) {
327 std::source_location::current(),
328 "Failed to create logical device: {}", e.what());
329 }
330
332
333 if (backend_info.enable_compute_queue && m_queue_families.compute_family.has_value()) {
335 } else {
337 }
338
339 if (backend_info.enable_transfer_queue && m_queue_families.transfer_family.has_value()) {
341 } else {
343 }
344
345 return true;
346}
bool m_supports_mesh_shaders
Whether the device supports mesh shaders.
Definition VKDevice.hpp:151
vk::PhysicalDevice m_physical_device
Selected physical device (GPU)
Definition VKDevice.hpp:115
vk::Queue m_compute_queue
Compute queue handle.
Definition VKDevice.hpp:119
vk::Queue m_transfer_queue
Transfer queue handle.
Definition VKDevice.hpp:120
vk::Device m_logical_device
Logical device handle.
Definition VKDevice.hpp:116
vk::Queue m_graphics_queue
Graphics queue handle.
Definition VKDevice.hpp:118
QueueFamilyIndices m_queue_families
Indices of required queue families.
Definition VKDevice.hpp:122
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
void error_rethrow(Component component, Context context, std::source_location location=std::source_location::current(), std::string_view additional_context="")
Catch and log an exception, then rethrow it.
@ Core
Core engine, backend, subsystems.
std::optional< uint32_t > transfer_family
Definition VKDevice.hpp:16
std::optional< uint32_t > graphics_family
Definition VKDevice.hpp:14
std::optional< uint32_t > compute_family
Definition VKDevice.hpp:15

References MayaFlux::Core::QueueFamilyIndices::compute_family, MayaFlux::Journal::Core, MayaFlux::Core::GraphicsBackendInfo::enable_compute_queue, MayaFlux::Core::GraphicsBackendInfo::enable_transfer_queue, MayaFlux::Core::GraphicsBackendInfo::fill_mode_non_solid, MayaFlux::Core::GraphicsBackendInfo::geometry_shaders, MayaFlux::Core::QueueFamilyIndices::graphics_family, MayaFlux::Journal::GraphicsBackend, m_compute_queue, m_graphics_queue, m_logical_device, m_physical_device, m_queue_families, m_supports_mesh_shaders, m_transfer_queue, MayaFlux::Core::GraphicsBackendInfo::multi_viewport, MayaFlux::Core::GraphicsBackendInfo::required_extensions, MayaFlux::Core::GraphicsBackendInfo::required_features, MayaFlux::Core::GraphicsBackendInfo::sampler_anisotropy, MayaFlux::Core::GraphicsBackendInfo::tessellation_shaders, and MayaFlux::Core::QueueFamilyIndices::transfer_family.

Referenced by initialize().

+ Here is the caller graph for this function: