Mercurial > games > semicongine
comparison semiconginev2/old/vulkan/commandbuffer.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/commandbuffer.nim@a3eb305bcac2 |
| children |
comparison
equal
deleted
inserted
replaced
| 1217:f819a874058f | 1218:56781cc0fc7c |
|---|---|
| 1 import ../core | |
| 2 import ./device | |
| 3 import ./physicaldevice | |
| 4 import ./syncing | |
| 5 | |
| 6 type | |
| 7 CommandBufferPool* = object | |
| 8 device: Device | |
| 9 vk*: VkCommandPool | |
| 10 family*: QueueFamily | |
| 11 buffers*: seq[VkCommandBuffer] | |
| 12 | |
| 13 proc CreateCommandBufferPool*(device: Device, family: QueueFamily, nBuffers: int): CommandBufferPool = | |
| 14 assert device.vk.Valid | |
| 15 var createInfo = VkCommandPoolCreateInfo( | |
| 16 sType: VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, | |
| 17 flags: toBits [VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT], | |
| 18 queueFamilyIndex: family.index, | |
| 19 ) | |
| 20 result.family = family | |
| 21 result.device = device | |
| 22 checkVkResult device.vk.vkCreateCommandPool(addr createInfo, nil, addr result.vk) | |
| 23 | |
| 24 var allocInfo = VkCommandBufferAllocateInfo( | |
| 25 sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, | |
| 26 commandPool: result.vk, | |
| 27 level: VK_COMMAND_BUFFER_LEVEL_PRIMARY, | |
| 28 commandBufferCount: uint32(nBuffers), | |
| 29 ) | |
| 30 result.buffers = newSeq[VkCommandBuffer](nBuffers) | |
| 31 checkVkResult device.vk.vkAllocateCommandBuffers(addr allocInfo, result.buffers.ToCPointer) | |
| 32 | |
| 33 proc PipelineBarrier*( | |
| 34 commandBuffer: VkCommandBuffer, | |
| 35 srcStages: openArray[VkPipelineStageFlagBits], | |
| 36 dstStages: openArray[VkPipelineStageFlagBits], | |
| 37 memoryBarriers: openArray[VkMemoryBarrier] = [], | |
| 38 bufferMemoryBarriers: openArray[VkBufferMemoryBarrier] = [], | |
| 39 imageBarriers: openArray[VkImageMemoryBarrier] = [], | |
| 40 ) = | |
| 41 | |
| 42 vkCmdPipelineBarrier( | |
| 43 commandBuffer, | |
| 44 srcStageMask = srcStages.toBits, | |
| 45 dstStageMask = dstStages.toBits, | |
| 46 dependencyFlags = VkDependencyFlags(0), | |
| 47 memoryBarrierCount = uint32(memoryBarriers.len), | |
| 48 pMemoryBarriers = memoryBarriers.ToCPointer, | |
| 49 bufferMemoryBarrierCount = uint32(bufferMemoryBarriers.len), | |
| 50 pBufferMemoryBarriers = bufferMemoryBarriers.ToCPointer, | |
| 51 imageMemoryBarrierCount = uint32(imageBarriers.len), | |
| 52 pImageMemoryBarriers = imageBarriers.ToCPointer, | |
| 53 ) | |
| 54 | |
| 55 | |
| 56 template WithSingleUseCommandBuffer*(device: Device, queue: Queue, commandBuffer, body: untyped): untyped = | |
| 57 # TODO? This is super slow, because we call vkQueueWaitIdle | |
| 58 block: | |
| 59 assert device.vk.Valid | |
| 60 assert queue.vk.Valid | |
| 61 | |
| 62 var | |
| 63 commandBufferPool = CreateCommandBufferPool(device, queue.family, 1) | |
| 64 commandBuffer = commandBufferPool.buffers[0] | |
| 65 beginInfo = VkCommandBufferBeginInfo( | |
| 66 sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, | |
| 67 flags: VkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT), | |
| 68 ) | |
| 69 checkVkResult commandBuffer.vkBeginCommandBuffer(addr beginInfo) | |
| 70 | |
| 71 block: | |
| 72 body | |
| 73 | |
| 74 checkVkResult commandBuffer.vkEndCommandBuffer() | |
| 75 var submitInfo = VkSubmitInfo( | |
| 76 sType: VK_STRUCTURE_TYPE_SUBMIT_INFO, | |
| 77 commandBufferCount: 1, | |
| 78 pCommandBuffers: addr commandBuffer, | |
| 79 ) | |
| 80 checkVkResult queue.vk.vkQueueSubmit(1, addr submitInfo, VkFence(0)) | |
| 81 checkVkResult queue.vk.vkQueueWaitIdle() | |
| 82 commandBufferPool.Destroy() | |
| 83 | |
| 84 | |
| 85 proc Destroy*(commandpool: var CommandBufferPool) = | |
| 86 assert commandpool.device.vk.Valid | |
| 87 assert commandpool.vk.Valid | |
| 88 commandpool.device.vk.vkDestroyCommandPool(commandpool.vk, nil) | |
| 89 commandpool.vk.Reset | |
| 90 |
