Mercurial > games > semicongine
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) |
