Mercurial > games > semicongine
comparison src/buffer.nim @ 18:90e117952f74
add: basic vertex buffer functionality
author | Sam <sam@basx.dev> |
---|---|
date | Thu, 05 Jan 2023 01:16:48 +0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
17:b40466fa446a | 18:90e117952f74 |
---|---|
1 import ./vulkan | |
2 import ./vulkan_helpers | |
3 | |
4 type | |
5 BufferType* = enum | |
6 VertexBuffer = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | |
7 Buffer* = object | |
8 device*: VkDevice | |
9 vkBuffer*: VkBuffer | |
10 size*: uint64 | |
11 memoryRequirements*: VkMemoryRequirements | |
12 memory*: VkDeviceMemory | |
13 | |
14 proc findMemoryType(buffer: Buffer, physicalDevice: VkPhysicalDevice, properties: VkMemoryPropertyFlags): uint32 = | |
15 var physicalProperties: VkPhysicalDeviceMemoryProperties | |
16 vkGetPhysicalDeviceMemoryProperties(physicalDevice, addr(physicalProperties)) | |
17 | |
18 for i in 0'u32 ..< physicalProperties.memoryTypeCount: | |
19 if bool(buffer.memoryRequirements.memoryTypeBits and (1'u32 shl i)) and (uint32(physicalProperties.memoryTypes[i].propertyFlags) and uint32(properties)) == uint32(properties): | |
20 return i | |
21 | |
22 proc InitBuffer*(device: VkDevice, physicalDevice: VkPhysicalDevice, size: uint64, bufferType: BufferType): Buffer = | |
23 result.device = device | |
24 result.size = size | |
25 var bufferInfo = VkBufferCreateInfo( | |
26 sType: VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, | |
27 size: VkDeviceSize(result.size), | |
28 usage: VkBufferUsageFlags(bufferType), | |
29 sharingMode: VK_SHARING_MODE_EXCLUSIVE, | |
30 | |
31 ) | |
32 checkVkResult vkCreateBuffer(result.device, addr(bufferInfo), nil, addr(result.vkBuffer)) | |
33 vkGetBufferMemoryRequirements(result.device, result.vkBuffer, addr(result.memoryRequirements)) | |
34 | |
35 var allocInfo = VkMemoryAllocateInfo( | |
36 sType: VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, | |
37 allocationSize: result.memoryRequirements.size, | |
38 memoryTypeIndex: result.findMemoryType( | |
39 physicalDevice, | |
40 VkMemoryPropertyFlags(uint32(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) or uint32(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) | |
41 ) | |
42 ) | |
43 checkVkResult result.device.vkAllocateMemory(addr(allocInfo), nil, addr(result.memory)) | |
44 checkVkResult result.device.vkBindBufferMemory(result.vkBuffer, result.memory, VkDeviceSize(0)) | |
45 | |
46 | |
47 template withMapping*(buffer: Buffer, data: pointer, body: untyped): untyped = | |
48 checkVkResult buffer.device.vkMapMemory(buffer.memory, offset=VkDeviceSize(0), VkDeviceSize(buffer.size), VkMemoryMapFlags(0), addr(data)); | |
49 body | |
50 buffer.device.vkUnmapMemory(buffer.memory); | |
51 | |
52 | |
53 proc `=copy`(a: var Buffer, b: Buffer){.error.} | |
54 | |
55 proc `=destroy`*(buffer: var Buffer) = | |
56 vkDestroyBuffer(buffer.device, buffer.vkBuffer, nil) | |
57 vkFreeMemory(buffer.device, buffer.memory, nil); |