Mercurial > games > semicongine
comparison semiconginev2/old/vulkan/renderpass.nim.orig @ 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/renderpass.nim.orig@a3eb305bcac2 |
children |
comparison
equal
deleted
inserted
replaced
1217:f819a874058f | 1218:56781cc0fc7c |
---|---|
1 import ../core | |
2 import ./framebuffer | |
3 | |
4 proc CreateRenderPass*( | |
5 device: VkDevice, | |
6 format: VkFormat, | |
7 ): VkRenderPass = | |
8 | |
9 var | |
10 attachments = @[VkAttachmentDescription( | |
11 format: format, | |
12 samples: VK_SAMPLE_COUNT_1_BIT, | |
13 loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, | |
14 storeOp: VK_ATTACHMENT_STORE_OP_STORE, | |
15 stencilLoadOp: VK_ATTACHMENT_LOAD_OP_DONT_CARE, | |
16 stencilStoreOp: VK_ATTACHMENT_STORE_OP_DONT_CARE, | |
17 initialLayout: VK_IMAGE_LAYOUT_UNDEFINED, | |
18 finalLayout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, | |
19 )] | |
20 # dependencies seems to be optional, TODO: benchmark difference | |
21 dependencies = @[VkSubpassDependency( | |
22 srcSubpass: VK_SUBPASS_EXTERNAL, | |
23 dstSubpass: 0, | |
24 srcStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
25 srcAccessMask: VkAccessFlags(0), | |
26 dstStageMask: toBits [VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT], | |
27 dstAccessMask: toBits [VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT], | |
28 )] | |
29 outputs = @[ | |
30 VkAttachmentReference( | |
31 attachment: 0, | |
32 layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | |
33 ) | |
34 ] | |
35 | |
36 var subpassesList = [ | |
37 VkSubpassDescription( | |
38 flags: VkSubpassDescriptionFlags(0), | |
39 pipelineBindPoint: VK_PIPELINE_BIND_POINT_GRAPHICS, | |
40 inputAttachmentCount: 0, | |
41 pInputAttachments: nil, | |
42 colorAttachmentCount: uint32(outputs.len), | |
43 pColorAttachments: outputs.ToCPointer, | |
44 pResolveAttachments: nil, | |
45 pDepthStencilAttachment: nil, | |
46 preserveAttachmentCount: 0, | |
47 pPreserveAttachments: nil, | |
48 ) | |
49 ] | |
50 | |
51 var createInfo = VkRenderPassCreateInfo( | |
52 sType: VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, | |
53 attachmentCount: uint32(attachments.len), | |
54 pAttachments: attachments.ToCPointer, | |
55 subpassCount: uint32(subpassesList.len), | |
56 pSubpasses: subpassesList.ToCPointer, | |
57 dependencyCount: uint32(dependencies.len), | |
58 pDependencies: dependencies.ToCPointer, | |
59 ) | |
60 checkVkResult device.vkCreateRenderPass(addr(createInfo), nil, addr(result)) | |
61 | |
62 proc BeginRenderCommands*(commandBuffer: VkCommandBuffer, renderpass: VkRenderPass, framebuffer: Framebuffer, oneTimeSubmit: bool, clearColor: Vec4f) = | |
63 assert commandBuffer.Valid | |
64 assert framebuffer.vk.Valid | |
65 let | |
66 w = framebuffer.dimension.x | |
67 h = framebuffer.dimension.y | |
68 | |
69 var clearColors = [VkClearValue(color: VkClearColorValue(float32: clearColor))] | |
70 var | |
71 beginInfo = VkCommandBufferBeginInfo( | |
72 sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, | |
73 pInheritanceInfo: nil, | |
74 flags: if oneTimeSubmit: VkCommandBufferUsageFlags(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) else: VkCommandBufferUsageFlags(0), | |
75 ) | |
76 renderPassInfo = VkRenderPassBeginInfo( | |
77 sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, | |
78 renderPass: renderpass, | |
79 framebuffer: framebuffer.vk, | |
80 renderArea: VkRect2D( | |
81 offset: VkOffset2D(x: 0, y: 0), | |
82 extent: VkExtent2D(width: w, height: h), | |
83 ), | |
84 clearValueCount: uint32(clearColors.len), | |
85 pClearValues: clearColors.ToCPointer(), | |
86 ) | |
87 viewport = VkViewport( | |
88 x: 0.0, | |
89 y: 0.0, | |
90 width: (float)w, | |
91 height: (float)h, | |
92 minDepth: 0.0, | |
93 maxDepth: 1.0, | |
94 ) | |
95 scissor = VkRect2D( | |
96 offset: VkOffset2D(x: 0, y: 0), | |
97 extent: VkExtent2D(width: w, height: h) | |
98 ) | |
99 checkVkResult commandBuffer.vkResetCommandBuffer(VkCommandBufferResetFlags(0)) | |
100 checkVkResult commandBuffer.vkBeginCommandBuffer(addr(beginInfo)) | |
101 commandBuffer.vkCmdBeginRenderPass(addr(renderPassInfo), VK_SUBPASS_CONTENTS_INLINE) | |
102 commandBuffer.vkCmdSetViewport(firstViewport = 0, viewportCount = 1, addr(viewport)) | |
103 commandBuffer.vkCmdSetScissor(firstScissor = 0, scissorCount = 1, addr(scissor)) | |
104 | |
105 proc EndRenderCommands*(commandBuffer: VkCommandBuffer) = | |
106 commandBuffer.vkCmdEndRenderPass() | |
107 checkVkResult commandBuffer.vkEndCommandBuffer() |