comparison src/glslang/glslang.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
comparison
equal deleted inserted replaced
0:5daf3f236d87 1:bb2a7d3a7003
1 # required to link the GLSL compiler
2 {.passl: "-Lthirdparty/glslang/lib/" .}
3 {.passl: "-Lthirdparty/spirv-tools/lib/" .}
4
5 {.passl: "-lglslang" .}
6 {.passl: "-lglslang-default-resource-limits" .}
7 {.passl: "-lHLSL" .}
8 {.passl: "-lMachineIndependent" .}
9 {.passl: "-lGenericCodeGen" .}
10 {.passl: "-lOSDependent" .}
11 {.passl: "-lOGLCompiler" .}
12 {.passl: "-lSPIRV" .}
13 {.passl: "-lSPIRV-Tools-opt" .}
14
15 {.passl: "-lSPIRV-Tools" .}
16 {.passl: "-lSPIRV-Tools-diff" .}
17 {.passl: "-lSPIRV-Tools-fuzz" .}
18 {.passl: "-lSPIRV-Tools-link" .}
19 {.passl: "-lSPIRV-Tools-lint" .}
20 {.passl: "-lSPIRV-Tools-opt" .}
21 {.passl: "-lSPIRV-Tools-reduce" .}
22
23 {.passl: "-lstdc++" .}
24 {.passl: "-lm" .}
25
26 import glslang_c_interface 1 import glslang_c_interface
27 import glslang_c_shader_types 2 import glslang_c_shader_types
28 3
4 export
5 glslang_stage_t,
6 glslang_initialize_process,
7 glslang_finalize_process
29 8
30 proc compileShaderToSPIRV_Vulkan*(stage: glslang_stage_t , shaderSource: string, fileName: string): seq[uint32] = 9 type
31 var input = glslang_input_t( 10 ShaderVersion = enum
32 language: GLSLANG_SOURCE_GLSL, 11 ES_VERSION = 100
33 stage: stage, 12 DESKTOP_VERSION = 110
34 client: GLSLANG_CLIENT_VULKAN,
35 client_version: GLSLANG_TARGET_VULKAN_1_2,
36 target_language: GLSLANG_TARGET_SPV,
37 target_language_version: GLSLANG_TARGET_SPV_1_5,
38 code: shaderSource,
39 default_version: 100,
40 default_profile: GLSLANG_NO_PROFILE,
41 force_default_version_and_profile: false.cint,
42 forward_compatible: false.cint,
43 messages: GLSLANG_MSG_DEFAULT_BIT,
44 resource: glslang_default_resource(),
45 )
46 13
47 let shader = glslang_shader_create(addr(input)) 14 proc compileGLSLToSPIRV*(stage: glslang_stage_t, shaderSource: string, fileName: string): seq[uint32] =
15 var input = glslang_input_t(
16 stage: stage,
17 language: GLSLANG_SOURCE_GLSL,
18 client: GLSLANG_CLIENT_VULKAN,
19 client_version: GLSLANG_TARGET_VULKAN_1_2,
20 target_language: GLSLANG_TARGET_SPV,
21 target_language_version: GLSLANG_TARGET_SPV_1_5,
22 code: cstring(shaderSource),
23 default_version: ord(DESKTOP_VERSION),
24 default_profile: GLSLANG_CORE_PROFILE,
25 force_default_version_and_profile: false.cint,
26 forward_compatible: false.cint,
27 messages: GLSLANG_MSG_DEBUG_INFO_BIT,
28 resource: glslang_default_resource(),
29 )
48 30
49 if not bool(glslang_shader_preprocess(shader, addr(input))): 31 var shader = glslang_shader_create(addr(input))
50 echo "GLSL preprocessing failed " & fileName
51 echo glslang_shader_get_info_log(shader)
52 echo glslang_shader_get_info_debug_log(shader)
53 echo input.code
54 glslang_shader_delete(shader)
55 return
56 32
57 if not bool(glslang_shader_parse(shader, addr(input))): 33 if not bool(glslang_shader_preprocess(shader, addr(input))):
58 echo "GLSL parsing failed " & fileName 34 echo "GLSL preprocessing failed " & fileName
59 echo glslang_shader_get_info_log(shader) 35 echo glslang_shader_get_info_log(shader)
60 echo glslang_shader_get_info_debug_log(shader) 36 echo glslang_shader_get_info_debug_log(shader)
61 echo glslang_shader_get_preprocessed_code(shader) 37 echo input.code
62 glslang_shader_delete(shader) 38 glslang_shader_delete(shader)
63 return 39 return
64 40
65 let program: ptr glslang_program_t = glslang_program_create() 41 if not bool(glslang_shader_parse(shader, addr(input))):
66 glslang_program_add_shader(program, shader) 42 echo "GLSL parsing failed " & fileName
43 echo glslang_shader_get_info_log(shader)
44 echo glslang_shader_get_info_debug_log(shader)
45 echo glslang_shader_get_preprocessed_code(shader)
46 glslang_shader_delete(shader)
47 return
67 48
68 if not bool(glslang_program_link(program, ord(GLSLANG_MSG_SPV_RULES_BIT) or ord(GLSLANG_MSG_VULKAN_RULES_BIT))): 49 var program: ptr glslang_program_t = glslang_program_create()
69 echo "GLSL linking failed " & fileName 50 glslang_program_add_shader(program, shader)
70 echo glslang_program_get_info_log(program)
71 echo glslang_program_get_info_debug_log(program)
72 glslang_program_delete(program)
73 glslang_shader_delete(shader)
74 return
75 51
76 glslang_program_SPIRV_generate(program, stage) 52 if not bool(glslang_program_link(program, ord(GLSLANG_MSG_SPV_RULES_BIT) or ord(GLSLANG_MSG_VULKAN_RULES_BIT))):
53 echo "GLSL linking failed " & fileName
54 echo glslang_program_get_info_log(program)
55 echo glslang_program_get_info_debug_log(program)
56 glslang_program_delete(program)
57 glslang_shader_delete(shader)
58 return
77 59
78 result = newSeq[uint32](glslang_program_SPIRV_get_size(program)) 60 glslang_program_SPIRV_generate(program, stage)
79 glslang_program_SPIRV_get(program, addr(result[0]))
80 61
81 var spirv_messages: cstring = glslang_program_SPIRV_get_messages(program) 62 result = newSeq[uint32](glslang_program_SPIRV_get_size(program))
82 if spirv_messages != nil: 63 glslang_program_SPIRV_get(program, addr(result[0]))
83 echo "(%s) %s\b", fileName, spirv_messages
84 64
85 glslang_program_delete(program) 65 var spirv_messages: cstring = glslang_program_SPIRV_get_messages(program)
86 glslang_shader_delete(shader) 66 if spirv_messages != nil:
67 echo "(%s) %s\b", fileName, spirv_messages
68
69 glslang_program_delete(program)
70 glslang_shader_delete(shader)
71
72 template checkGlslangResult*(call: untyped) =
73 let value = call
74 if value != 1:
75 raise newException(Exception, "glgslang error: " & astToStr(call) & " returned " & $value)