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 <hans-kristian.arntzen@arm.com>2018-04-10 17:13:33 +0300
committerHans-Kristian Arntzen <hans-kristian.arntzen@arm.com>2018-04-10 17:13:33 +0300
commitf6c0e53f58302be8ef696007efd0f4cb043ab6b1 (patch)
tree788e972a8b2f2faf88d07e0bd2669e5a5da674fa /shaders
parent489e04e09e209b3badc3c103081cf5af8cdd7b7f (diff)
Start adding Vulkan 1.1 subgroup support to GLSL.
Diffstat (limited to 'shaders')
-rw-r--r--shaders/vulkan/comp/subgroups.nocompat.vk.comp101
1 files changed, 101 insertions, 0 deletions
diff --git a/shaders/vulkan/comp/subgroups.nocompat.vk.comp b/shaders/vulkan/comp/subgroups.nocompat.vk.comp
new file mode 100644
index 00000000..a5593f3f
--- /dev/null
+++ b/shaders/vulkan/comp/subgroups.nocompat.vk.comp
@@ -0,0 +1,101 @@
+#version 450
+#extension GL_KHR_shader_subgroup_basic : require
+#extension GL_KHR_shader_subgroup_ballot : require
+#extension GL_KHR_shader_subgroup_vote : require
+#extension GL_KHR_shader_subgroup_shuffle : require
+#extension GL_KHR_shader_subgroup_shuffle_relative : require
+#extension GL_KHR_shader_subgroup_arithmetic : require
+#extension GL_KHR_shader_subgroup_clustered : require
+#extension GL_KHR_shader_subgroup_quad : require
+layout(local_size_x = 1) in;
+
+layout(std430, binding = 0) buffer SSBO
+{
+ float FragColor;
+};
+
+void main()
+{
+ // basic
+ FragColor = float(gl_NumSubgroups);
+ FragColor = float(gl_SubgroupID);
+ FragColor = float(gl_SubgroupSize);
+ FragColor = float(gl_SubgroupInvocationID);
+ subgroupBarrier();
+ subgroupMemoryBarrier();
+ subgroupMemoryBarrierBuffer();
+ subgroupMemoryBarrierShared();
+ subgroupMemoryBarrierImage();
+ bool elected = subgroupElect();
+
+ // ballot
+ FragColor = float(gl_SubgroupEqMask);
+ FragColor = float(gl_SubgroupGeMask);
+ FragColor = float(gl_SubgroupGtMask);
+ FragColor = float(gl_SubgroupLeMask);
+ FragColor = float(gl_SubgroupLtMask);
+ vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u);
+ vec3 first = subgroupBroadcastFirst(vec3(20.0));
+ uvec4 ballot_value = subgroupBallot(true);
+ bool inverse_ballot_value = subgroupInverseBallot(ballot_value);
+ bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u);
+ uint bit_count = subgroupBallotBitCount(ballot_value);
+ uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value);
+ uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value);
+ uint lsb = subgroupBallotFindLSB(ballot_value);
+ uint msb = subgroupBallotFindMSB(ballot_value);
+
+ // shuffle
+ uint shuffled = subgroupShuffle(10u, 8u);
+ uint shuffled_xor = subgroupShuffleXor(30u, 8u);
+
+ // shuffle relative
+ uint shuffled_up = subgroupShuffleUp(20u, 4u);
+ uint shuffled_down = subgroupShuffleDown(20u, 4u);
+
+ // vote
+ bool has_all = subgroupAll(true);
+ bool has_any = subgroupAny(true);
+ bool has_equal = subgroupAllEqual(true);
+
+ // arithmetic
+ vec4 added = subgroupAdd(vec4(20.0));
+ vec4 multiplied = subgroupMul(vec4(20.0));
+ vec4 lo = subgroupMin(vec4(20.0));
+ vec4 hi = subgroupMax(vec4(20.0));
+ uvec4 anded = subgroupAnd(ballot_value);
+ uvec4 ored = subgroupOr(ballot_value);
+ uvec4 xored = subgroupXor(ballot_value);
+
+ added = subgroupInclusiveAdd(added);
+ multiplied = subgroupInclusiveMul(multiplied);
+ lo = subgroupInclusiveMin(lo);
+ hi = subgroupInclusiveMax(hi);
+ anded = subgroupInclusiveAnd(anded);
+ ored = subgroupInclusiveOr(ored);
+ xored = subgroupInclusiveXor(ored);
+ added = subgroupExclusiveAdd(lo);
+
+ added = subgroupExclusiveAdd(multiplied);
+ multiplied = subgroupExclusiveMul(multiplied);
+ lo = subgroupExclusiveMin(lo);
+ hi = subgroupExclusiveMax(hi);
+ anded = subgroupExclusiveAnd(anded);
+ ored = subgroupExclusiveOr(ored);
+ xored = subgroupExclusiveXor(ored);
+
+ // clustered
+ added = subgroupClusteredAdd(added, 4u);
+ multiplied = subgroupClusteredMul(multiplied, 4u);
+ lo = subgroupClusteredMin(lo, 4u);
+ hi = subgroupClusteredMax(hi, 4u);
+ anded = subgroupClusteredAnd(anded, 4u);
+ ored = subgroupClusteredOr(ored, 4u);
+ xored = subgroupClusteredXor(xored, 4u);
+
+ // quad
+ vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0));
+ vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0));
+ vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0));
+ vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u);
+}