Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2021-02-17 22:46:06 +0300
committerGitHub <noreply@github.com>2021-02-17 22:46:06 +0300
commit621884d70917038caf7509f7b1b3c143807ff43f (patch)
treefb7f7a73df13d30b3533eea259f8f0ec7f42ff78 /reference/shaders-msl-no-opt
parentda238e5f1211bf20de75c3419c32b8e8d00e46cf (diff)
parent85704f70bcd9c25c9912796a86adb23fe8fdaa77 (diff)
Merge pull request #1622 from KhronosGroup/fix-1619
MSL: Handle load and store to TessLevel array in TESC.
Diffstat (limited to 'reference/shaders-msl-no-opt')
-rw-r--r--reference/shaders-msl-no-opt/asm/tesc/copy-tess-level-tri.asm.tesc68
-rw-r--r--reference/shaders-msl-no-opt/tesc/copy-tess-level.tesc70
2 files changed, 138 insertions, 0 deletions
diff --git a/reference/shaders-msl-no-opt/asm/tesc/copy-tess-level-tri.asm.tesc b/reference/shaders-msl-no-opt/asm/tesc/copy-tess-level-tri.asm.tesc
new file mode 100644
index 00000000..a492cb82
--- /dev/null
+++ b/reference/shaders-msl-no-opt/asm/tesc/copy-tess-level-tri.asm.tesc
@@ -0,0 +1,68 @@
+#pragma clang diagnostic ignored "-Wmissing-prototypes"
+#pragma clang diagnostic ignored "-Wmissing-braces"
+
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+template<typename T, size_t Num>
+struct spvUnsafeArray
+{
+ T elements[Num ? Num : 1];
+
+ thread T& operator [] (size_t pos) thread
+ {
+ return elements[pos];
+ }
+ constexpr const thread T& operator [] (size_t pos) const thread
+ {
+ return elements[pos];
+ }
+
+ device T& operator [] (size_t pos) device
+ {
+ return elements[pos];
+ }
+ constexpr const device T& operator [] (size_t pos) const device
+ {
+ return elements[pos];
+ }
+
+ constexpr const constant T& operator [] (size_t pos) const constant
+ {
+ return elements[pos];
+ }
+
+ threadgroup T& operator [] (size_t pos) threadgroup
+ {
+ return elements[pos];
+ }
+ constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
+ {
+ return elements[pos];
+ }
+};
+
+constant spvUnsafeArray<float, 2> _19 = spvUnsafeArray<float, 2>({ 1.0, 2.0 });
+constant spvUnsafeArray<float, 4> _25 = spvUnsafeArray<float, 4>({ 1.0, 2.0, 3.0, 4.0 });
+
+struct main0_out
+{
+ float4 gl_Position;
+};
+
+kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_PrimitiveID [[threadgroup_position_in_grid]], device main0_out* spvOut [[buffer(28)]], constant uint* spvIndirectParams [[buffer(29)]], device MTLTriangleTessellationFactorsHalf* spvTessLevel [[buffer(26)]])
+{
+ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 1];
+ spvTessLevel[gl_PrimitiveID].insideTessellationFactor = half(_19[0]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[0] = half(_25[0]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[1] = half(_25[1]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[2] = half(_25[2]);
+ spvUnsafeArray<float, 2> inner;
+ inner = spvUnsafeArray<float, 2>({ float(spvTessLevel[gl_PrimitiveID].insideTessellationFactor), 0.0 });
+ spvUnsafeArray<float, 4> outer;
+ outer = spvUnsafeArray<float, 4>({ float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[0]), float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[1]), float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[2]), 0.0 });
+ gl_out[gl_InvocationID].gl_Position = float4(1.0);
+}
+
diff --git a/reference/shaders-msl-no-opt/tesc/copy-tess-level.tesc b/reference/shaders-msl-no-opt/tesc/copy-tess-level.tesc
new file mode 100644
index 00000000..3bb54197
--- /dev/null
+++ b/reference/shaders-msl-no-opt/tesc/copy-tess-level.tesc
@@ -0,0 +1,70 @@
+#pragma clang diagnostic ignored "-Wmissing-prototypes"
+#pragma clang diagnostic ignored "-Wmissing-braces"
+
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+template<typename T, size_t Num>
+struct spvUnsafeArray
+{
+ T elements[Num ? Num : 1];
+
+ thread T& operator [] (size_t pos) thread
+ {
+ return elements[pos];
+ }
+ constexpr const thread T& operator [] (size_t pos) const thread
+ {
+ return elements[pos];
+ }
+
+ device T& operator [] (size_t pos) device
+ {
+ return elements[pos];
+ }
+ constexpr const device T& operator [] (size_t pos) const device
+ {
+ return elements[pos];
+ }
+
+ constexpr const constant T& operator [] (size_t pos) const constant
+ {
+ return elements[pos];
+ }
+
+ threadgroup T& operator [] (size_t pos) threadgroup
+ {
+ return elements[pos];
+ }
+ constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
+ {
+ return elements[pos];
+ }
+};
+
+constant spvUnsafeArray<float, 2> _14 = spvUnsafeArray<float, 2>({ 1.0, 2.0 });
+constant spvUnsafeArray<float, 4> _21 = spvUnsafeArray<float, 4>({ 1.0, 2.0, 3.0, 4.0 });
+
+struct main0_out
+{
+ float4 gl_Position;
+};
+
+kernel void main0(uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_PrimitiveID [[threadgroup_position_in_grid]], device main0_out* spvOut [[buffer(28)]], constant uint* spvIndirectParams [[buffer(29)]], device MTLQuadTessellationFactorsHalf* spvTessLevel [[buffer(26)]])
+{
+ device main0_out* gl_out = &spvOut[gl_PrimitiveID * 1];
+ spvTessLevel[gl_PrimitiveID].insideTessellationFactor[0] = half(_14[0]);
+ spvTessLevel[gl_PrimitiveID].insideTessellationFactor[1] = half(_14[1]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[0] = half(_21[0]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[1] = half(_21[1]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[2] = half(_21[2]);
+ spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[3] = half(_21[3]);
+ spvUnsafeArray<float, 2> inner;
+ inner = spvUnsafeArray<float, 2>({ float(spvTessLevel[gl_PrimitiveID].insideTessellationFactor[0]), float(spvTessLevel[gl_PrimitiveID].insideTessellationFactor[1]) });
+ spvUnsafeArray<float, 4> outer;
+ outer = spvUnsafeArray<float, 4>({ float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[0]), float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[1]), float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[2]), float(spvTessLevel[gl_PrimitiveID].edgeTessellationFactor[3]) });
+ gl_out[gl_InvocationID].gl_Position = float4(1.0);
+}
+