Mercurial > games > semicongine
annotate semiconginev2/rendering.nim @ 1242:e8b3dc80e48e
add: PNG loading and tests for it
author | sam <sam@basx.dev> |
---|---|
date | Mon, 22 Jul 2024 15:53:32 +0700 |
parents | 42eeb59f3a43 |
children | 01e9f41d35b1 |
rev | line source |
---|---|
1192 | 1 # in this file: |
2 # - const defintions for rendering | |
3 # - custom pragma defintions for rendering | |
4 # - type defintions for rendering | |
5 # - some utils code that is used in mutiple rendering files | |
6 # - inclusion of all rendering files | |
7 | |
8 | |
9 # const definitions | |
1197 | 10 const INFLIGHTFRAMES* = 2'u32 |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
11 const BUFFER_ALIGNMENT = 64'u64 # align offsets inside buffers along this alignment |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
12 const MEMORY_BLOCK_ALLOCATION_SIZE = 100_000_000'u64 # ca. 100mb per block, seems reasonable |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
13 const BUFFER_ALLOCATION_SIZE = 9_000_000'u64 # ca. 9mb per block, seems reasonable, can put 10 buffers into one memory block |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
14 const MAX_DESCRIPTORSETS = 4 |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
15 const SURFACE_FORMAT* = VK_FORMAT_B8G8R8A8_SRGB |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
16 const DEPTH_FORMAT* = VK_FORMAT_D32_SFLOAT |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
17 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
18 # custom pragmas to classify shader attributes |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
19 template VertexAttribute* {.pragma.} |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
20 template InstanceAttribute* {.pragma.} |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
21 template Pass* {.pragma.} |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
22 template PassFlat* {.pragma.} |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
23 template ShaderOutput* {.pragma.} |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
24 template DescriptorSets* {.pragma.} |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
25 |
1193 | 26 # there is a big, bad global vulkan object |
27 # believe me, this makes everything much, much easier | |
28 | |
1224
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
29 when defined(windows): |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
30 include ./rendering/platform/windows |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
31 when defined(linux): |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
32 include ./rendering/platform/linux |
1193 | 33 |
34 type | |
35 VulkanGlobals* = object | |
1195
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
36 # populated through InitVulkan proc |
1193 | 37 instance*: VkInstance |
38 device*: VkDevice | |
39 physicalDevice*: VkPhysicalDevice | |
40 surface: VkSurfaceKHR | |
41 window: NativeWindow | |
42 graphicsQueueFamily*: uint32 | |
43 graphicsQueue*: VkQueue | |
1199 | 44 debugMessenger: VkDebugUtilsMessengerEXT |
1239
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
45 # populated through the InitSwapchain proc |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
46 swapchain*: Swapchain |
1197 | 47 # unclear as of yet |
48 anisotropy*: float32 = 0 # needs to be enable during device creation | |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
49 Renderpass* = ref object |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
50 vk*: VkRenderPass |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
51 samples*: VkSampleCountFlagBits |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
52 depthBuffer*: bool |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
53 Swapchain* = ref object |
1195
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
54 # parameters to InitSwapchain, required for swapchain recreation |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
55 renderPass*: RenderPass |
1195
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
56 vSync: bool |
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
57 # populated through InitSwapchain proc |
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
58 vk: VkSwapchainKHR |
1214
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1212
diff
changeset
|
59 width*: uint32 |
04e446a7eb2b
add: multipass renderer, finish tets for now
sam <sam@basx.dev>
parents:
1212
diff
changeset
|
60 height*: uint32 |
1195
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
61 framebuffers: seq[VkFramebuffer] |
cfba2b7e00d0
did: most of swapchain, swap still needs to be done
sam <sam@basx.dev>
parents:
1194
diff
changeset
|
62 framebufferViews: seq[VkImageView] |
1198 | 63 currentFramebufferIndex: uint32 |
64 commandBufferPool: VkCommandPool | |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
65 # depth buffer stuff, if enabled |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
66 depthImage: VkImage |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
67 depthImageView*: VkImageView |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
68 depthMemory: VkDeviceMemory |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
69 # MSAA stuff, if enabled |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
70 msaaImage: VkImage |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
71 msaaImageView*: VkImageView |
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
72 msaaMemory: VkDeviceMemory |
1198 | 73 # frame-in-flight handling |
74 currentFiF: range[0 .. (INFLIGHTFRAMES - 1).int] | |
1197 | 75 queueFinishedFence*: array[INFLIGHTFRAMES.int, VkFence] |
76 imageAvailableSemaphore*: array[INFLIGHTFRAMES.int, VkSemaphore] | |
77 renderFinishedSemaphore*: array[INFLIGHTFRAMES.int, VkSemaphore] | |
1198 | 78 commandBuffers: array[INFLIGHTFRAMES.int, VkCommandBuffer] |
1229
5dcb503ef0c0
did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents:
1228
diff
changeset
|
79 oldSwapchain: Swapchain |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
80 oldSwapchainCounter: int # swaps until old swapchain will be destroyed |
1193 | 81 |
82 var vulkan*: VulkanGlobals | |
1226 | 83 var fullscreen: bool |
1193 | 84 |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
85 type |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
86 # type aliases |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
87 SupportedGPUType = float32 | float64 | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | TVec2[int32] | TVec2[int64] | TVec3[int32] | TVec3[int64] | TVec4[int32] | TVec4[int64] | TVec2[uint32] | TVec2[uint64] | TVec3[uint32] | TVec3[uint64] | TVec4[uint32] | TVec4[uint64] | TVec2[float32] | TVec2[float64] | TVec3[float32] | TVec3[float64] | TVec4[float32] | TVec4[float64] | TMat2[float32] | TMat2[float64] | TMat23[float32] | TMat23[float64] | TMat32[float32] | TMat32[float64] | TMat3[float32] | TMat3[float64] | TMat34[float32] | TMat34[float64] | TMat43[float32] | TMat43[float64] | TMat4[float32] | TMat4[float64] |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
88 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
89 # shader related types |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
90 DescriptorSet*[T: object] = object |
1192 | 91 data*: T |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
92 vk: array[INFLIGHTFRAMES.int, VkDescriptorSet] |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
93 Pipeline*[TShader] = object |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
94 vk: VkPipeline |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
95 vertexShaderModule: VkShaderModule |
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
96 fragmentShaderModule: VkShaderModule |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
97 layout: VkPipelineLayout |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
98 descriptorSetLayouts*: array[MAX_DESCRIPTORSETS, VkDescriptorSetLayout] |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
99 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
100 # memory/buffer related types |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
101 MemoryBlock* = object |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
102 vk: VkDeviceMemory |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
103 size: uint64 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
104 rawPointer: pointer # if not nil, this is mapped memory |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
105 offsetNextFree: uint64 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
106 BufferType* = enum |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
107 VertexBuffer |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
108 VertexBufferMapped |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
109 IndexBuffer |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
110 IndexBufferMapped |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
111 UniformBuffer |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
112 UniformBufferMapped |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
113 Buffer* = object |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
114 vk: VkBuffer |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
115 size: uint64 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
116 rawPointer: pointer # if not nil, buffer is using mapped memory |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
117 offsetNextFree: uint64 |
1231 | 118 memoryOffset: uint64 |
119 memory: VkDeviceMemory | |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
120 GPUArray*[T: SupportedGPUType, TBuffer: static BufferType] = object |
1192 | 121 data*: seq[T] |
1202 | 122 buffer*: Buffer |
123 offset*: uint64 | |
1210 | 124 GPUValue*[T: object, TBuffer: static BufferType] = object |
1192 | 125 data*: T |
1231 | 126 buffer*: Buffer |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
127 offset: uint64 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
128 GPUData = GPUArray | GPUValue |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
129 |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
130 RenderData* = object |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
131 descriptorPool: VkDescriptorPool |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
132 memory: array[VK_MAX_MEMORY_TYPES.int, seq[MemoryBlock]] |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
133 buffers: array[BufferType, seq[Buffer]] |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
134 images: seq[VkImage] |
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
135 imageViews: seq[VkImageView] |
1201 | 136 samplers: seq[VkSampler] |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
137 |
1192 | 138 template ForDescriptorFields(shader: typed, fieldname, valuename, typename, countname, bindingNumber, body: untyped): untyped = |
1205
f7530247a21f
did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents:
1204
diff
changeset
|
139 var `bindingNumber` {.inject.} = 0'u32 |
1192 | 140 for theFieldname, value in fieldPairs(shader): |
1228 | 141 when typeof(value) is Image: |
1192 | 142 block: |
143 const `fieldname` {.inject.} = theFieldname | |
144 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER | |
145 const `countname` {.inject.} = 1'u32 | |
146 let `valuename` {.inject.} = value | |
147 body | |
148 `bindingNumber`.inc | |
1210 | 149 elif typeof(value) is GPUValue: |
1192 | 150 block: |
151 const `fieldname` {.inject.} = theFieldname | |
152 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER | |
153 const `countname` {.inject.} = 1'u32 | |
154 let `valuename` {.inject.} = value | |
155 body | |
156 `bindingNumber`.inc | |
157 elif typeof(value) is array: | |
1228 | 158 when elementType(value) is Image: |
1192 | 159 block: |
160 const `fieldname` {.inject.} = theFieldname | |
161 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER | |
162 const `countname` {.inject.} = uint32(typeof(value).len) | |
163 let `valuename` {.inject.} = value | |
164 body | |
165 `bindingNumber`.inc | |
1210 | 166 elif elementType(value) is GPUValue: |
1192 | 167 block: |
168 const `fieldname` {.inject.} = theFieldname | |
169 const `typename` {.inject.} = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER | |
1210 | 170 const `countname` {.inject.} = len(value).uint32 |
1192 | 171 let `valuename` {.inject.} = value |
172 body | |
173 `bindingNumber`.inc | |
174 else: | |
175 {.error: "Unsupported descriptor type: " & typetraits.name(typeof(value)).} | |
1210 | 176 else: |
177 {.error: "Unsupported descriptor type: " & typetraits.name(typeof(value)).} | |
1192 | 178 |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
179 include ./rendering/vulkan_wrappers |
1199 | 180 include ./rendering/renderpasses |
1194 | 181 include ./rendering/swapchain |
1190
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
182 include ./rendering/shaders |
a3eb305bcac2
start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff
changeset
|
183 include ./rendering/renderer |
1193 | 184 |
1199 | 185 proc debugCallback( |
186 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, | |
187 messageTypes: VkDebugUtilsMessageTypeFlagsEXT, | |
188 pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT, | |
189 userData: pointer | |
190 ): VkBool32 {.cdecl.} = | |
191 const LOG_LEVEL_MAPPING = { | |
192 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: lvlDebug, | |
193 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: lvlInfo, | |
194 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: lvlWarn, | |
195 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: lvlError, | |
196 }.toTable | |
197 log LOG_LEVEL_MAPPING[messageSeverity], &"{toEnums messageTypes}: {pCallbackData.pMessage}" | |
198 if messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: | |
199 stderr.writeLine "-----------------------------------" | |
200 stderr.write getStackTrace() | |
201 stderr.writeLine LOG_LEVEL_MAPPING[messageSeverity], &"{toEnums messageTypes}: {pCallbackData.pMessage}" | |
202 stderr.writeLine "-----------------------------------" | |
203 let errorMsg = getStackTrace() & &"\n{toEnums messageTypes}: {pCallbackData.pMessage}" | |
204 raise newException(Exception, errorMsg) | |
205 return false | |
1193 | 206 |
1204 | 207 proc InitVulkan*(appName: string = "semicongine app") = |
1193 | 208 |
209 # instance creation | |
1198 | 210 |
211 # enagle all kind of debug stuff | |
1193 | 212 when not defined(release): |
213 let requiredExtensions = REQUIRED_PLATFORM_EXTENSIONS & @["VK_KHR_surface", "VK_EXT_debug_utils"] | |
214 let layers: seq[string] = if hasValidationLayer(): @["VK_LAYER_KHRONOS_validation"] else: @[] | |
1198 | 215 putEnv("VK_LAYER_ENABLES", "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_AMD,VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_NVIDIA,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXTVK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT") |
1193 | 216 else: |
217 let requiredExtensions = REQUIRED_PLATFORM_EXTENSIONS & @["VK_KHR_surface"] | |
218 let layers: seq[string] | |
219 | |
220 var | |
221 layersC = allocCStringArray(layers) | |
222 instanceExtensionsC = allocCStringArray(requiredExtensions) | |
223 defer: | |
224 deallocCStringArray(layersC) | |
225 deallocCStringArray(instanceExtensionsC) | |
226 | |
227 var | |
228 appinfo = VkApplicationInfo( | |
229 sType: VK_STRUCTURE_TYPE_APPLICATION_INFO, | |
230 pApplicationName: appName, | |
231 pEngineName: "semicongine", | |
232 apiVersion: VK_MAKE_API_VERSION(0, 1, 3, 0), | |
233 ) | |
234 createinfo = VkInstanceCreateInfo( | |
235 sType: VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, | |
236 pApplicationInfo: addr(appinfo), | |
237 enabledLayerCount: layers.len.uint32, | |
238 ppEnabledLayerNames: layersC, | |
239 enabledExtensionCount: requiredExtensions.len.uint32, | |
240 ppEnabledExtensionNames: instanceExtensionsC | |
241 ) | |
1204 | 242 checkVkResult vkCreateInstance(addr(createinfo), nil, addr(vulkan.instance)) |
243 loadVulkan(vulkan.instance) | |
1193 | 244 |
245 # load extensions | |
246 # | |
247 for extension in requiredExtensions: | |
1204 | 248 loadExtension(vulkan.instance, $extension) |
249 vulkan.window = CreateWindow(appName) | |
250 vulkan.surface = CreateNativeSurface(vulkan.instance, vulkan.window) | |
1193 | 251 |
252 # logical device creation | |
253 | |
254 # TODO: allowing support for physical devices without hasUniformBufferStandardLayout | |
255 # would require us to ship different shaders, so we don't support standard layout | |
256 # if that will be added, check the function vulkan/shaders.nim:glslUniforms and update accordingly | |
257 # let hasUniformBufferStandardLayout = "VK_KHR_uniform_buffer_standard_layout" in physicalDevice.getExtensions() | |
258 # var deviceExtensions = @["VK_KHR_swapchain", "VK_KHR_uniform_buffer_standard_layout"] | |
259 var deviceExtensions = @["VK_KHR_swapchain"] | |
260 for extension in deviceExtensions: | |
1204 | 261 loadExtension(vulkan.instance, extension) |
1193 | 262 |
1199 | 263 when not defined(release): |
264 var debugMessengerCreateInfo = VkDebugUtilsMessengerCreateInfoEXT( | |
265 sType: VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, | |
266 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT.items.toSeq.toBits, | |
267 messageType: VkDebugUtilsMessageTypeFlagBitsEXT.items.toSeq.toBits, | |
268 pfnUserCallback: debugCallback, | |
269 pUserData: nil, | |
270 ) | |
271 checkVkResult vkCreateDebugUtilsMessengerEXT( | |
1204 | 272 vulkan.instance, |
1199 | 273 addr(debugMessengerCreateInfo), |
274 nil, | |
1204 | 275 addr(vulkan.debugMessenger) |
1199 | 276 ) |
277 | |
1193 | 278 # get physical device and graphics queue family |
1204 | 279 vulkan.physicalDevice = GetBestPhysicalDevice(vulkan.instance) |
280 vulkan.graphicsQueueFamily = GetQueueFamily(vulkan.physicalDevice, VK_QUEUE_GRAPHICS_BIT) | |
1193 | 281 |
282 let | |
283 priority = cfloat(1) | |
284 queueInfo = VkDeviceQueueCreateInfo( | |
285 sType: VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, | |
1204 | 286 queueFamilyIndex: vulkan.graphicsQueueFamily, |
1193 | 287 queueCount: 1, |
288 pQueuePriorities: addr(priority), | |
289 ) | |
290 deviceExtensionsC = allocCStringArray(deviceExtensions) | |
291 defer: deallocCStringArray(deviceExtensionsC) | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
292 let enabledFeatures = VkPhysicalDeviceFeatures( |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
293 fillModeNonSolid: true, |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
294 wideLines: true, |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
295 largePoints: true, |
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
296 ) |
1193 | 297 var createDeviceInfo = VkDeviceCreateInfo( |
298 sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, | |
299 queueCreateInfoCount: 1, | |
300 pQueueCreateInfos: addr(queueInfo), | |
301 enabledLayerCount: 0, | |
302 ppEnabledLayerNames: nil, | |
303 enabledExtensionCount: uint32(deviceExtensions.len), | |
304 ppEnabledExtensionNames: deviceExtensionsC, | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
305 pEnabledFeatures: addr(enabledFeatures), |
1193 | 306 ) |
307 checkVkResult vkCreateDevice( | |
1204 | 308 physicalDevice = vulkan.physicalDevice, |
1193 | 309 pCreateInfo = addr createDeviceInfo, |
310 pAllocator = nil, | |
1204 | 311 pDevice = addr vulkan.device |
1193 | 312 ) |
1204 | 313 vulkan.graphicsQueue = svkGetDeviceQueue(vulkan.device, vulkan.graphicsQueueFamily, VK_QUEUE_GRAPHICS_BIT) |
1193 | 314 |
1239
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
315 proc ClearSwapchain*() = |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
316 assert vulkan.swapchain != nil, "Swapchain has not been initialized yet" |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
317 DestroySwapchain(vulkan.swapchain) |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
318 vulkan.swapchain = nil |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
319 |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
320 proc SetupSwapchain*(renderPass: RenderPass, vSync: bool = false) = |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
321 assert vulkan.swapchain == nil, "Swapchain has already been initialized yet" |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
322 vulkan.swapchain = InitSwapchain(renderPass, vSync = vSync) |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
323 |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
324 proc DestroyVulkan*() = |
1239
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
325 if vulkan.swapchain != nil: |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
326 DestroySwapchain(vulkan.swapchain) |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
327 vkDestroyDevice(vulkan.device, nil) |
1201 | 328 vkDestroySurfaceKHR(vulkan.instance, vulkan.surface, nil) |
329 vkDestroyDebugUtilsMessengerEXT(vulkan.instance, vulkan.debugMessenger, nil) | |
1200
5c6491f28dcd
did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents:
1199
diff
changeset
|
330 vkDestroyInstance(vulkan.instance, nil) |
1226 | 331 |
332 proc ShowSystemCursor*() = vulkan.window.ShowSystemCursor() | |
333 proc HideSystemCursor*() = vulkan.window.HideSystemCursor() | |
334 proc Fullscreen*(): bool = fullscreen | |
335 proc `Fullscreen=`*(enable: bool) = | |
336 if enable != fullscreen: | |
337 fullscreen = enable | |
338 vulkan.window.Fullscreen(fullscreen) | |
339 | |
1239
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
340 proc GetAspectRatio*(): float32 = |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
341 assert vulkan.swapchain != nil, "Swapchain has not been initialized yet" |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
342 vulkan.swapchain.width.float32 / vulkan.swapchain.height.float32 |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
343 |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
344 proc currentFiF*(): int = |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
345 assert vulkan.swapchain != nil, "Swapchain has not been initialized yet" |
69489a678141
add: better syncing, better swapchain access, correct font offset, two font-rendering tests
sam <sam@basx.dev>
parents:
1234
diff
changeset
|
346 vulkan.swapchain.currentFiF |
1226 | 347 |
348 proc MaxFramebufferSampleCount*(maxSamples = VK_SAMPLE_COUNT_8_BIT): VkSampleCountFlagBits = | |
349 let limits = svkGetPhysicalDeviceProperties().limits | |
350 let available = VkSampleCountFlags( | |
351 limits.framebufferColorSampleCounts.uint32 and limits.framebufferDepthSampleCounts.uint32 | |
352 ).toEnums | |
353 return min(max(available), maxSamples) | |
354 | |
355 | |
1228 | 356 proc `[]`*(image: Image, x, y: uint32): auto = |
357 assert x < image.width, &"{x} < {image.width} is not true" | |
358 assert y < image.height, &"{y} < {image.height} is not true" | |
1226 | 359 |
1234
841e12f33c47
add: text & font rendering, not tested yet
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
360 image.data[y * image.width + x] |
1226 | 361 |
1228 | 362 proc `[]=`*[T](image: var Image[T], x, y: uint32, value: T) = |
363 assert x < image.width | |
364 assert y < image.height | |
1226 | 365 |
1234
841e12f33c47
add: text & font rendering, not tested yet
sam <sam@basx.dev>
parents:
1233
diff
changeset
|
366 image.data[y * image.width + x] = value |