Skip to content

Commit 363035c

Browse files
Merge pull request #1233 from KhronosGroup/fix-1231
GLSL: Fix EmitStreamVertex/Primitive.
2 parents 15b860e + d7e612f commit 363035c

4 files changed

Lines changed: 65 additions & 2 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#version 450
2+
layout(triangles) in;
3+
layout(max_vertices = 2, points) out;
4+
5+
void main()
6+
{
7+
gl_Position = gl_in[0].gl_Position;
8+
EmitStreamVertex(0);
9+
EndStreamPrimitive(0);
10+
gl_Position = gl_in[0].gl_Position + vec4(2.0);
11+
EmitStreamVertex(1);
12+
EndStreamPrimitive(1);
13+
}
14+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#version 450
2+
layout(triangles) in;
3+
layout(max_vertices = 2, points) out;
4+
5+
void main()
6+
{
7+
gl_Position = gl_in[0].gl_Position;
8+
EmitStreamVertex(0);
9+
EndStreamPrimitive(0);
10+
gl_Position = gl_in[0].gl_Position + vec4(2.0);
11+
EmitStreamVertex(1);
12+
EndStreamPrimitive(1);
13+
}
14+

shaders/geom/multi-stream.geom

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#version 450
2+
3+
layout(triangles) in;
4+
layout(points, max_vertices = 2) out;
5+
6+
void main()
7+
{
8+
gl_Position = gl_in[0].gl_Position;
9+
EmitStreamVertex(0);
10+
EndStreamPrimitive(0);
11+
gl_Position = gl_in[0].gl_Position + 2;
12+
EmitStreamVertex(1);
13+
EndStreamPrimitive(1);
14+
}
15+

spirv_glsl.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9464,12 +9464,32 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
94649464
break;
94659465

94669466
case OpEmitStreamVertex:
9467-
statement("EmitStreamVertex();");
9467+
{
9468+
if (options.es)
9469+
SPIRV_CROSS_THROW("Multi-stream geometry shaders not supported in ES.");
9470+
else if (!options.es && options.version < 400)
9471+
SPIRV_CROSS_THROW("Multi-stream geometry shaders only supported in GLSL 400.");
9472+
9473+
auto stream_expr = to_expression(ops[0]);
9474+
if (expression_type(ops[0]).basetype != SPIRType::Int)
9475+
stream_expr = join("int(", stream_expr, ")");
9476+
statement("EmitStreamVertex(", stream_expr, ");");
94689477
break;
9478+
}
94699479

94709480
case OpEndStreamPrimitive:
9471-
statement("EndStreamPrimitive();");
9481+
{
9482+
if (options.es)
9483+
SPIRV_CROSS_THROW("Multi-stream geometry shaders not supported in ES.");
9484+
else if (!options.es && options.version < 400)
9485+
SPIRV_CROSS_THROW("Multi-stream geometry shaders only supported in GLSL 400.");
9486+
9487+
auto stream_expr = to_expression(ops[0]);
9488+
if (expression_type(ops[0]).basetype != SPIRType::Int)
9489+
stream_expr = join("int(", stream_expr, ")");
9490+
statement("EndStreamPrimitive(", stream_expr, ");");
94729491
break;
9492+
}
94739493

94749494
// Textures
94759495
case OpImageSampleExplicitLod:

0 commit comments

Comments
 (0)