Mercurial > games > semicongine
annotate semicongine/rendering.nim @ 1429:ab01c577d91c
fix: some more import-stuff
author | sam <sam@basx.dev> |
---|---|
date | Sat, 11 Jan 2025 15:34:21 +0700 |
parents | 676fc13685a9 |
children |
rev | line source |
---|---|
1303 | 1 import std/logging |
1298
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
2 import std/hashes |
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
3 import std/macros |
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
4 import std/os |
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
5 import std/sequtils |
1303 | 6 import std/strformat |
1298
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
7 import std/strutils |
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
8 import std/typetraits |
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
9 |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
10 import ./core |
1298
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
11 |
1429 | 12 import ./images |
1298
1feaa8a97acf
did: halfway complete refactoring to move from all-include to some-include+imports, no API changes
sam <sam@basx.dev>
parents:
1283
diff
changeset
|
13 |
1385 | 14 # in this file: |
1192 | 15 # - const defintions for rendering |
16 # - custom pragma defintions for rendering | |
17 # - type defintions for rendering | |
18 # - some utils code that is used in mutiple rendering files | |
19 # - inclusion of all rendering files | |
20 | |
1193 | 21 # there is a big, bad global vulkan object |
22 # believe me, this makes everything much, much easier | |
23 | |
1224
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
24 when defined(windows): |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
25 include ./rendering/platform/windows |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
26 when defined(linux): |
a3fa15c25026
did: cleanup, add audio, change platform-dependent structure
sam <sam@basx.dev>
parents:
1218
diff
changeset
|
27 include ./rendering/platform/linux |
1193 | 28 |
1427 | 29 import ../semicongine/rendering/memory |
30 import ../semicongine/rendering/renderer | |
31 import ../semicongine/rendering/swapchain | |
32 import ../semicongine/rendering/shaders | |
33 import ../semicongine/rendering/renderpasses | |
34 import ../semicongine/rendering/vulkan_wrappers | |
35 export memory | |
36 export renderer | |
37 export swapchain | |
38 export shaders | |
39 export renderpasses | |
40 export vulkan_wrappers | |
1193 | 41 |
1199 | 42 proc debugCallback( |
1333 | 43 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT, |
44 messageTypes: VkDebugUtilsMessageTypeFlagsEXT, | |
45 pCallbackData: ptr VkDebugUtilsMessengerCallbackDataEXT, | |
46 userData: pointer, | |
1199 | 47 ): VkBool32 {.cdecl.} = |
48 const LOG_LEVEL_MAPPING = { | |
1333 | 49 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: lvlDebug, |
50 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT: lvlInfo, | |
51 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: lvlWarn, | |
52 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: lvlError, | |
1199 | 53 }.toTable |
1333 | 54 log LOG_LEVEL_MAPPING[messageSeverity], |
55 &"{toEnums messageTypes}: {pCallbackData.pMessage}" | |
1199 | 56 if messageSeverity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT: |
57 stderr.writeLine "-----------------------------------" | |
58 stderr.write getStackTrace() | |
1333 | 59 stderr.writeLine LOG_LEVEL_MAPPING[messageSeverity], |
60 &"{toEnums messageTypes}: {pCallbackData.pMessage}" | |
1199 | 61 stderr.writeLine "-----------------------------------" |
1333 | 62 let errorMsg = |
63 getStackTrace() & &"\n{toEnums messageTypes}: {pCallbackData.pMessage}" | |
1199 | 64 raise newException(Exception, errorMsg) |
65 return false | |
1193 | 66 |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
67 proc initVulkan*(appName: string = "semicongine app"): VulkanObject = |
1193 | 68 # instance creation |
1198 | 69 |
70 # enagle all kind of debug stuff | |
1193 | 71 when not defined(release): |
1333 | 72 let requiredExtensions = |
73 REQUIRED_PLATFORM_EXTENSIONS & @["VK_KHR_surface", "VK_EXT_debug_utils"] | |
74 let layers: seq[string] = | |
75 if hasValidationLayer(): | |
76 @["VK_LAYER_KHRONOS_validation"] | |
77 else: | |
78 @[] | |
79 putEnv( | |
80 "VK_LAYER_ENABLES", | |
81 "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", | |
82 ) | |
1193 | 83 else: |
84 let requiredExtensions = REQUIRED_PLATFORM_EXTENSIONS & @["VK_KHR_surface"] | |
1311 | 85 let layers: seq[string] = @[] |
1193 | 86 |
87 var | |
88 layersC = allocCStringArray(layers) | |
89 instanceExtensionsC = allocCStringArray(requiredExtensions) | |
90 defer: | |
91 deallocCStringArray(layersC) | |
92 deallocCStringArray(instanceExtensionsC) | |
93 | |
94 var | |
95 appinfo = VkApplicationInfo( | |
96 sType: VK_STRUCTURE_TYPE_APPLICATION_INFO, | |
97 pApplicationName: appName, | |
98 pEngineName: "semicongine", | |
99 apiVersion: VK_MAKE_API_VERSION(0, 1, 3, 0), | |
100 ) | |
101 createinfo = VkInstanceCreateInfo( | |
102 sType: VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, | |
103 pApplicationInfo: addr(appinfo), | |
104 enabledLayerCount: layers.len.uint32, | |
105 ppEnabledLayerNames: layersC, | |
106 enabledExtensionCount: requiredExtensions.len.uint32, | |
1333 | 107 ppEnabledExtensionNames: instanceExtensionsC, |
1193 | 108 ) |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
109 checkVkResult vkCreateInstance(addr(createinfo), nil, addr(result.instance)) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
110 loadVulkan(result.instance) |
1193 | 111 |
112 # load extensions | |
113 # | |
114 for extension in requiredExtensions: | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
115 loadExtension(result.instance, $extension) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
116 result.window = createWindow(appName) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
117 result.surface = createNativeSurface(result.instance, result.window) |
1193 | 118 |
119 # logical device creation | |
120 | |
121 # TODO: allowing support for physical devices without hasUniformBufferStandardLayout | |
122 # would require us to ship different shaders, so we don't support standard layout | |
123 # if that will be added, check the function vulkan/shaders.nim:glslUniforms and update accordingly | |
124 # let hasUniformBufferStandardLayout = "VK_KHR_uniform_buffer_standard_layout" in physicalDevice.getExtensions() | |
125 # var deviceExtensions = @["VK_KHR_swapchain", "VK_KHR_uniform_buffer_standard_layout"] | |
126 var deviceExtensions = @["VK_KHR_swapchain"] | |
127 for extension in deviceExtensions: | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
128 loadExtension(result.instance, extension) |
1193 | 129 |
1199 | 130 when not defined(release): |
131 var debugMessengerCreateInfo = VkDebugUtilsMessengerCreateInfoEXT( | |
132 sType: VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, | |
133 messageSeverity: VkDebugUtilsMessageSeverityFlagBitsEXT.items.toSeq.toBits, | |
134 messageType: VkDebugUtilsMessageTypeFlagBitsEXT.items.toSeq.toBits, | |
135 pfnUserCallback: debugCallback, | |
136 pUserData: nil, | |
137 ) | |
138 checkVkResult vkCreateDebugUtilsMessengerEXT( | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
139 result.instance, addr(debugMessengerCreateInfo), nil, addr(result.debugMessenger) |
1199 | 140 ) |
141 | |
1193 | 142 # get physical device and graphics queue family |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
143 result.physicalDevice = getBestPhysicalDevice(result.instance) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
144 result.graphicsQueueFamily = |
1423
3b8a736c45a7
did: put almost all global state into a single struct
sam <sam@basx.dev>
parents:
1420
diff
changeset
|
145 getQueueFamily(result.physicalDevice, result.surface, VK_QUEUE_GRAPHICS_BIT) |
1193 | 146 |
147 let | |
148 priority = cfloat(1) | |
149 queueInfo = VkDeviceQueueCreateInfo( | |
150 sType: VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
151 queueFamilyIndex: result.graphicsQueueFamily, |
1193 | 152 queueCount: 1, |
153 pQueuePriorities: addr(priority), | |
154 ) | |
155 deviceExtensionsC = allocCStringArray(deviceExtensions) | |
1333 | 156 defer: |
157 deallocCStringArray(deviceExtensionsC) | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
158 let enabledFeatures = VkPhysicalDeviceFeatures( |
1333 | 159 fillModeNonSolid: true, depthClamp: true, wideLines: true, largePoints: true |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
160 ) |
1193 | 161 var createDeviceInfo = VkDeviceCreateInfo( |
162 sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, | |
163 queueCreateInfoCount: 1, | |
164 pQueueCreateInfos: addr(queueInfo), | |
165 enabledLayerCount: 0, | |
166 ppEnabledLayerNames: nil, | |
167 enabledExtensionCount: uint32(deviceExtensions.len), | |
168 ppEnabledExtensionNames: deviceExtensionsC, | |
1240
42eeb59f3a43
add: more tests, line and point rendering
sam <sam@basx.dev>
parents:
1239
diff
changeset
|
169 pEnabledFeatures: addr(enabledFeatures), |
1193 | 170 ) |
171 checkVkResult vkCreateDevice( | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
172 physicalDevice = result.physicalDevice, |
1193 | 173 pCreateInfo = addr createDeviceInfo, |
174 pAllocator = nil, | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
175 pDevice = addr result.device, |
1193 | 176 ) |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
177 result.graphicsQueue = |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
178 svkGetDeviceQueue(result.device, result.graphicsQueueFamily, VK_QUEUE_GRAPHICS_BIT) |
1193 | 179 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
180 proc destroyVulkan*() = |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
181 if engine().vulkan.swapchain != nil: |
1373 | 182 clearSwapchain() |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
183 vkDestroyDevice(engine().vulkan.device, nil) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
184 vkDestroySurfaceKHR(engine().vulkan.instance, engine().vulkan.surface, nil) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
185 if engine().vulkan.debugMessenger.Valid: |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
186 vkDestroyDebugUtilsMessengerEXT( |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
187 engine().vulkan.instance, engine().vulkan.debugMessenger, nil |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
188 ) |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
189 vkDestroyInstance(engine().vulkan.instance, nil) |
1427 | 190 destroyWindow(engine().vulkan.window) |
1226 | 191 |
1333 | 192 proc showSystemCursor*(value: bool) = |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
193 engine().vulkan.window.showSystemCursor(value) |
1333 | 194 |
195 proc fullscreen*(): bool = | |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
196 engine().vulkan.fullscreen_internal |
1333 | 197 |
1283
0369fa1ffbd9
did: undo part of stupid API renaming a few weeks back ;(
sam <sam@basx.dev>
parents:
1277
diff
changeset
|
198 proc setFullscreen*(enable: bool) = |
1420
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
199 if enable != engine().vulkan.fullscreen_internal: |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
200 engine().vulkan.fullscreen_internal = enable |
6f81a41603d9
did: start working on big restructuring
sam <sam@basx.dev>
parents:
1410
diff
changeset
|
201 engine().vulkan.window.setFullscreen(engine().vulkan.fullscreen_internal) |
1226 | 202 |
1333 | 203 proc maxFramebufferSampleCount*( |
204 maxSamples = VK_SAMPLE_COUNT_8_BIT | |
205 ): VkSampleCountFlagBits = | |
1226 | 206 let limits = svkGetPhysicalDeviceProperties().limits |
207 let available = VkSampleCountFlags( | |
1333 | 208 limits.framebufferColorSampleCounts.uint32 and |
209 limits.framebufferDepthSampleCounts.uint32 | |
1226 | 210 ).toEnums |
211 return min(max(available), maxSamples) |