comparison src/zamikongine/shader.nim @ 499:3f1111f3b9f8

did: tons of stuff, input, refactoring, fix some errors, some template improvment, sorry for super-commit
author Sam <sam@basx.dev>
date Wed, 18 Jan 2023 09:52:03 +0700
parents 0c18638c7217
children
comparison
equal deleted inserted replaced
498:2fa8e418deae 499:3f1111f3b9f8
1 import std/os
2 import std/hashes
1 import std/strformat 3 import std/strformat
2 import std/strutils 4 import std/strutils
3 import std/tables 5 import std/tables
4 import std/compilesettings 6 import std/compilesettings
5
6 7
7 import ./vulkan_helpers 8 import ./vulkan_helpers
8 import ./glsl_helpers 9 import ./glsl_helpers
9 import ./vulkan 10 import ./vulkan
10 import ./vertex 11 import ./vertex
29 of VK_SHADER_STAGE_FRAGMENT_BIT: "frag" 30 of VK_SHADER_STAGE_FRAGMENT_BIT: "frag"
30 of VK_SHADER_STAGE_ALL_GRAPHICS: "" 31 of VK_SHADER_STAGE_ALL_GRAPHICS: ""
31 of VK_SHADER_STAGE_COMPUTE_BIT: "comp" 32 of VK_SHADER_STAGE_COMPUTE_BIT: "comp"
32 of VK_SHADER_STAGE_ALL: "" 33 of VK_SHADER_STAGE_ALL: ""
33 34
34 proc compileGLSLToSPIRV(stage: VkShaderStageFlagBits, shaderSource: string, entrypoint: string): seq[uint32] {.compileTime.} = 35 proc compileGLSLToSPIRV(stage: static VkShaderStageFlagBits, shaderSource: static string, entrypoint: string): seq[uint32] {.compileTime.} =
35 let stagename = stage2string(stage) 36 const
37 stagename = stage2string(stage)
38 shaderHash = hash(shaderSource)
39 # cross compilation for windows workaround, sorry computer
40 shaderout = getTempDir().replace("\\", "/") & "/" & fmt"shader_{shaderHash}.{stagename}"
41 projectPath = querySetting(projectPath)
36 42
37 # TODO: compiles only on linux for now (because we don't have compile-time functionality in std/tempfile) 43 let (output, exitCode_glsl) = gorgeEx(command=fmt"{projectPath}/glslangValidator --entry-point {entrypoint} -V --stdin -S {stagename} -o {shaderout}", input=shaderSource)
38 let (tmpfile, exitCode) = gorgeEx(command=fmt"mktemp --tmpdir shader_XXXXXXX.{stagename}")
39 if exitCode != 0:
40 raise newException(Exception, tmpfile)
41
42 let (output, exitCode_glsl) = gorgeEx(command=fmt"{querySetting(projectPath)}/glslangValidator --entry-point {entrypoint} -V --stdin -S {stagename} -o {tmpfile}", input=shaderSource)
43 if exitCode_glsl != 0: 44 if exitCode_glsl != 0:
44 raise newException(Exception, output) 45 raise newException(Exception, output)
45 let shaderbinary = staticRead tmpfile 46 if output == "": # this happens when the nim was invoked with "check" instead of "compile/c", as it prevents the gorgeEx command to really run. However, there is hope, see https://github.com/nim-lang/RFCs/issues/430
47 return result
48 let shaderbinary = staticRead shaderout
46 49
47 let (output_rm, exitCode_rm) = gorgeEx(command=fmt"rm {tmpfile}") 50 let (output_rm, exitCode_rm) = gorgeEx(command=fmt"rm {shaderout}")
48 if exitCode_rm != 0: 51 if exitCode_rm != 0:
49 raise newException(Exception, output_rm) 52 raise newException(Exception, output_rm)
50 53
51 var i = 0 54 var i = 0
52 while i < shaderbinary.len: 55 while i < shaderbinary.len: