Mercurial > games > semicongine
comparison src/zamikongine/shader.nim @ 22:b45a5d338cd0
did: improve alotof_triangles example, remove glslang lib, use only binary, easier cross-compilation
author | Sam <sam@basx.dev> |
---|---|
date | Wed, 11 Jan 2023 00:43:17 +0700 |
parents | b55d6ecde79d |
children | 71bbe11d8de8 |
comparison
equal
deleted
inserted
replaced
21:316923e9247c | 22:b45a5d338cd0 |
---|---|
1 import std/osproc | |
2 import std/strformat | |
1 import std/strutils | 3 import std/strutils |
2 import std/tables | 4 import std/tables |
3 | 5 |
4 import ./vulkan_helpers | 6 import ./vulkan_helpers |
5 import ./vulkan | 7 import ./vulkan |
6 import ./vertex | 8 import ./vertex |
7 import ./glslang/glslang | |
8 | 9 |
9 type | 10 type |
10 ShaderProgram* = object | 11 ShaderProgram* = object |
11 entryPoint*: string | 12 entryPoint*: string |
12 programType*: VkShaderStageFlagBits | 13 programType*: VkShaderStageFlagBits |
13 shader*: VkPipelineShaderStageCreateInfo | 14 shader*: VkPipelineShaderStageCreateInfo |
14 | 15 |
16 func stage2string(stage: VkShaderStageFlagBits): string = | |
17 case stage | |
18 of VK_SHADER_STAGE_VERTEX_BIT: "vert" | |
19 of VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: "tesc" | |
20 of VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: "tese" | |
21 of VK_SHADER_STAGE_GEOMETRY_BIT: "geom" | |
22 of VK_SHADER_STAGE_FRAGMENT_BIT: "frag" | |
23 of VK_SHADER_STAGE_ALL_GRAPHICS: "" | |
24 of VK_SHADER_STAGE_COMPUTE_BIT: "comp" | |
25 of VK_SHADER_STAGE_ALL: "" | |
26 | |
27 proc compileGLSLToSPIRV(stage: VkShaderStageFlagBits, shaderSource: string, entrypoint: string): seq[uint32] = | |
28 let stagename = stage2string(stage) | |
29 let (output, exitCode) = execCmdEx(command=fmt"./glslangValidator --entry-point {entrypoint} -V --stdin -S {stagename}", input=shaderSource) | |
30 if exitCode != 0: | |
31 raise newException(Exception, output) | |
32 let shaderbinary = readFile fmt"{stagename}.spv" | |
33 var i = 0 | |
34 while i < shaderbinary.len: | |
35 result.add( | |
36 (uint32(shaderbinary[i + 0]) shl 0) or | |
37 (uint32(shaderbinary[i + 1]) shl 8) or | |
38 (uint32(shaderbinary[i + 2]) shl 16) or | |
39 (uint32(shaderbinary[i + 3]) shl 24) | |
40 ) | |
41 i += 4 | |
42 | |
15 proc initShaderProgram*(device: VkDevice, programType: VkShaderStageFlagBits, shader: string, entryPoint: string="main"): ShaderProgram = | 43 proc initShaderProgram*(device: VkDevice, programType: VkShaderStageFlagBits, shader: string, entryPoint: string="main"): ShaderProgram = |
16 result.entryPoint = entryPoint | 44 result.entryPoint = entryPoint |
17 result.programType = programType | 45 result.programType = programType |
18 | 46 |
19 const VK_GLSL_MAP = { | 47 var code = compileGLSLToSPIRV(result.programType, shader, result.entryPoint) |
20 VK_SHADER_STAGE_VERTEX_BIT: GLSLANG_STAGE_VERTEX, | |
21 VK_SHADER_STAGE_FRAGMENT_BIT: GLSLANG_STAGE_FRAGMENT, | |
22 }.toTable() | |
23 var code = compileGLSLToSPIRV(VK_GLSL_MAP[result.programType], shader, "<memory-shader>") | |
24 var createInfo = VkShaderModuleCreateInfo( | 48 var createInfo = VkShaderModuleCreateInfo( |
25 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, | 49 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, |
26 codeSize: uint(code.len * sizeof(uint32)), | 50 codeSize: uint(code.len * sizeof(uint32)), |
27 pCode: if code.len > 0: addr(code[0]) else: nil, | 51 pCode: if code.len > 0: addr(code[0]) else: nil, |
28 ) | 52 ) |