| 157 | static_assert(sizeof(TBuiltInResource) == sizeof(glslang_resource_t)); |
| 158 | |
| 159 | static size_t compileShader(glslang_stage_t stage, const char* shaderSource, ShaderModule& shaderModule) |
| 160 | { |
| 161 | const glslang_input_t input = |
| 162 | { |
| 163 | .language = GLSLANG_SOURCE_GLSL, |
| 164 | .stage = stage, |
| 165 | .client = GLSLANG_CLIENT_VULKAN, |
| 166 | .client_version = GLSLANG_TARGET_VULKAN_1_1, |
| 167 | .target_language = GLSLANG_TARGET_SPV, |
| 168 | .target_language_version = GLSLANG_TARGET_SPV_1_3, |
| 169 | .code = shaderSource, |
| 170 | .default_version = 100, |
| 171 | .default_profile = GLSLANG_NO_PROFILE, |
| 172 | .force_default_version_and_profile = false, |
| 173 | .forward_compatible = false, |
| 174 | .messages = GLSLANG_MSG_DEFAULT_BIT, |
| 175 | .resource = (const glslang_resource_t*)&glslang::DefaultTBuiltInResource, |
| 176 | }; |
| 177 | |
| 178 | glslang_shader_t* shader = glslang_shader_create(&input); |
| 179 | |
| 180 | if (!glslang_shader_preprocess(shader, &input)) |
| 181 | { |
| 182 | fprintf(stderr, "GLSL preprocessing failed\n"); |
| 183 | fprintf(stderr, "\n%s", glslang_shader_get_info_log(shader)); |
| 184 | fprintf(stderr, "\n%s", glslang_shader_get_info_debug_log(shader)); |
| 185 | printShaderSource(input.code); |
| 186 | return 0; |
| 187 | } |
| 188 | |
| 189 | if (!glslang_shader_parse(shader, &input)) |
| 190 | { |
| 191 | fprintf(stderr, "GLSL parsing failed\n"); |
| 192 | fprintf(stderr, "\n%s", glslang_shader_get_info_log(shader)); |
| 193 | fprintf(stderr, "\n%s", glslang_shader_get_info_debug_log(shader)); |
| 194 | printShaderSource(glslang_shader_get_preprocessed_code(shader)); |
| 195 | return 0; |
| 196 | } |
| 197 | |
| 198 | glslang_program_t* program = glslang_program_create(); |
| 199 | glslang_program_add_shader(program, shader); |
| 200 | |
| 201 | if (!glslang_program_link(program, GLSLANG_MSG_SPV_RULES_BIT | GLSLANG_MSG_VULKAN_RULES_BIT)) |
| 202 | { |
| 203 | fprintf(stderr, "GLSL linking failed\n"); |
| 204 | fprintf(stderr, "\n%s", glslang_program_get_info_log(program)); |
| 205 | fprintf(stderr, "\n%s", glslang_program_get_info_debug_log(program)); |
| 206 | return 0; |
| 207 | } |
| 208 | |
| 209 | glslang_program_SPIRV_generate(program, stage); |
| 210 | |
| 211 | shaderModule.SPIRV.resize(glslang_program_SPIRV_get_size(program)); |
| 212 | glslang_program_SPIRV_get(program, shaderModule.SPIRV.data()); |
| 213 | |
| 214 | { |
| 215 | const char* spirv_messages = |
| 216 | glslang_program_SPIRV_get_messages(program); |
no test coverage detected