#version 310 es #ifdef GL_EXT_geometry_shader #extension GL_EXT_geometry_shader : enable #else #error no GL_EXT_geometry_shader #endif #ifndef GL_OES_geometry_shader #error no GL_OES_geometry_shader #endif precision mediump float; in fromVertex { in vec3 color; } fromV[]; in vec4 nonBlockUnsized[]; out toFragment { out vec3 color; } toF; out fromVertex { // okay to reuse a block name for another block name vec3 color; }; out fooB { // ERROR, cannot reuse block name as block instance vec2 color; } fromVertex; int fromVertex; // ERROR, cannot reuse a block name for something else out fooC { // ERROR, cannot have same name for block and instance name vec2 color; } fooC; void main() { EmitVertex(); EndPrimitive(); EmitStreamVertex(1); // ERROR EndStreamPrimitive(0); // ERROR color = fromV[0].color; gl_ClipDistance[3] = // ERROR, no ClipDistance gl_in[1].gl_ClipDistance[2]; // ERROR, no ClipDistance gl_Position = gl_in[0].gl_Position; gl_PrimitiveID = gl_PrimitiveIDIn; gl_Layer = 2; } layout(stream = 4) out vec4 ov4; // ERROR, no streams layout(line_strip, points, triangle_strip, points, triangle_strip) out; // just means triangle_strip" out ooutb { vec4 a; } ouuaa6; layout(max_vertices = 200) out; layout(max_vertices = 300) out; // ERROR, too big void foo(layout(max_vertices = 4) int a) // ERROR { ouuaa6.a = vec4(1.0); } layout(line_strip, points, triangle_strip, points) out; // ERROR, changing output primitive layout(line_strip, points) out; // ERROR, changing output primitive layout(triangle_strip) in; // ERROR, not an input primitive layout(triangle_strip) uniform; // ERROR layout(triangle_strip) out vec4 badv4; // ERROR, not on a variable layout(triangle_strip) in vec4 bad2v4[]; // ERROR, not on a variable or input layout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0 out outbn2 { layout(invocations = 3) int a; // 2 ERRORs, not on a block member, not until 4.0 layout(max_vertices = 3) int b; // ERROR, not on a block member layout(triangle_strip) int c; // ERROR, not on a block member } outbi; layout(lines) out; // ERROR, not on output layout(lines_adjacency) in; layout(triangles) in; // ERROR, can't change it layout(triangles_adjacency) in; // ERROR, can't change it layout(invocations = 4) in; in sameName { int a15; } insn[]; out sameName { float f15; }; uniform sameName { bool b15; }; const int summ = gl_MaxVertexAttribs + gl_MaxGeometryInputComponents + gl_MaxGeometryOutputComponents + gl_MaxGeometryImageUniforms + gl_MaxGeometryTextureImageUnits + gl_MaxGeometryOutputVertices + gl_MaxGeometryTotalOutputComponents + gl_MaxGeometryUniformComponents + gl_MaxGeometryAtomicCounters + gl_MaxGeometryAtomicCounterBuffers + gl_MaxVertexTextureImageUnits + gl_MaxCombinedTextureImageUnits + gl_MaxTextureImageUnits + gl_MaxDrawBuffers; void fooe1() { gl_ViewportIndex; // ERROR, not in ES gl_MaxViewports; // ERROR, not in ES insn.length(); // 4: lines_adjacency int inv = gl_InvocationID; } in vec4 explArray[4]; in vec4 explArrayBad[5]; // ERROR, wrong size in vec4 nonArrayed; // ERROR, not an array flat out vec3 myColor1; centroid out vec3 myColor2; centroid in vec3 centr[]; sample out vec4 perSampleColor; // ERROR without sample extensions layout(max_vertices = 200) out; // matching redecl layout(location = 7, component = 2) in float comp[]; // ERROR, es has no component void notHere() { gl_MaxGeometryVaryingComponents; // ERROR, not in ES gl_VerticesIn; // ERROR, not in ES } void pointSize1() { highp float ps = gl_in[3].gl_PointSize; // ERROR, need point_size extension gl_PointSize = ps; // ERROR, need point_size extension } #extension GL_OES_geometry_point_size : enable void pointSize2() { highp float ps = gl_in[3].gl_PointSize; gl_PointSize = ps; }