import vulkan
, ../utils/lets
, vkTypes
, vulkan_record
proc createLogicalDevice*( rec: var Vulkan_Record
) =
rec.qfi = QueueFamily( graphics: 0
, transfer: 0
, compute: 0
, sparse: 0
, usingSparse: false
, usingCompute: false
)
var
queuePriority = 0f
# qTypes = bitor( VK_QUEUE_GRAPHICS_BIT.int
# , VK_QUEUE_TRANSFER_BIT.int
# , VK_QUEUE_COMPUTE_BIT.int
# , VK_QUEUE_SPARSE_BINDING_BIT.int
# )
queueCreateInfos = newSeq[VkDeviceQueueCreateInfo]()
let deviceQueueCreateInfo = newVkDeviceQueueCreateInfo( sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
, queueFamilyIndex = rec.qfi.graphics
, queueCount = 1
, pQueuePriorities = queuePriority.addr
)
queueCreateInfos.add deviceQueueCreateInfo
var
deviceFeatures: VkPhysicalDeviceFeatures
deviceExts = allocCStringArray(coreDeviceExts)
vkGetPhysicalDeviceFeatures(rec.gpu.handle, addr deviceFeatures)
var deviceCreateInfo = newVkDeviceCreateInfo( pQueueCreateInfos = queueCreateInfos[0].addr
, queueCreateInfoCount = queueCreateInfos.len.uint32
, pEnabledFeatures = deviceFeatures.addr
, enabledExtensionCount = 1 #coreDeviceExts.len
, enabledLayerCount = 0
, ppEnabledLayerNames = nil
, ppEnabledExtensionNames = deviceExts
)
if vkCreateDevice( rec.gpu.handle
, deviceCreateInfo.addr
, nil
, addr rec.logical_device
) != VKSuccess: quit "failed to create logical device"
proc create_logical_command_pool*(rec: var Vulkan_Record) =
var
poolInfo = VkCommandPoolCreateInfo( sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
, queueFamilyIndex: rec.qfi.graphics
# , flags: VkCommandPoolCreateFlags VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT # optional
)
if vkCreateCommandPool( rec.logical_device
, poolInfo.addr
, nil
, addr rec.command_pool
) != VK_SUCCESS:
quit("failed to create command pool")