GLSLang determines the content of the builtin block based on the shading language version. In the case of 420 vs 450, the difference is whether the gl_CullDistance member is present. Vulkan requires that the builtin interface block be the same on both sides of a shader interface not involving the fragment shader, so this leads to undefined behavior. This is caught by recent versions of the validation layers. Fix the issue by using GLSL 450 for both shaders in the pipeline.
27 lines
565 B
GLSL
27 lines
565 B
GLSL
#version 450
|
|
|
|
#define LIGHT_COUNT 3
|
|
|
|
layout (triangles, invocations = LIGHT_COUNT) in;
|
|
layout (triangle_strip, max_vertices = 3) out;
|
|
|
|
layout (binding = 0) uniform UBO
|
|
{
|
|
mat4 mvp[LIGHT_COUNT];
|
|
vec4 instancePos[3];
|
|
} ubo;
|
|
|
|
layout (location = 0) in int inInstanceIndex[];
|
|
|
|
void main()
|
|
{
|
|
vec4 instancedPos = ubo.instancePos[inInstanceIndex[0]];
|
|
for (int i = 0; i < gl_in.length(); i++)
|
|
{
|
|
gl_Layer = gl_InvocationID;
|
|
vec4 tmpPos = gl_in[i].gl_Position + instancedPos;
|
|
gl_Position = ubo.mvp[gl_InvocationID] * tmpPos;
|
|
EmitVertex();
|
|
}
|
|
EndPrimitive();
|
|
}
|