glslang/Test/link.multiAnonBlocksInvalid.0.0.vert
Malcolm Bechard 0b66fa3b62
Shader interface matching rework to fix #2136 (#2156)
* rework how shader interface block naming rules are handled

* Fixes 2136

According to the spec, shader interfaces (uniform blocks, buffer
blocks, input blocks, output blocks) all should be matched up via
their block names across all compilation units, not instance names.
Also, all block names can be re-used between all 4 interface types
without conflict. This change makes it so all of these blocks are
matched and remapped using block name and not by instance name.
Additional the rule that matched uniform and buffer blocks must
either be anonymous or named (but not nessearily the same name) is
now imposed.

* add warning if instance names differ between matched shader interfaces

* Add test cases from #2137 which is now fixed as well.

* replace some tab characters with spaces

* buffer blocks and uniform blocks now share the same block namespace
2020-04-02 02:03:53 -06:00

53 lines
786 B
GLSL
Executable File

#version 430
// Error: Block has different members
layout (std140) uniform Block
{
mat4 uProj;
};
// Error: BufferBlock has different members
buffer BufferBlock
{
vec4 b;
};
// Error: Vertex has different members
out Vertex
{
vec4 v1;
};
// Error: ColorBlock has different members
layout (std140) uniform ColorBlock
{
vec4 color1;
vec4 color2;
// Error, redeclare varaible in another anonymous block
vec4 v1;
};
// Error: NamedBlock is anonymous in other compilation unit
layout (std140) uniform NamedBlock
{
mat4 m;
} myName;
vec4 getWorld();
vec4 getColor2();
out vec4 oColor;
// Error: redeclare varaibles that are in anonymous blocks
out vec4 v1;
uniform mat4 uProj;
void
main()
{
oColor = color1 * getColor2();
v1 = color1;
gl_Position = uProj * getWorld();
}