summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/ir-glsl-legalize.cpp17
-rw-r--r--tests/cross-compile/geometry-shader.slang33
-rw-r--r--tests/cross-compile/geometry-shader.slang.glsl96
3 files changed, 146 insertions, 0 deletions
diff --git a/source/slang/ir-glsl-legalize.cpp b/source/slang/ir-glsl-legalize.cpp
index b659cf293..9c4210be0 100644
--- a/source/slang/ir-glsl-legalize.cpp
+++ b/source/slang/ir-glsl-legalize.cpp
@@ -1238,6 +1238,23 @@ void legalizeEntryPointParameterForGLSL(
}
}
+ // We will still have references to the parameter coming
+ // from the `EmitVertex` calls, so we need to replace it
+ // with something. There isn't anything reasonable to
+ // replace it with that would have the right type, so
+ // we will replace it with an undefined value, knowing
+ // that the emitted code will not actually reference it.
+ //
+ // TODO: This approach to generating geometry shader code
+ // is not ideal, and we should strive to find a better
+ // approach that involes coding the `EmitVertex` operation
+ // directly in the stdlib, similar to how ray-tracing
+ // operations like `TraceRay` are handled.
+ //
+ builder->setInsertBefore(func->getFirstBlock()->getFirstOrdinaryInst());
+ auto undefinedVal = builder->emitUndefined(pp->getFullType());
+ pp->replaceUsesWith(undefinedVal);
+
return;
}
}
diff --git a/tests/cross-compile/geometry-shader.slang b/tests/cross-compile/geometry-shader.slang
new file mode 100644
index 000000000..614d71db9
--- /dev/null
+++ b/tests/cross-compile/geometry-shader.slang
@@ -0,0 +1,33 @@
+// geometry-shader.slang
+
+//TEST:CROSS_COMPILE: -profile sm_5_0 -stage geometry -entry main -target spirv-assembly
+
+struct CoarseVertex
+{
+ float4 position : POSITION;
+ float3 color : COLOR;
+ uint id : ID;
+}
+
+struct RasterVertex
+{
+ float4 position : POSITION;
+ float3 color : COLOR;
+ uint id : SV_RenderTargetArrayIndex;
+}
+
+[maxvertexcount(3)]
+void main(
+ triangle CoarseVertex coarseVertices[3],
+ inout TriangleStream<RasterVertex> outputStream)
+{
+ for(int ii = 0; ii < 3; ++ii)
+ {
+ CoarseVertex coarseVertex = coarseVertices[ii];
+ RasterVertex rasterVertex;
+ rasterVertex.position = coarseVertex.position;
+ rasterVertex.color = coarseVertex.color;
+ rasterVertex.id = coarseVertex.id;
+ outputStream.Append(rasterVertex);
+ }
+}
diff --git a/tests/cross-compile/geometry-shader.slang.glsl b/tests/cross-compile/geometry-shader.slang.glsl
new file mode 100644
index 000000000..cdd0f94de
--- /dev/null
+++ b/tests/cross-compile/geometry-shader.slang.glsl
@@ -0,0 +1,96 @@
+#version 450
+// geometry-shader.slang.glsl
+//TEST_IGNORE_FILE:
+
+#define RasterVertex RasterVertex_0
+#define CoarseVertex CoarseVertex_0
+
+#define input_position _S1
+#define input_color _S2
+#define input_id _S3
+#define output_position _S4
+#define output_color _S5
+
+layout(row_major) uniform;
+layout(row_major) buffer;
+
+layout(location = 0)
+in vec4 input_position[3];
+
+layout(location = 1)
+in vec3 input_color[3];
+
+layout(location = 2)
+in uint input_id[3];
+
+layout(location = 0)
+out vec4 output_position;
+
+layout(location = 1)
+out vec3 output_color;
+
+struct RasterVertex
+{
+ vec4 position_0;
+ vec3 color_0;
+ uint id_0;
+};
+
+struct CoarseVertex
+{
+ vec4 position_1;
+ vec3 color_1;
+ uint id_1;
+};
+
+
+layout(max_vertices = 3) out;
+layout(triangles) in;
+layout(triangle_strip) out;
+
+void main()
+{
+ int ii_0;
+
+ // TODO: Having to make this copy to transpose things is unfortunate.
+ //
+ // The front-end should be able to generate code using aggregate
+ // types for the input, and/or eliminate the redundant temporary
+ // by indexing directly into the sub-arrays.
+ //
+ CoarseVertex_0 _S6[3] = {
+ CoarseVertex_0(input_position[0], input_color[0], input_id[0]),
+ CoarseVertex_0(input_position[1], input_color[1], input_id[1]),
+ CoarseVertex_0(input_position[2], input_color[2], input_id[2])
+ };
+
+ ii_0 = 0;
+ for(;;)
+ {
+ if(ii_0 < 3)
+ {}
+ else
+ {
+ break;
+ }
+
+ CoarseVertex_0 coarseVertex_0 = _S6[ii_0];
+
+ RasterVertex_0 rasterVertex_0;
+ rasterVertex_0.position_0 = coarseVertex_0.position_1;
+ rasterVertex_0.color_0 = coarseVertex_0.color_1;
+ rasterVertex_0.id_0 = coarseVertex_0.id_1;
+
+ RasterVertex_0 _S7 = rasterVertex_0;
+
+ output_position = _S7.position_0;
+ output_color = _S7.color_0;
+ gl_Layer = int(_S7.id_0);
+
+ EmitVertex();
+
+ ii_0 = ii_0 + 1;
+ }
+
+ return;
+}