I am using shaderc for compiling my shaders. In order to do so, I have to specify the type of shader (shaderc_shader_kind
). One of the available types is shaderc_glsl_infer_from_source
. The in-code comments say that this type "deduce the shader kind from #pragma
annotation in the source code, and compiler will emit error if #pragma
annotation is not found".
I have tried putting #pragma vertex_shader
or #pragma shaderc_vertex_shader
like in the code below, but the program stops working anyway.
#version 450
#extension GL_ARB_separate_shader_objects : enable
#pragma shaderc_fragment_shader
// The rest of the shader goes here
I get the following error:
Shader module compilation failed -
Validation layer: Validation Error: [ VUID_Undefined ] Object 0: handle = 0x1fa16e5fd90, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x79de34d4 | vkCreateShaderModule: parameter pCreateInfo->codeSize / 4 must be greater than 0.
Validation layer: Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x1fa16e5fd90, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: Invalid SPIR-V magic number.
Failed to create shader module!
However, everything works fine when, instead of using shaderc_glsl_infer_from_source
, I specify the type of shader manually (shaderc_vertex_shader
or shaderc_fragment_shader
) in my Vulkan code. Unfortunately, this is not convenient in my case.
What am I doing wrong? Is the #pragma
directive correct?