30
|
1 import ./vulkan
|
|
2 import ./vulkan_helpers
|
|
3 import ./math/vector
|
|
4 import ./math/matrix
|
|
5 import ./buffer
|
|
6
|
|
7 type
|
|
8 DescriptorType = SomeNumber|Vec|Mat
|
|
9 Descriptor*[T:DescriptorType] = object
|
|
10 value*: T
|
|
11
|
|
12 proc createUniformDescriptorLayout*(device: VkDevice, shaderStage: VkShaderStageFlags, binding: uint32): VkDescriptorSetLayout =
|
|
13 var
|
|
14 layoutbinding = VkDescriptorSetLayoutBinding(
|
|
15 binding: binding,
|
|
16 descriptorType: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
|
17 descriptorCount: 1,
|
|
18 stageFlags: shaderStage,
|
|
19 pImmutableSamplers: nil,
|
|
20 )
|
|
21 layoutInfo = VkDescriptorSetLayoutCreateInfo(
|
|
22 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
|
23 bindingCount: 1,
|
|
24 pBindings: addr(layoutbinding)
|
|
25 )
|
|
26 checkVkResult device.vkCreateDescriptorSetLayout(addr(layoutInfo), nil, addr(result))
|
|
27
|
|
28 proc createUniformBuffers*[nBuffers: static int, T](device: VkDevice, physicalDevice: VkPhysicalDevice): array[nBuffers, Buffer] =
|
|
29 let size = sizeof(T)
|
|
30 for i in 0 ..< nBuffers:
|
|
31 var buffer = InitBuffer(
|
|
32 device,
|
|
33 physicalDevice,
|
|
34 uint64(size),
|
|
35 {UniformBuffer},
|
|
36 {VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT},
|
|
37 persistentMapping=true,
|
|
38 )
|
|
39 result[i] = buffer
|