Mercurial > games > semicongine
comparison semiconginev2/old/vulkan/device.nim @ 1218:56781cc0fc7c compiletime-tests
did: renamge main package
author | sam <sam@basx.dev> |
---|---|
date | Wed, 17 Jul 2024 21:01:37 +0700 |
parents | semicongine/old/vulkan/device.nim@a3eb305bcac2 |
children |
comparison
equal
deleted
inserted
replaced
1217:f819a874058f | 1218:56781cc0fc7c |
---|---|
1 import std/sequtils | |
2 import std/options | |
3 import std/tables | |
4 | |
5 import ../core | |
6 import ./instance | |
7 import ./physicaldevice | |
8 | |
9 type | |
10 Device* = object | |
11 physicalDevice*: PhysicalDevice | |
12 vk*: VkDevice | |
13 queues*: Table[QueueFamily, Queue] | |
14 enabledFeatures*: VkPhysicalDeviceFeatures | |
15 Queue* = object | |
16 vk*: VkQueue | |
17 family*: QueueFamily | |
18 presentation: bool | |
19 graphics: bool | |
20 | |
21 proc `$`*(device: Device): string = | |
22 "Device: vk=" & $device.vk | |
23 | |
24 proc CreateDevice*( | |
25 instance: Instance, | |
26 physicalDevice: PhysicalDevice, | |
27 enabledExtensions: seq[string], | |
28 queueFamilies: seq[QueueFamily], | |
29 ): Device = | |
30 assert instance.vk.Valid | |
31 assert physicalDevice.vk.Valid | |
32 assert queueFamilies.len > 0 | |
33 | |
34 result.physicalDevice = physicalDevice | |
35 # TODO: allowing support for physical devices without hasUniformBufferStandardLayout | |
36 # would require us to ship different shaders, so we don't support standard layout | |
37 # if that will be added, check the function vulkan/shaders.nim:glslUniforms and update accordingly | |
38 # let hasUniformBufferStandardLayout = "VK_KHR_uniform_buffer_standard_layout" in physicalDevice.getExtensions() | |
39 let hasUniformBufferStandardLayout = false | |
40 | |
41 var allExtensions = enabledExtensions & @["VK_KHR_swapchain"] | |
42 if hasUniformBufferStandardLayout: | |
43 allExtensions.add "VK_KHR_uniform_buffer_standard_layout" | |
44 for extension in allExtensions: | |
45 instance.vk.loadExtension(extension) | |
46 | |
47 var | |
48 enabledExtensionsC = allocCStringArray(allExtensions) | |
49 priority = 1'f32 | |
50 var deviceQueues: Table[QueueFamily, VkDeviceQueueCreateInfo] | |
51 for family in queueFamilies: | |
52 deviceQueues[family] = VkDeviceQueueCreateInfo( | |
53 sType: VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, | |
54 queueFamilyIndex: family.index, | |
55 queueCount: 1, | |
56 pQueuePriorities: addr(priority), | |
57 ) | |
58 var queueList = deviceQueues.values.toSeq | |
59 | |
60 var uniformBufferLayoutFeature = VkPhysicalDeviceUniformBufferStandardLayoutFeatures( | |
61 stype: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, | |
62 uniformBufferStandardLayout: true, | |
63 ) | |
64 var features2 = VkPhysicalDeviceFeatures2( | |
65 stype: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, | |
66 features: result.enabledFeatures, | |
67 pnext: if hasUniformBufferStandardLayout: addr uniformBufferLayoutFeature else: nil, | |
68 ) | |
69 var createInfo = VkDeviceCreateInfo( | |
70 sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, | |
71 queueCreateInfoCount: uint32(queueList.len), | |
72 pQueueCreateInfos: queueList.ToCPointer, | |
73 enabledLayerCount: 0, | |
74 ppEnabledLayerNames: nil, | |
75 enabledExtensionCount: uint32(allExtensions.len), | |
76 ppEnabledExtensionNames: enabledExtensionsC, | |
77 pEnabledFeatures: nil, | |
78 pnext: addr features2, | |
79 ) | |
80 | |
81 checkVkResult vkCreateDevice( | |
82 physicalDevice = physicalDevice.vk, | |
83 pCreateInfo = addr createInfo, | |
84 pAllocator = nil, | |
85 pDevice = addr result.vk | |
86 ) | |
87 deallocCStringArray(enabledExtensionsC) | |
88 for family in deviceQueues.keys: | |
89 var queue: VkQueue | |
90 vkGetDeviceQueue(result.vk, family.index, 0, addr queue) | |
91 result.queues[family] = Queue(vk: queue, family: family, presentation: family.CanDoPresentation(physicalDevice.surface), graphics: family.CanDoGraphics()) | |
92 | |
93 func FirstGraphicsQueue*(device: Device): Option[Queue] = | |
94 assert device.vk.Valid | |
95 for family, queue in device.queues: | |
96 if queue.graphics: | |
97 return some(queue) | |
98 | |
99 proc FirstPresentationQueue*(device: Device): Option[Queue] = | |
100 assert device.vk.Valid | |
101 for family, queue in device.queues: | |
102 if queue.presentation: | |
103 return some(queue) | |
104 | |
105 proc Destroy*(device: var Device) = | |
106 assert device.vk.Valid | |
107 device.vk.vkDestroyDevice(nil) | |
108 device.vk.Reset() |