Mercurial > games > semicongine
comparison src/engine.nim @ 1:bb2a7d3a7003
add: more steps in setup
author | Sam <sam@basx.dev> |
---|---|
date | Fri, 16 Dec 2022 00:05:41 +0700 |
parents | 5daf3f236d87 |
children | 213fdf8d31dd |
comparison
equal
deleted
inserted
replaced
0:5daf3f236d87 | 1:bb2a7d3a7003 |
---|---|
3 import ./vulkan | 3 import ./vulkan |
4 import ./vulkan_helpers | 4 import ./vulkan_helpers |
5 import ./xlib_helpers | 5 import ./xlib_helpers |
6 | 6 |
7 import ./glslang/glslang | 7 import ./glslang/glslang |
8 import ./glslang/glslang_c_shader_types | 8 |
9 | 9 var vertexShaderCode: string = """#version 450 |
10 layout(location = 0) out vec3 fragColor; | |
11 vec3 colors[3] = vec3[]( | |
12 vec3(1.0, 0.0, 0.0), | |
13 vec3(0.0, 1.0, 0.0), | |
14 vec3(0.0, 0.0, 1.0) | |
15 ); | |
16 vec2 positions[3] = vec2[]( | |
17 vec2(0.0, -0.5), | |
18 vec2(0.5, 0.5), | |
19 vec2(-0.5, 0.5) | |
20 ); | |
21 void main() { | |
22 gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); | |
23 fragColor = colors[gl_VertexIndex]; | |
24 }""" | |
25 | |
26 var fragmentShaderCode: string = """#version 450 | |
27 layout(location = 0) out vec4 outColor; | |
28 layout(location = 0) in vec3 fragColor; | |
29 void main() { | |
30 outColor = vec4(fragColor, 1.0); | |
31 }""" | |
10 | 32 |
11 import | 33 import |
12 x11/xlib, | 34 x11/xlib, |
13 x11/x | 35 x11/x |
14 | 36 |
15 const VULKAN_VERSION = VK_MAKE_API_VERSION(0'u32, 1'u32, 2'u32, 0'u32) | 37 const VULKAN_VERSION = VK_MAKE_API_VERSION(0'u32, 1'u32, 2'u32, 0'u32) |
16 | 38 |
17 type | 39 type |
40 GraphicsPipeline = object | |
41 shaderStages*: seq[VkPipelineShaderStageCreateInfo] | |
18 QueueFamily = object | 42 QueueFamily = object |
19 properties*: VkQueueFamilyProperties | 43 properties*: VkQueueFamilyProperties |
20 hasSurfaceSupport*: bool | 44 hasSurfaceSupport*: bool |
21 PhyscialDevice = object | 45 PhyscialDevice = object |
22 device*: VkPhysicalDevice | 46 device*: VkPhysicalDevice |
43 swapImageViews: seq[VkImageView] | 67 swapImageViews: seq[VkImageView] |
44 Engine* = object | 68 Engine* = object |
45 display*: PDisplay | 69 display*: PDisplay |
46 window*: x.Window | 70 window*: x.Window |
47 vulkan*: Vulkan | 71 vulkan*: Vulkan |
72 pipeline*: GraphicsPipeline | |
48 | 73 |
49 | 74 |
50 proc getAllPhysicalDevices(instance: VkInstance, surface: VkSurfaceKHR): seq[PhyscialDevice] = | 75 proc getAllPhysicalDevices(instance: VkInstance, surface: VkSurfaceKHR): seq[PhyscialDevice] = |
51 for vulkanPhysicalDevice in getVulkanPhysicalDevices(instance): | 76 for vulkanPhysicalDevice in getVulkanPhysicalDevices(instance): |
52 var device = PhyscialDevice(device: vulkanPhysicalDevice, extensions: getDeviceExtensions(vulkanPhysicalDevice)) | 77 var device = PhyscialDevice(device: vulkanPhysicalDevice, extensions: getDeviceExtensions(vulkanPhysicalDevice)) |
55 checkVkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vulkanPhysicalDevice, surface, addr(device.surfaceCapabilities)) | 80 checkVkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vulkanPhysicalDevice, surface, addr(device.surfaceCapabilities)) |
56 device.surfaceFormats = getDeviceSurfaceFormats(vulkanPhysicalDevice, surface) | 81 device.surfaceFormats = getDeviceSurfaceFormats(vulkanPhysicalDevice, surface) |
57 device.presentModes = getDeviceSurfacePresentModes(vulkanPhysicalDevice, surface) | 82 device.presentModes = getDeviceSurfacePresentModes(vulkanPhysicalDevice, surface) |
58 | 83 |
59 for i, queueFamilyProperty in enumerate(getQueueFamilies(vulkanPhysicalDevice)): | 84 for i, queueFamilyProperty in enumerate(getQueueFamilies(vulkanPhysicalDevice)): |
60 var hasSurfaceSupport: VkBool32 = VkBool32(false) | 85 var hasSurfaceSupport: VkBool32 = VK_FALSE |
61 checkVkResult vkGetPhysicalDeviceSurfaceSupportKHR(vulkanPhysicalDevice, uint32(i), surface, addr(hasSurfaceSupport)) | 86 checkVkResult vkGetPhysicalDeviceSurfaceSupportKHR(vulkanPhysicalDevice, uint32(i), surface, addr(hasSurfaceSupport)) |
62 device.queueFamilies.add(QueueFamily(properties: queueFamilyProperty, hasSurfaceSupport: bool(hasSurfaceSupport))) | 87 device.queueFamilies.add(QueueFamily(properties: queueFamilyProperty, hasSurfaceSupport: bool(hasSurfaceSupport))) |
63 | 88 |
64 result.add(device) | 89 result.add(device) |
65 | 90 |
144 # VK_SHARING_MODE_CONCURRENT no supported (i.e cannot use different queue families for drawing to swap surface?) | 169 # VK_SHARING_MODE_CONCURRENT no supported (i.e cannot use different queue families for drawing to swap surface?) |
145 imageSharingMode: VK_SHARING_MODE_EXCLUSIVE, | 170 imageSharingMode: VK_SHARING_MODE_EXCLUSIVE, |
146 preTransform: result.vulkan.activePhysicalDevice.surfaceCapabilities.currentTransform, | 171 preTransform: result.vulkan.activePhysicalDevice.surfaceCapabilities.currentTransform, |
147 compositeAlpha: VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, | 172 compositeAlpha: VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, |
148 presentMode: result.vulkan.selectedPresentationMode, | 173 presentMode: result.vulkan.selectedPresentationMode, |
149 clipped: VkBool32(true), | 174 clipped: VK_TRUE, |
150 oldSwapchain: VkSwapchainKHR(0), | 175 oldSwapchain: VkSwapchainKHR(0), |
151 ) | 176 ) |
152 checkVkResult vkCreateSwapchainKHR(result.vulkan.device, addr(swapchainCreateInfo), nil, addr(result.vulkan.swapChain)) | 177 checkVkResult vkCreateSwapchainKHR(result.vulkan.device, addr(swapchainCreateInfo), nil, addr(result.vulkan.swapChain)) |
153 result.vulkan.swapImages = getSwapChainImages(result.vulkan.device, result.vulkan.swapChain) | 178 result.vulkan.swapImages = getSwapChainImages(result.vulkan.device, result.vulkan.swapChain) |
154 | 179 |
173 baseArrayLayer: 0, | 198 baseArrayLayer: 0, |
174 layerCount: 1, | 199 layerCount: 1, |
175 ), | 200 ), |
176 ) | 201 ) |
177 checkVkResult vkCreateImageView(result.vulkan.device, addr(imageViewCreateInfo), nil, addr(result.vulkan.swapImageViews[i])) | 202 checkVkResult vkCreateImageView(result.vulkan.device, addr(imageViewCreateInfo), nil, addr(result.vulkan.swapImageViews[i])) |
178 echo compileShaderToSPIRV_Vulkan(GLSLANG_STAGE_VERTEX, """#version 450 | 203 |
179 vec2 positions[3] = vec2[]( | 204 # init shader system |
180 vec2(0.0, -0.5), | 205 checkGlslangResult glslang_initialize_process() |
181 vec2(0.5, 0.5), | 206 |
182 vec2(-0.5, 0.5) | 207 # load shaders |
183 ); | 208 result.pipeline.shaderStages.add(createShaderStage(result.vulkan.device, VK_SHADER_STAGE_VERTEX_BIT, vertexShaderCode)) |
184 void main() { | 209 result.pipeline.shaderStages.add(createShaderStage(result.vulkan.device, VK_SHADER_STAGE_FRAGMENT_BIT, fragmentShaderCode)) |
185 gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); | 210 |
186 }""", "<memory-shader>") | 211 # create graphis pipeline |
212 var dynamicStates = [VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR] | |
213 var dynamicState = VkPipelineDynamicStateCreateInfo( | |
214 sType: VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, | |
215 dynamicStateCount: uint32(dynamicStates.len), | |
216 pDynamicStates: addr(dynamicStates[0]), | |
217 ) | |
218 var vertexInputInfo = VkPipelineVertexInputStateCreateInfo( | |
219 sType: VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, | |
220 vertexBindingDescriptionCount: 0, | |
221 pVertexBindingDescriptions: nil, | |
222 vertexAttributeDescriptionCount: 0, | |
223 pVertexAttributeDescriptions: nil, | |
224 ) | |
225 var inputAssembly = VkPipelineInputAssemblyStateCreateInfo( | |
226 sType: VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, | |
227 topology: VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, | |
228 primitiveRestartEnable: VK_FALSE, | |
229 ) | |
230 | |
231 # setup viewport | |
232 var viewport = VkViewport( | |
233 x: 0.0, | |
234 y: 0.0, | |
235 width: (float) result.vulkan.selectedExtent.width, | |
236 height: (float) result.vulkan.selectedExtent.height, | |
237 minDepth: 0.0, | |
238 maxDepth: 1.0, | |
239 ) | |
240 var scissor = VkRect2D( | |
241 offset: VkOffset2D(x: 0, y: 0), | |
242 extent: result.vulkan.selectedExtent | |
243 ) | |
187 | 244 |
188 | 245 |
189 proc fullThrottle*(engine: Engine) = | 246 proc fullThrottle*(engine: Engine) = |
190 var event: XEvent | 247 var event: XEvent |
191 while true: | 248 while true: |
205 event.xbutton.x, ",", event.xbutton.y | 262 event.xbutton.x, ",", event.xbutton.y |
206 else: | 263 else: |
207 discard | 264 discard |
208 | 265 |
209 proc trash*(engine: Engine) = | 266 proc trash*(engine: Engine) = |
267 for shaderStage in engine.pipeline.shaderStages: | |
268 vkDestroyShaderModule(engine.vulkan.device, shaderStage.module, nil); | |
269 glslang_finalize_process() | |
210 vkDestroySwapchainKHR(engine.vulkan.device, engine.vulkan.swapChain, nil); | 270 vkDestroySwapchainKHR(engine.vulkan.device, engine.vulkan.swapChain, nil); |
211 vkDestroySurfaceKHR(engine.vulkan.instance, engine.vulkan.surface, nil); | 271 vkDestroySurfaceKHR(engine.vulkan.instance, engine.vulkan.surface, nil); |
212 vkDestroyDevice(engine.vulkan.device, nil) | 272 vkDestroyDevice(engine.vulkan.device, nil) |
213 vkDestroyInstance(engine.vulkan.instance, nil) | 273 vkDestroyInstance(engine.vulkan.instance, nil) |
214 checkXlibResult engine.display.XDestroyWindow(engine.window) | 274 checkXlibResult engine.display.XDestroyWindow(engine.window) |