Unverified Commit 5125eb58 by John Kessenich Committed by GitHub

Merge pull request #1741 from dgkoch/shader_subgroup

Enable GL_KHR_shader_subgroup properly
parents 5efb004d 83170e3f
glsl.450.subgroup.frag
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:4 Function Definition: main( ( global void)
0:4 Function Parameters:
0:6 Sequence
0:6 move second child to first child ( temp 4-component vector of uint)
0:6 'data' (layout( location=0) out 4-component vector of uint)
0:6 Construct uvec4 ( temp 4-component vector of uint)
0:6 'gl_SubgroupSize' ( flat in uint unknown built-in variable)
0:6 'gl_SubgroupInvocationID' ( flat in uint unknown built-in variable)
0:6 Constant:
0:6 0 (const uint)
0:6 Constant:
0:6 0 (const uint)
0:? Linker Objects
0:? 'data' (layout( location=0) out 4-component vector of uint)
Linked fragment stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:4 Function Definition: main( ( global void)
0:4 Function Parameters:
0:6 Sequence
0:6 move second child to first child ( temp 4-component vector of uint)
0:6 'data' (layout( location=0) out 4-component vector of uint)
0:6 Construct uvec4 ( temp 4-component vector of uint)
0:6 'gl_SubgroupSize' ( flat in uint unknown built-in variable)
0:6 'gl_SubgroupInvocationID' ( flat in uint unknown built-in variable)
0:6 Constant:
0:6 0 (const uint)
0:6 Constant:
0:6 0 (const uint)
0:? Linker Objects
0:? 'data' (layout( location=0) out 4-component vector of uint)
glsl.450.subgroup.geom
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
invocations = -1
max_vertices = 1
input primitive = points
output primitive = points
0:? Sequence
0:10 Function Definition: main( ( global void)
0:10 Function Parameters:
0:12 Sequence
0:12 move second child to first child ( temp 4-component vector of uint)
0:12 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:12 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:12 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:12 Constant:
0:12 0 (const uint)
0:12 'gl_PrimitiveIDIn' ( in int PrimitiveID)
0:12 Construct uvec4 ( temp 4-component vector of uint)
0:12 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:12 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:12 Constant:
0:12 0 (const uint)
0:12 Constant:
0:12 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
Linked geometry stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
invocations = 1
max_vertices = 1
input primitive = points
output primitive = points
0:? Sequence
0:10 Function Definition: main( ( global void)
0:10 Function Parameters:
0:12 Sequence
0:12 move second child to first child ( temp 4-component vector of uint)
0:12 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:12 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:12 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:12 Constant:
0:12 0 (const uint)
0:12 'gl_PrimitiveIDIn' ( in int PrimitiveID)
0:12 Construct uvec4 ( temp 4-component vector of uint)
0:12 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:12 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:12 Constant:
0:12 0 (const uint)
0:12 Constant:
0:12 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
glsl.450.subgroup.tesc
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
vertices = 1
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in int PrimitiveID)
0:11 Construct uvec4 ( temp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
Linked tessellation control stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
vertices = 1
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in int PrimitiveID)
0:11 Construct uvec4 ( temp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
glsl.450.subgroup.tese
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
input primitive = isolines
vertex spacing = none
triangle order = none
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in int PrimitiveID)
0:11 Construct uvec4 ( temp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
Linked tessellation evaluation stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
input primitive = isolines
vertex spacing = equal_spacing
triangle order = ccw
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in int PrimitiveID)
0:11 Construct uvec4 ( temp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
glsl.450.subgroup.vert
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:8 Function Definition: main( ( global void)
0:8 Function Parameters:
0:10 Sequence
0:10 move second child to first child ( temp 4-component vector of uint)
0:10 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:10 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:10 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:10 Constant:
0:10 0 (const uint)
0:10 'gl_VertexID' ( gl_VertexId int VertexId)
0:10 Construct uvec4 ( temp 4-component vector of uint)
0:10 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:10 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:10 Constant:
0:10 0 (const uint)
0:10 Constant:
0:10 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
Linked vertex stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:8 Function Definition: main( ( global void)
0:8 Function Parameters:
0:10 Sequence
0:10 move second child to first child ( temp 4-component vector of uint)
0:10 indirect index (layout( column_major std430 offset=0) temp 4-component vector of uint)
0:10 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint)
0:10 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:10 Constant:
0:10 0 (const uint)
0:10 'gl_VertexID' ( gl_VertexId int VertexId)
0:10 Construct uvec4 ( temp 4-component vector of uint)
0:10 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:10 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:10 Constant:
0:10 0 (const uint)
0:10 Constant:
0:10 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of 4-component vector of uint result})
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
glsl.450.subgroupBasic.comp
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
local_size = (8, 8, 1)
0:? Sequence
0:12 Function Definition: main( ( global void)
0:12 Function Parameters:
0:14 Sequence
0:14 move second child to first child ( temp int)
0:14 indirect index (layout( column_major shared) temp int)
0:14 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:14 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:14 Constant:
0:14 0 (const int)
0:14 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:14 Constant:
0:14 1 (const int)
0:15 move second child to first child ( temp int)
0:15 indirect index (layout( column_major shared) temp int)
0:15 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:15 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:15 Constant:
0:15 0 (const int)
0:15 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:15 Constant:
0:15 1 (const int)
0:16 move second child to first child ( temp int)
0:16 indirect index (layout( column_major shared) temp int)
0:16 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:16 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:16 Constant:
0:16 0 (const int)
0:16 'gl_NumSubgroups' ( in uint unknown built-in variable)
0:16 Constant:
0:16 1 (const int)
0:17 move second child to first child ( temp int)
0:17 indirect index (layout( column_major shared) temp int)
0:17 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:17 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:17 Constant:
0:17 0 (const int)
0:17 'gl_SubgroupID' ( in uint unknown built-in variable)
0:17 Test condition and select ( temp int)
0:17 Condition
0:17 subgroupElect ( global bool)
0:17 true case
0:17 Constant:
0:17 1 (const int)
0:17 false case
0:17 Constant:
0:17 0 (const int)
0:18 subgroupBarrier ( global void)
0:19 subgroupMemoryBarrier ( global void)
0:20 subgroupMemoryBarrierBuffer ( global void)
0:21 subgroupMemoryBarrierShared ( global void)
0:22 subgroupMemoryBarrierImage ( global void)
0:? Linker Objects
0:? 'gl_WorkGroupSize' ( const 3-component vector of uint WorkGroupSize)
0:? 8 (const uint)
0:? 8 (const uint)
0:? 1 (const uint)
0:? 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
Linked compute stage:
Shader version: 450
Requested GL_KHR_shader_subgroup_basic
local_size = (8, 8, 1)
0:? Sequence
0:12 Function Definition: main( ( global void)
0:12 Function Parameters:
0:14 Sequence
0:14 move second child to first child ( temp int)
0:14 indirect index (layout( column_major shared) temp int)
0:14 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:14 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:14 Constant:
0:14 0 (const int)
0:14 'gl_SubgroupSize' ( in uint unknown built-in variable)
0:14 Constant:
0:14 1 (const int)
0:15 move second child to first child ( temp int)
0:15 indirect index (layout( column_major shared) temp int)
0:15 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:15 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:15 Constant:
0:15 0 (const int)
0:15 'gl_SubgroupInvocationID' ( in uint unknown built-in variable)
0:15 Constant:
0:15 1 (const int)
0:16 move second child to first child ( temp int)
0:16 indirect index (layout( column_major shared) temp int)
0:16 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:16 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:16 Constant:
0:16 0 (const int)
0:16 'gl_NumSubgroups' ( in uint unknown built-in variable)
0:16 Constant:
0:16 1 (const int)
0:17 move second child to first child ( temp int)
0:17 indirect index (layout( column_major shared) temp int)
0:17 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of int)
0:17 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
0:17 Constant:
0:17 0 (const int)
0:17 'gl_SubgroupID' ( in uint unknown built-in variable)
0:17 Test condition and select ( temp int)
0:17 Condition
0:17 subgroupElect ( global bool)
0:17 true case
0:17 Constant:
0:17 1 (const int)
0:17 false case
0:17 Constant:
0:17 0 (const int)
0:18 subgroupBarrier ( global void)
0:19 subgroupMemoryBarrier ( global void)
0:20 subgroupMemoryBarrierBuffer ( global void)
0:21 subgroupMemoryBarrierShared ( global void)
0:22 subgroupMemoryBarrierImage ( global void)
0:? Linker Objects
0:? 'gl_WorkGroupSize' ( const 3-component vector of uint WorkGroupSize)
0:? 8 (const uint)
0:? 8 (const uint)
0:? 1 (const uint)
0:? 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of int a})
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
glsl.es320.subgroup.frag
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:4 Function Definition: main( ( global void)
0:4 Function Parameters:
0:6 Sequence
0:6 move second child to first child ( temp mediump 4-component vector of uint)
0:6 'data' (layout( location=0) out mediump 4-component vector of uint)
0:6 Construct uvec4 ( temp mediump 4-component vector of uint)
0:6 'gl_SubgroupSize' ( flat in mediump uint unknown built-in variable)
0:6 'gl_SubgroupInvocationID' ( flat in mediump uint unknown built-in variable)
0:6 Constant:
0:6 0 (const uint)
0:6 Constant:
0:6 0 (const uint)
0:? Linker Objects
0:? 'data' (layout( location=0) out mediump 4-component vector of uint)
Linked fragment stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:4 Function Definition: main( ( global void)
0:4 Function Parameters:
0:6 Sequence
0:6 move second child to first child ( temp mediump 4-component vector of uint)
0:6 'data' (layout( location=0) out mediump 4-component vector of uint)
0:6 Construct uvec4 ( temp mediump 4-component vector of uint)
0:6 'gl_SubgroupSize' ( flat in mediump uint unknown built-in variable)
0:6 'gl_SubgroupInvocationID' ( flat in mediump uint unknown built-in variable)
0:6 Constant:
0:6 0 (const uint)
0:6 Constant:
0:6 0 (const uint)
0:? Linker Objects
0:? 'data' (layout( location=0) out mediump 4-component vector of uint)
glsl.es320.subgroup.geom
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
invocations = -1
max_vertices = 1
input primitive = points
output primitive = points
0:? Sequence
0:10 Function Definition: main( ( global void)
0:10 Function Parameters:
0:12 Sequence
0:12 move second child to first child ( temp highp 4-component vector of uint)
0:12 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:12 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:12 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:12 Constant:
0:12 0 (const uint)
0:12 'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
0:12 Construct uvec4 ( temp highp 4-component vector of uint)
0:12 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:12 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:12 Constant:
0:12 0 (const uint)
0:12 Constant:
0:12 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
Linked geometry stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
invocations = 1
max_vertices = 1
input primitive = points
output primitive = points
0:? Sequence
0:10 Function Definition: main( ( global void)
0:10 Function Parameters:
0:12 Sequence
0:12 move second child to first child ( temp highp 4-component vector of uint)
0:12 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:12 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:12 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:12 Constant:
0:12 0 (const uint)
0:12 'gl_PrimitiveIDIn' ( in highp int PrimitiveID)
0:12 Construct uvec4 ( temp highp 4-component vector of uint)
0:12 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:12 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:12 Constant:
0:12 0 (const uint)
0:12 Constant:
0:12 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
glsl.es320.subgroup.tesc
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
vertices = 1
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp highp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in highp int PrimitiveID)
0:11 Construct uvec4 ( temp highp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
Linked tessellation control stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
vertices = 1
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp highp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in highp int PrimitiveID)
0:11 Construct uvec4 ( temp highp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
glsl.es320.subgroup.tese
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
input primitive = isolines
vertex spacing = none
triangle order = none
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp highp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in highp int PrimitiveID)
0:11 Construct uvec4 ( temp highp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
Linked tessellation evaluation stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
input primitive = isolines
vertex spacing = equal_spacing
triangle order = ccw
0:? Sequence
0:9 Function Definition: main( ( global void)
0:9 Function Parameters:
0:11 Sequence
0:11 move second child to first child ( temp highp 4-component vector of uint)
0:11 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:11 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:11 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:11 Constant:
0:11 0 (const uint)
0:11 'gl_PrimitiveID' ( in highp int PrimitiveID)
0:11 Construct uvec4 ( temp highp 4-component vector of uint)
0:11 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:11 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:11 Constant:
0:11 0 (const uint)
0:11 Constant:
0:11 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
glsl.es320.subgroup.vert
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:8 Function Definition: main( ( global void)
0:8 Function Parameters:
0:10 Sequence
0:10 move second child to first child ( temp highp 4-component vector of uint)
0:10 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:10 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:10 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:10 Constant:
0:10 0 (const uint)
0:10 'gl_VertexID' ( gl_VertexId highp int VertexId)
0:10 Construct uvec4 ( temp highp 4-component vector of uint)
0:10 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:10 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:10 Constant:
0:10 0 (const uint)
0:10 Constant:
0:10 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:? 'gl_VertexID' ( gl_VertexId highp int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
Linked vertex stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
0:? Sequence
0:8 Function Definition: main( ( global void)
0:8 Function Parameters:
0:10 Sequence
0:10 move second child to first child ( temp highp 4-component vector of uint)
0:10 indirect index (layout( column_major std430 offset=0) temp highp 4-component vector of uint)
0:10 result: direct index for structure (layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint)
0:10 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:10 Constant:
0:10 0 (const uint)
0:10 'gl_VertexID' ( gl_VertexId highp int VertexId)
0:10 Construct uvec4 ( temp highp 4-component vector of uint)
0:10 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:10 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:10 Constant:
0:10 0 (const uint)
0:10 Constant:
0:10 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout( set=0 binding=0 column_major std430) buffer block{layout( column_major std430 offset=0) buffer runtime-sized array of highp 4-component vector of uint result})
0:? 'gl_VertexID' ( gl_VertexId highp int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
glsl.es320.subgroupBasic.comp
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
local_size = (8, 8, 1)
0:? Sequence
0:12 Function Definition: main( ( global void)
0:12 Function Parameters:
0:14 Sequence
0:14 move second child to first child ( temp highp int)
0:14 indirect index (layout( column_major shared) temp highp int)
0:14 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:14 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:14 Constant:
0:14 0 (const int)
0:14 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:14 Constant:
0:14 1 (const int)
0:15 move second child to first child ( temp highp int)
0:15 indirect index (layout( column_major shared) temp highp int)
0:15 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:15 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:15 Constant:
0:15 0 (const int)
0:15 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:15 Constant:
0:15 1 (const int)
0:16 move second child to first child ( temp highp int)
0:16 indirect index (layout( column_major shared) temp highp int)
0:16 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:16 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:16 Constant:
0:16 0 (const int)
0:16 'gl_NumSubgroups' ( in highp uint unknown built-in variable)
0:16 Constant:
0:16 1 (const int)
0:17 move second child to first child ( temp highp int)
0:17 indirect index (layout( column_major shared) temp highp int)
0:17 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:17 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:17 Constant:
0:17 0 (const int)
0:17 'gl_SubgroupID' ( in highp uint unknown built-in variable)
0:17 Test condition and select ( temp highp int)
0:17 Condition
0:17 subgroupElect ( global bool)
0:17 true case
0:17 Constant:
0:17 1 (const int)
0:17 false case
0:17 Constant:
0:17 0 (const int)
0:18 subgroupBarrier ( global void)
0:19 subgroupMemoryBarrier ( global void)
0:20 subgroupMemoryBarrierBuffer ( global void)
0:21 subgroupMemoryBarrierShared ( global void)
0:22 subgroupMemoryBarrierImage ( global void)
0:? Linker Objects
0:? 'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
0:? 8 (const uint)
0:? 8 (const uint)
0:? 1 (const uint)
0:? 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
Linked compute stage:
Shader version: 320
Requested GL_KHR_shader_subgroup_basic
local_size = (8, 8, 1)
0:? Sequence
0:12 Function Definition: main( ( global void)
0:12 Function Parameters:
0:14 Sequence
0:14 move second child to first child ( temp highp int)
0:14 indirect index (layout( column_major shared) temp highp int)
0:14 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:14 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:14 Constant:
0:14 0 (const int)
0:14 'gl_SubgroupSize' ( in mediump uint unknown built-in variable)
0:14 Constant:
0:14 1 (const int)
0:15 move second child to first child ( temp highp int)
0:15 indirect index (layout( column_major shared) temp highp int)
0:15 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:15 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:15 Constant:
0:15 0 (const int)
0:15 'gl_SubgroupInvocationID' ( in mediump uint unknown built-in variable)
0:15 Constant:
0:15 1 (const int)
0:16 move second child to first child ( temp highp int)
0:16 indirect index (layout( column_major shared) temp highp int)
0:16 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:16 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:16 Constant:
0:16 0 (const int)
0:16 'gl_NumSubgroups' ( in highp uint unknown built-in variable)
0:16 Constant:
0:16 1 (const int)
0:17 move second child to first child ( temp highp int)
0:17 indirect index (layout( column_major shared) temp highp int)
0:17 a: direct index for structure (layout( column_major shared) buffer runtime-sized array of highp int)
0:17 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
0:17 Constant:
0:17 0 (const int)
0:17 'gl_SubgroupID' ( in highp uint unknown built-in variable)
0:17 Test condition and select ( temp highp int)
0:17 Condition
0:17 subgroupElect ( global bool)
0:17 true case
0:17 Constant:
0:17 1 (const int)
0:17 false case
0:17 Constant:
0:17 0 (const int)
0:18 subgroupBarrier ( global void)
0:19 subgroupMemoryBarrier ( global void)
0:20 subgroupMemoryBarrierBuffer ( global void)
0:21 subgroupMemoryBarrierShared ( global void)
0:22 subgroupMemoryBarrierImage ( global void)
0:? Linker Objects
0:? 'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
0:? 8 (const uint)
0:? 8 (const uint)
0:? 1 (const uint)
0:? 'data' (layout( binding=0 column_major shared) buffer block{layout( column_major shared) buffer runtime-sized array of highp int a})
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout(location = 0) out uvec4 data;
void main (void)
{
data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout(points) in;
layout(points, max_vertices = 1) out;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout(vertices=1) out;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout(isolines) in;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_VertexID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 450
#extension GL_KHR_shader_subgroup_ballot: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
uvec4 relMask = gl_SubgroupEqMask +
gl_SubgroupGeMask +
gl_SubgroupGtMask +
gl_SubgroupLeMask +
gl_SubgroupLtMask;
uvec4 result = subgroupBallot(true);
data[invocation].u4.x = subgroupBallotBitCount(result);
data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0;
data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);
data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);
if ((relMask == result) && subgroupInverseBallot(data[0].u4))
{
data[invocation].f4.x = subgroupBroadcast(data[0].f4.x, 3);
data[invocation].f4.xy = subgroupBroadcast(data[1].f4.xy, 3);
data[invocation].f4.xyz = subgroupBroadcast(data[2].f4.xyz, 3);
data[invocation].f4 = subgroupBroadcast(data[3].f4, 3);
data[invocation].i4.x = subgroupBroadcast(data[0].i4.x, 2);
data[invocation].i4.xy = subgroupBroadcast(data[1].i4.xy, 2);
data[invocation].i4.xyz = subgroupBroadcast(data[2].i4.xyz, 2);
data[invocation].i4 = subgroupBroadcast(data[3].i4, 2);
data[invocation].u4.x = subgroupBroadcast(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupBroadcast(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupBroadcast(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupBroadcast(data[3].u4, 1);
data[invocation].d4.x = subgroupBroadcast(data[0].d4.x, 0);
data[invocation].d4.xy = subgroupBroadcast(data[1].d4.xy, 0);
data[invocation].d4.xyz = subgroupBroadcast(data[2].d4.xyz, 0);
data[invocation].d4 = subgroupBroadcast(data[3].d4, 0);
data[invocation].i4.x = int(subgroupBroadcast(data[0].i4.x < 0, 1));
data[invocation].i4.xy = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1));
data[invocation].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1));
data[invocation].i4 = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), 1));
}
else
{
data[invocation].f4.x = subgroupBroadcastFirst(data[0].f4.x);
data[invocation].f4.xy = subgroupBroadcastFirst(data[1].f4.xy);
data[invocation].f4.xyz = subgroupBroadcastFirst(data[2].f4.xyz);
data[invocation].f4 = subgroupBroadcastFirst(data[3].f4);
data[invocation].i4.x = subgroupBroadcastFirst(data[0].i4.x);
data[invocation].i4.xy = subgroupBroadcastFirst(data[1].i4.xy);
data[invocation].i4.xyz = subgroupBroadcastFirst(data[2].i4.xyz);
data[invocation].i4 = subgroupBroadcastFirst(data[3].i4);
data[invocation].u4.x = subgroupBroadcastFirst(data[0].u4.x);
data[invocation].u4.xy = subgroupBroadcastFirst(data[1].u4.xy);
data[invocation].u4.xyz = subgroupBroadcastFirst(data[2].u4.xyz);
data[invocation].u4 = subgroupBroadcastFirst(data[3].u4);
data[invocation].d4.x = subgroupBroadcastFirst(data[0].d4.x);
data[invocation].d4.xy = subgroupBroadcastFirst(data[1].d4.xy);
data[invocation].d4.xyz = subgroupBroadcastFirst(data[2].d4.xyz);
data[invocation].d4 = subgroupBroadcastFirst(data[3].d4);
data[invocation].i4.x = int(subgroupBroadcastFirst(data[0].i4.x < 0));
data[invocation].i4.xy = ivec2(subgroupBroadcastFirst(lessThan(data[1].i4.xy, ivec2(0))));
data[invocation].i4.xyz = ivec3(subgroupBroadcastFirst(lessThan(data[1].i4.xyz, ivec3(0))));
data[invocation].i4 = ivec4(subgroupBroadcastFirst(lessThan(data[1].i4, ivec4(0))));
}
}
#version 450
#extension GL_KHR_shader_subgroup_ballot: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
uvec4 relMask = gl_SubgroupEqMask +
gl_SubgroupGeMask +
gl_SubgroupGtMask +
gl_SubgroupLeMask +
gl_SubgroupLtMask;
uvec4 result = subgroupBallot(true);
data[invocation].u4.x = subgroupBallotBitCount(result);
data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0;
data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);
data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);
data[invocation].f4.x = subgroupBroadcast(data[0].f4.x, invocation); // ERROR: not constant
}
#version 450
#extension GL_KHR_shader_subgroup_basic: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffer
{
int a[];
} data;
void main()
{
data.a[gl_SubgroupSize] = 1;
data.a[gl_SubgroupInvocationID] = 1;
data.a[gl_NumSubgroups] = 1;
data.a[gl_SubgroupID] = (subgroupElect()) ? 1 : 0;
subgroupBarrier();
subgroupMemoryBarrier();
subgroupMemoryBarrierBuffer();
subgroupMemoryBarrierShared();
subgroupMemoryBarrierImage();
}
#version 450
#extension GL_KHR_shader_subgroup_clustered: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
data[invocation].f4.x = subgroupClusteredAdd(data[0].f4.x, 1);
data[invocation].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 1);
data[invocation].f4.xyz = subgroupClusteredAdd(data[2].f4.xyz, 1);
data[invocation].f4 = subgroupClusteredAdd(data[3].f4, 1);
data[invocation].i4.x = subgroupClusteredAdd(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredAdd(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredAdd(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredAdd(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredAdd(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredAdd(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredAdd(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredAdd(data[3].u4, 1);
data[invocation].d4.x = subgroupClusteredAdd(data[0].d4.x, 1);
data[invocation].d4.xy = subgroupClusteredAdd(data[1].d4.xy, 1);
data[invocation].d4.xyz = subgroupClusteredAdd(data[2].d4.xyz, 1);
data[invocation].d4 = subgroupClusteredAdd(data[3].d4, 1);
data[invocation].f4.x = subgroupClusteredMul(data[0].f4.x, 1);
data[invocation].f4.xy = subgroupClusteredMul(data[1].f4.xy, 1);
data[invocation].f4.xyz = subgroupClusteredMul(data[2].f4.xyz, 1);
data[invocation].f4 = subgroupClusteredMul(data[3].f4, 1);
data[invocation].i4.x = subgroupClusteredMul(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredMul(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredMul(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredMul(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredMul(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredMul(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredMul(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredMul(data[3].u4, 1);
data[invocation].d4.x = subgroupClusteredMul(data[0].d4.x, 1);
data[invocation].d4.xy = subgroupClusteredMul(data[1].d4.xy, 1);
data[invocation].d4.xyz = subgroupClusteredMul(data[2].d4.xyz, 1);
data[invocation].d4 = subgroupClusteredMul(data[3].d4, 1);
data[invocation].f4.x = subgroupClusteredMin(data[0].f4.x, 1);
data[invocation].f4.xy = subgroupClusteredMin(data[1].f4.xy, 1);
data[invocation].f4.xyz = subgroupClusteredMin(data[2].f4.xyz, 1);
data[invocation].f4 = subgroupClusteredMin(data[3].f4, 1);
data[invocation].i4.x = subgroupClusteredMin(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredMin(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredMin(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredMin(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredMin(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredMin(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredMin(data[3].u4, 1);
data[invocation].d4.x = subgroupClusteredMin(data[0].d4.x, 1);
data[invocation].d4.xy = subgroupClusteredMin(data[1].d4.xy, 1);
data[invocation].d4.xyz = subgroupClusteredMin(data[2].d4.xyz, 1);
data[invocation].d4 = subgroupClusteredMin(data[3].d4, 1);
data[invocation].f4.x = subgroupClusteredMax(data[0].f4.x, 1);
data[invocation].f4.xy = subgroupClusteredMax(data[1].f4.xy, 1);
data[invocation].f4.xyz = subgroupClusteredMax(data[2].f4.xyz, 1);
data[invocation].f4 = subgroupClusteredMax(data[3].f4, 1);
data[invocation].i4.x = subgroupClusteredMax(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredMax(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredMax(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredMax(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredMax(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredMax(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredMax(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredMax(data[3].u4, 1);
data[invocation].d4.x = subgroupClusteredMax(data[0].d4.x, 1);
data[invocation].d4.xy = subgroupClusteredMax(data[1].d4.xy, 1);
data[invocation].d4.xyz = subgroupClusteredMax(data[2].d4.xyz, 1);
data[invocation].d4 = subgroupClusteredMax(data[3].d4, 1);
data[invocation].i4.x = subgroupClusteredAnd(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredAnd(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredAnd(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredAnd(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredAnd(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredAnd(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredAnd(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredAnd(data[3].u4, 1);
data[invocation].i4.x = int(subgroupClusteredAnd(data[0].i4.x < 0, 1));
data[invocation].i4.xy = ivec2(subgroupClusteredAnd(lessThan(data[1].i4.xy, ivec2(0)), 1));
data[invocation].i4.xyz = ivec3(subgroupClusteredAnd(lessThan(data[1].i4.xyz, ivec3(0)), 1));
data[invocation].i4 = ivec4(subgroupClusteredAnd(lessThan(data[1].i4, ivec4(0)), 1));
data[invocation].i4.x = subgroupClusteredOr(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredOr(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredOr(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredOr(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredOr(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredOr(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredOr(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredOr(data[3].u4, 1);
data[invocation].i4.x = int(subgroupClusteredOr(data[0].i4.x < 0, 1));
data[invocation].i4.xy = ivec2(subgroupClusteredOr(lessThan(data[1].i4.xy, ivec2(0)), 1));
data[invocation].i4.xyz = ivec3(subgroupClusteredOr(lessThan(data[1].i4.xyz, ivec3(0)), 1));
data[invocation].i4 = ivec4(subgroupClusteredOr(lessThan(data[1].i4, ivec4(0)), 1));
data[invocation].i4.x = subgroupClusteredXor(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupClusteredXor(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupClusteredXor(data[3].i4, 1);
data[invocation].u4.x = subgroupClusteredXor(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupClusteredXor(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupClusteredXor(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupClusteredXor(data[3].u4, 1);
data[invocation].i4.x = int(subgroupClusteredXor(data[0].i4.x < 0, 1));
data[invocation].i4.xy = ivec2(subgroupClusteredXor(lessThan(data[1].i4.xy, ivec2(0)), 1));
data[invocation].i4.xyz = ivec3(subgroupClusteredXor(lessThan(data[1].i4.xyz, ivec3(0)), 1));
data[invocation].i4 = ivec4(subgroupClusteredXor(lessThan(data[1].i4, ivec4(0)), 1));
}
#version 450
#extension GL_KHR_shader_subgroup_clustered: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
int a = 1;
const int aConst = 1;
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
data[invocation].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 0); // ERROR, less than 1
data[invocation].f4.x = subgroupClusteredMul(data[0].f4.x, 3); // ERROR, not a power of 2
data[invocation].i4.xy = subgroupClusteredMin(data[1].i4.xy, 8);
data[invocation].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 6); // ERROR, not a power of 2
data[invocation].f4.x = subgroupClusteredMax(data[0].f4.x, -1); // ERROR, less than 1
data[invocation].i4 = subgroupClusteredAnd(data[3].i4, -3); // ERROR, less than 1
data[invocation].i4.x = subgroupClusteredOr(data[0].i4.x, a); // ERROR, not constant
data[invocation].i4.xy = subgroupClusteredOr(data[1].i4.xy, aConst);
data[invocation].i4.x = subgroupClusteredXor(data[0].i4.x, 1 + a); // ERROR, not constant
data[invocation].i4.xy = subgroupClusteredXor(data[1].i4.xy, aConst + a); // ERROR, not constant
data[invocation].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1 + aConst);
}
#version 450
#extension GL_KHR_shader_subgroup_quad: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
data[invocation].f4.x = subgroupQuadBroadcast(data[0].f4.x, 1);
data[invocation].f4.xy = subgroupQuadBroadcast(data[1].f4.xy, 1);
data[invocation].f4.xyz = subgroupQuadBroadcast(data[2].f4.xyz, 1);
data[invocation].f4 = subgroupQuadBroadcast(data[3].f4, 1);
data[invocation].i4.x = subgroupQuadBroadcast(data[0].i4.x, 1);
data[invocation].i4.xy = subgroupQuadBroadcast(data[1].i4.xy, 1);
data[invocation].i4.xyz = subgroupQuadBroadcast(data[2].i4.xyz, 1);
data[invocation].i4 = subgroupQuadBroadcast(data[3].i4, 1);
data[invocation].u4.x = subgroupQuadBroadcast(data[0].u4.x, 1);
data[invocation].u4.xy = subgroupQuadBroadcast(data[1].u4.xy, 1);
data[invocation].u4.xyz = subgroupQuadBroadcast(data[2].u4.xyz, 1);
data[invocation].u4 = subgroupQuadBroadcast(data[3].u4, 1);
data[invocation].d4.x = subgroupQuadBroadcast(data[0].d4.x, 1);
data[invocation].d4.xy = subgroupQuadBroadcast(data[1].d4.xy, 1);
data[invocation].d4.xyz = subgroupQuadBroadcast(data[2].d4.xyz, 1);
data[invocation].d4 = subgroupQuadBroadcast(data[3].d4, 1);
data[invocation].i4.x = int(subgroupQuadBroadcast(data[0].i4.x < 0, 1));
data[invocation].i4.xy = ivec2(subgroupQuadBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1));
data[invocation].i4.xyz = ivec3(subgroupQuadBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1));
data[invocation].i4 = ivec4(subgroupQuadBroadcast(lessThan(data[1].i4, ivec4(0)), 1));
data[invocation].f4.x = subgroupQuadSwapHorizontal(data[0].f4.x);
data[invocation].f4.xy = subgroupQuadSwapHorizontal(data[1].f4.xy);
data[invocation].f4.xyz = subgroupQuadSwapHorizontal(data[2].f4.xyz);
data[invocation].f4 = subgroupQuadSwapHorizontal(data[3].f4);
data[invocation].i4.x = subgroupQuadSwapHorizontal(data[0].i4.x);
data[invocation].i4.xy = subgroupQuadSwapHorizontal(data[1].i4.xy);
data[invocation].i4.xyz = subgroupQuadSwapHorizontal(data[2].i4.xyz);
data[invocation].i4 = subgroupQuadSwapHorizontal(data[3].i4);
data[invocation].u4.x = subgroupQuadSwapHorizontal(data[0].u4.x);
data[invocation].u4.xy = subgroupQuadSwapHorizontal(data[1].u4.xy);
data[invocation].u4.xyz = subgroupQuadSwapHorizontal(data[2].u4.xyz);
data[invocation].u4 = subgroupQuadSwapHorizontal(data[3].u4);
data[invocation].d4.x = subgroupQuadSwapHorizontal(data[0].d4.x);
data[invocation].d4.xy = subgroupQuadSwapHorizontal(data[1].d4.xy);
data[invocation].d4.xyz = subgroupQuadSwapHorizontal(data[2].d4.xyz);
data[invocation].d4 = subgroupQuadSwapHorizontal(data[3].d4);
data[invocation].i4.x = int(subgroupQuadSwapHorizontal(data[0].i4.x < 0));
data[invocation].i4.xy = ivec2(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xy, ivec2(0))));
data[invocation].i4.xyz = ivec3(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xyz, ivec3(0))));
data[invocation].i4 = ivec4(subgroupQuadSwapHorizontal(lessThan(data[1].i4, ivec4(0))));
data[invocation].f4.x = subgroupQuadSwapVertical(data[0].f4.x);
data[invocation].f4.xy = subgroupQuadSwapVertical(data[1].f4.xy);
data[invocation].f4.xyz = subgroupQuadSwapVertical(data[2].f4.xyz);
data[invocation].f4 = subgroupQuadSwapVertical(data[3].f4);
data[invocation].i4.x = subgroupQuadSwapVertical(data[0].i4.x);
data[invocation].i4.xy = subgroupQuadSwapVertical(data[1].i4.xy);
data[invocation].i4.xyz = subgroupQuadSwapVertical(data[2].i4.xyz);
data[invocation].i4 = subgroupQuadSwapVertical(data[3].i4);
data[invocation].u4.x = subgroupQuadSwapVertical(data[0].u4.x);
data[invocation].u4.xy = subgroupQuadSwapVertical(data[1].u4.xy);
data[invocation].u4.xyz = subgroupQuadSwapVertical(data[2].u4.xyz);
data[invocation].u4 = subgroupQuadSwapVertical(data[3].u4);
data[invocation].d4.x = subgroupQuadSwapVertical(data[0].d4.x);
data[invocation].d4.xy = subgroupQuadSwapVertical(data[1].d4.xy);
data[invocation].d4.xyz = subgroupQuadSwapVertical(data[2].d4.xyz);
data[invocation].d4 = subgroupQuadSwapVertical(data[3].d4);
data[invocation].i4.x = int(subgroupQuadSwapVertical(data[0].i4.x < 0));
data[invocation].i4.xy = ivec2(subgroupQuadSwapVertical(lessThan(data[1].i4.xy, ivec2(0))));
data[invocation].i4.xyz = ivec3(subgroupQuadSwapVertical(lessThan(data[1].i4.xyz, ivec3(0))));
data[invocation].i4 = ivec4(subgroupQuadSwapVertical(lessThan(data[1].i4, ivec4(0))));
data[invocation].f4.x = subgroupQuadSwapDiagonal(data[0].f4.x);
data[invocation].f4.xy = subgroupQuadSwapDiagonal(data[1].f4.xy);
data[invocation].f4.xyz = subgroupQuadSwapDiagonal(data[2].f4.xyz);
data[invocation].f4 = subgroupQuadSwapDiagonal(data[3].f4);
data[invocation].i4.x = subgroupQuadSwapDiagonal(data[0].i4.x);
data[invocation].i4.xy = subgroupQuadSwapDiagonal(data[1].i4.xy);
data[invocation].i4.xyz = subgroupQuadSwapDiagonal(data[2].i4.xyz);
data[invocation].i4 = subgroupQuadSwapDiagonal(data[3].i4);
data[invocation].u4.x = subgroupQuadSwapDiagonal(data[0].u4.x);
data[invocation].u4.xy = subgroupQuadSwapDiagonal(data[1].u4.xy);
data[invocation].u4.xyz = subgroupQuadSwapDiagonal(data[2].u4.xyz);
data[invocation].u4 = subgroupQuadSwapDiagonal(data[3].u4);
data[invocation].d4.x = subgroupQuadSwapDiagonal(data[0].d4.x);
data[invocation].d4.xy = subgroupQuadSwapDiagonal(data[1].d4.xy);
data[invocation].d4.xyz = subgroupQuadSwapDiagonal(data[2].d4.xyz);
data[invocation].d4 = subgroupQuadSwapDiagonal(data[3].d4);
data[invocation].i4.x = int(subgroupQuadSwapDiagonal(data[0].i4.x < 0));
data[invocation].i4.xy = ivec2(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xy, ivec2(0))));
data[invocation].i4.xyz = ivec3(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xyz, ivec3(0))));
data[invocation].i4 = ivec4(subgroupQuadSwapDiagonal(lessThan(data[1].i4, ivec4(0))));
}
#version 450
#extension GL_KHR_shader_subgroup_shuffle: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
data[invocation].f4.x = subgroupShuffle(data[0].f4.x, invocation);
data[invocation].f4.xy = subgroupShuffle(data[1].f4.xy, invocation);
data[invocation].f4.xyz = subgroupShuffle(data[2].f4.xyz, invocation);
data[invocation].f4 = subgroupShuffle(data[3].f4, invocation);
data[invocation].i4.x = subgroupShuffle(data[0].i4.x, invocation);
data[invocation].i4.xy = subgroupShuffle(data[1].i4.xy, invocation);
data[invocation].i4.xyz = subgroupShuffle(data[2].i4.xyz, invocation);
data[invocation].i4 = subgroupShuffle(data[3].i4, invocation);
data[invocation].u4.x = subgroupShuffle(data[0].u4.x, invocation);
data[invocation].u4.xy = subgroupShuffle(data[1].u4.xy, invocation);
data[invocation].u4.xyz = subgroupShuffle(data[2].u4.xyz, invocation);
data[invocation].u4 = subgroupShuffle(data[3].u4, invocation);
data[invocation].d4.x = subgroupShuffle(data[0].d4.x, invocation);
data[invocation].d4.xy = subgroupShuffle(data[1].d4.xy, invocation);
data[invocation].d4.xyz = subgroupShuffle(data[2].d4.xyz, invocation);
data[invocation].d4 = subgroupShuffle(data[3].d4, invocation);
data[invocation].i4.x = int(subgroupShuffle(data[0].i4.x < 0, invocation));
data[invocation].i4.xy = ivec2(subgroupShuffle(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[invocation].i4.xyz = ivec3(subgroupShuffle(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[invocation].i4 = ivec4(subgroupShuffle(lessThan(data[1].i4, ivec4(0)), invocation));
data[invocation].f4.x = subgroupShuffleXor(data[0].f4.x, invocation);
data[invocation].f4.xy = subgroupShuffleXor(data[1].f4.xy, invocation);
data[invocation].f4.xyz = subgroupShuffleXor(data[2].f4.xyz, invocation);
data[invocation].f4 = subgroupShuffleXor(data[3].f4, invocation);
data[invocation].i4.x = subgroupShuffleXor(data[0].i4.x, invocation);
data[invocation].i4.xy = subgroupShuffleXor(data[1].i4.xy, invocation);
data[invocation].i4.xyz = subgroupShuffleXor(data[2].i4.xyz, invocation);
data[invocation].i4 = subgroupShuffleXor(data[3].i4, invocation);
data[invocation].u4.x = subgroupShuffleXor(data[0].u4.x, invocation);
data[invocation].u4.xy = subgroupShuffleXor(data[1].u4.xy, invocation);
data[invocation].u4.xyz = subgroupShuffleXor(data[2].u4.xyz, invocation);
data[invocation].u4 = subgroupShuffleXor(data[3].u4, invocation);
data[invocation].d4.x = subgroupShuffleXor(data[0].d4.x, invocation);
data[invocation].d4.xy = subgroupShuffleXor(data[1].d4.xy, invocation);
data[invocation].d4.xyz = subgroupShuffleXor(data[2].d4.xyz, invocation);
data[invocation].d4 = subgroupShuffleXor(data[3].d4, invocation);
data[invocation].i4.x = int(subgroupShuffleXor(data[0].i4.x < 0, invocation));
data[invocation].i4.xy = ivec2(subgroupShuffleXor(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[invocation].i4.xyz = ivec3(subgroupShuffleXor(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[invocation].i4 = ivec4(subgroupShuffleXor(lessThan(data[1].i4, ivec4(0)), invocation));
}
#version 450
#extension GL_KHR_shader_subgroup_shuffle_relative: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
data[invocation].f4.x = subgroupShuffleUp(data[0].f4.x, invocation);
data[invocation].f4.xy = subgroupShuffleUp(data[1].f4.xy, invocation);
data[invocation].f4.xyz = subgroupShuffleUp(data[2].f4.xyz, invocation);
data[invocation].f4 = subgroupShuffleUp(data[3].f4, invocation);
data[invocation].i4.x = subgroupShuffleUp(data[0].i4.x, invocation);
data[invocation].i4.xy = subgroupShuffleUp(data[1].i4.xy, invocation);
data[invocation].i4.xyz = subgroupShuffleUp(data[2].i4.xyz, invocation);
data[invocation].i4 = subgroupShuffleUp(data[3].i4, invocation);
data[invocation].u4.x = subgroupShuffleUp(data[0].u4.x, invocation);
data[invocation].u4.xy = subgroupShuffleUp(data[1].u4.xy, invocation);
data[invocation].u4.xyz = subgroupShuffleUp(data[2].u4.xyz, invocation);
data[invocation].u4 = subgroupShuffleUp(data[3].u4, invocation);
data[invocation].d4.x = subgroupShuffleUp(data[0].d4.x, invocation);
data[invocation].d4.xy = subgroupShuffleUp(data[1].d4.xy, invocation);
data[invocation].d4.xyz = subgroupShuffleUp(data[2].d4.xyz, invocation);
data[invocation].d4 = subgroupShuffleUp(data[3].d4, invocation);
data[invocation].i4.x = int(subgroupShuffleUp(data[0].i4.x < 0, invocation));
data[invocation].i4.xy = ivec2(subgroupShuffleUp(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[invocation].i4.xyz = ivec3(subgroupShuffleUp(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[invocation].i4 = ivec4(subgroupShuffleUp(lessThan(data[1].i4, ivec4(0)), invocation));
data[invocation].f4.x = subgroupShuffleDown(data[0].f4.x, invocation);
data[invocation].f4.xy = subgroupShuffleDown(data[1].f4.xy, invocation);
data[invocation].f4.xyz = subgroupShuffleDown(data[2].f4.xyz, invocation);
data[invocation].f4 = subgroupShuffleDown(data[3].f4, invocation);
data[invocation].i4.x = subgroupShuffleDown(data[0].i4.x, invocation);
data[invocation].i4.xy = subgroupShuffleDown(data[1].i4.xy, invocation);
data[invocation].i4.xyz = subgroupShuffleDown(data[2].i4.xyz, invocation);
data[invocation].i4 = subgroupShuffleDown(data[3].i4, invocation);
data[invocation].u4.x = subgroupShuffleDown(data[0].u4.x, invocation);
data[invocation].u4.xy = subgroupShuffleDown(data[1].u4.xy, invocation);
data[invocation].u4.xyz = subgroupShuffleDown(data[2].u4.xyz, invocation);
data[invocation].u4 = subgroupShuffleDown(data[3].u4, invocation);
data[invocation].d4.x = subgroupShuffleDown(data[0].d4.x, invocation);
data[invocation].d4.xy = subgroupShuffleDown(data[1].d4.xy, invocation);
data[invocation].d4.xyz = subgroupShuffleDown(data[2].d4.xyz, invocation);
data[invocation].d4 = subgroupShuffleDown(data[3].d4, invocation);
data[invocation].i4.x = int(subgroupShuffleDown(data[0].i4.x < 0, invocation));
data[invocation].i4.xy = ivec2(subgroupShuffleDown(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[invocation].i4.xyz = ivec3(subgroupShuffleDown(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[invocation].i4 = ivec4(subgroupShuffleDown(lessThan(data[1].i4, ivec4(0)), invocation));
}
#version 450
#extension GL_KHR_shader_subgroup_vote: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
dvec4 d4;
int r;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;
if (subgroupAll(data[invocation].r < 0))
{
data[invocation].r = int(subgroupAllEqual(data[0].f4.x));
data[invocation].r = int(subgroupAllEqual(data[1].f4.xy));
data[invocation].r = int(subgroupAllEqual(data[2].f4.xyz));
data[invocation].r = int(subgroupAllEqual(data[3].f4));
data[invocation].r = int(subgroupAllEqual(data[0].i4.x));
data[invocation].r = int(subgroupAllEqual(data[1].i4.xy));
data[invocation].r = int(subgroupAllEqual(data[2].i4.xyz));
data[invocation].r = int(subgroupAllEqual(data[3].i4));
data[invocation].r = int(subgroupAllEqual(data[0].u4.x));
data[invocation].r = int(subgroupAllEqual(data[1].u4.xy));
data[invocation].r = int(subgroupAllEqual(data[2].u4.xyz));
data[invocation].r = int(subgroupAllEqual(data[3].u4));
}
else if (subgroupAny(data[invocation].r < 0))
{
data[invocation].r = int(subgroupAllEqual(data[0].d4.x));
data[invocation].r = int(subgroupAllEqual(data[1].d4.xy));
data[invocation].r = int(subgroupAllEqual(data[2].d4.xyz));
data[invocation].r = int(subgroupAllEqual(data[3].d4));
data[invocation].r = int(int(subgroupAllEqual(data[0].i4.x < 0)));
data[invocation].r = int(ivec2(subgroupAllEqual(lessThan(data[1].i4.xy, ivec2(0)))));
data[invocation].r = int(ivec3(subgroupAllEqual(lessThan(data[1].i4.xyz, ivec3(0)))));
data[invocation].r = int(ivec4(subgroupAllEqual(lessThan(data[1].i4, ivec4(0)))));
}
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout(location = 0) out uvec4 data;
void main (void)
{
data = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout(points) in;
layout(points, max_vertices = 1) out;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveIDIn] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout(vertices=1) out;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout(isolines) in;
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout(set = 0, binding = 0, std430) buffer Output
{
uvec4 result[];
};
void main (void)
{
result[gl_VertexID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);
}
#version 320 es
#extension GL_KHR_shader_subgroup_ballot: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
uvec4 relMask = gl_SubgroupEqMask +
gl_SubgroupGeMask +
gl_SubgroupGtMask +
gl_SubgroupLeMask +
gl_SubgroupLtMask;
uvec4 result = subgroupBallot(true);
data[0].u4.x = subgroupBallotBitCount(result);
data[0].u4.y = subgroupBallotBitExtract(result, 0u) ? 1u : 0u;
data[0].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);
data[0].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);
if ((relMask == result) && subgroupInverseBallot(data[0].u4))
{
data[1].f4.x = subgroupBroadcast(data[0].f4.x, 3u);
data[1].f4.xy = subgroupBroadcast(data[1].f4.xy, 3u);
data[1].f4.xyz = subgroupBroadcast(data[2].f4.xyz, 3u);
data[1].f4 = subgroupBroadcast(data[3].f4, 3u);
data[2].i4.x = subgroupBroadcast(data[0].i4.x, 2u);
data[2].i4.xy = subgroupBroadcast(data[1].i4.xy, 2u);
data[2].i4.xyz = subgroupBroadcast(data[2].i4.xyz, 2u);
data[2].i4 = subgroupBroadcast(data[3].i4, 2u);
data[3].u4.x = subgroupBroadcast(data[0].u4.x, 1u);
data[3].u4.xy = subgroupBroadcast(data[1].u4.xy, 1u);
data[3].u4.xyz = subgroupBroadcast(data[2].u4.xyz, 1u);
data[3].u4 = subgroupBroadcast(data[3].u4, 1u);
data[0].i4.x = int(subgroupBroadcast(data[0].i4.x < 0, 1u));
data[0].i4.xy = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1u));
data[0].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1u));
data[0].i4 = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), 1u));
}
else
{
data[1].f4.x = subgroupBroadcastFirst(data[0].f4.x);
data[1].f4.xy = subgroupBroadcastFirst(data[1].f4.xy);
data[1].f4.xyz = subgroupBroadcastFirst(data[2].f4.xyz);
data[1].f4 = subgroupBroadcastFirst(data[3].f4);
data[2].i4.x = subgroupBroadcastFirst(data[0].i4.x);
data[2].i4.xy = subgroupBroadcastFirst(data[1].i4.xy);
data[2].i4.xyz = subgroupBroadcastFirst(data[2].i4.xyz);
data[2].i4 = subgroupBroadcastFirst(data[3].i4);
data[3].u4.x = subgroupBroadcastFirst(data[0].u4.x);
data[3].u4.xy = subgroupBroadcastFirst(data[1].u4.xy);
data[3].u4.xyz = subgroupBroadcastFirst(data[2].u4.xyz);
data[3].u4 = subgroupBroadcastFirst(data[3].u4);
data[0].i4.x = int(subgroupBroadcastFirst(data[0].i4.x < 0));
data[0].i4.xy = ivec2(subgroupBroadcastFirst(lessThan(data[1].i4.xy, ivec2(0))));
data[0].i4.xyz = ivec3(subgroupBroadcastFirst(lessThan(data[1].i4.xyz, ivec3(0))));
data[0].i4 = ivec4(subgroupBroadcastFirst(lessThan(data[1].i4, ivec4(0))));
}
}
#version 450
#extension GL_KHR_shader_subgroup_ballot: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
uvec4 relMask = gl_SubgroupEqMask +
gl_SubgroupGeMask +
gl_SubgroupGtMask +
gl_SubgroupLeMask +
gl_SubgroupLtMask;
uvec4 result = subgroupBallot(true);
data[0].u4.x = subgroupBallotBitCount(result);
data[0].u4.y = subgroupBallotBitExtract(result, 0) ? 1u : 0u;
data[0].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);
data[0].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);
data[1].f4.x = subgroupBroadcast(data[0].f4.x, invocation); // ERROR: not constant
}
#version 320 es
#extension GL_KHR_shader_subgroup_basic: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffer
{
int a[];
} data;
void main()
{
data.a[gl_SubgroupSize] = 1;
data.a[gl_SubgroupInvocationID] = 1;
data.a[gl_NumSubgroups] = 1;
data.a[gl_SubgroupID] = (subgroupElect()) ? 1 : 0;
subgroupBarrier();
subgroupMemoryBarrier();
subgroupMemoryBarrierBuffer();
subgroupMemoryBarrierShared();
subgroupMemoryBarrierImage();
}
#version 320 es
#extension GL_KHR_shader_subgroup_clustered: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
data[0].f4.x = subgroupClusteredAdd(data[0].f4.x, 1u);
data[0].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 1u);
data[0].f4.xyz = subgroupClusteredAdd(data[2].f4.xyz, 1u);
data[0].f4 = subgroupClusteredAdd(data[3].f4, 1u);
data[1].i4.x = subgroupClusteredAdd(data[0].i4.x, 1u);
data[1].i4.xy = subgroupClusteredAdd(data[1].i4.xy, 1u);
data[1].i4.xyz = subgroupClusteredAdd(data[2].i4.xyz, 1u);
data[1].i4 = subgroupClusteredAdd(data[3].i4, 1u);
data[2].u4.x = subgroupClusteredAdd(data[0].u4.x, 1u);
data[2].u4.xy = subgroupClusteredAdd(data[1].u4.xy, 1u);
data[2].u4.xyz = subgroupClusteredAdd(data[2].u4.xyz, 1u);
data[2].u4 = subgroupClusteredAdd(data[3].u4, 1u);
data[3].f4.x = subgroupClusteredMul(data[0].f4.x, 1u);
data[3].f4.xy = subgroupClusteredMul(data[1].f4.xy, 1u);
data[3].f4.xyz = subgroupClusteredMul(data[2].f4.xyz, 1u);
data[3].f4 = subgroupClusteredMul(data[3].f4, 1u);
data[0].i4.x = subgroupClusteredMul(data[0].i4.x, 1u);
data[0].i4.xy = subgroupClusteredMul(data[1].i4.xy, 1u);
data[0].i4.xyz = subgroupClusteredMul(data[2].i4.xyz, 1u);
data[0].i4 = subgroupClusteredMul(data[3].i4, 1u);
data[1].u4.x = subgroupClusteredMul(data[0].u4.x, 1u);
data[1].u4.xy = subgroupClusteredMul(data[1].u4.xy, 1u);
data[1].u4.xyz = subgroupClusteredMul(data[2].u4.xyz, 1u);
data[1].u4 = subgroupClusteredMul(data[3].u4, 1u);
data[2].f4.x = subgroupClusteredMin(data[0].f4.x, 1u);
data[2].f4.xy = subgroupClusteredMin(data[1].f4.xy, 1u);
data[2].f4.xyz = subgroupClusteredMin(data[2].f4.xyz, 1u);
data[2].f4 = subgroupClusteredMin(data[3].f4, 1u);
data[3].i4.x = subgroupClusteredMin(data[0].i4.x, 1u);
data[3].i4.xy = subgroupClusteredMin(data[1].i4.xy, 1u);
data[3].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 1u);
data[3].i4 = subgroupClusteredMin(data[3].i4, 1u);
data[0].u4.x = subgroupClusteredMin(data[0].u4.x, 1u);
data[0].u4.xy = subgroupClusteredMin(data[1].u4.xy, 1u);
data[0].u4.xyz = subgroupClusteredMin(data[2].u4.xyz, 1u);
data[0].u4 = subgroupClusteredMin(data[3].u4, 1u);
data[1].f4.x = subgroupClusteredMax(data[0].f4.x, 1u);
data[1].f4.xy = subgroupClusteredMax(data[1].f4.xy, 1u);
data[1].f4.xyz = subgroupClusteredMax(data[2].f4.xyz, 1u);
data[1].f4 = subgroupClusteredMax(data[3].f4, 1u);
data[2].i4.x = subgroupClusteredMax(data[0].i4.x, 1u);
data[2].i4.xy = subgroupClusteredMax(data[1].i4.xy, 1u);
data[2].i4.xyz = subgroupClusteredMax(data[2].i4.xyz, 1u);
data[2].i4 = subgroupClusteredMax(data[3].i4, 1u);
data[3].u4.x = subgroupClusteredMax(data[0].u4.x, 1u);
data[3].u4.xy = subgroupClusteredMax(data[1].u4.xy, 1u);
data[3].u4.xyz = subgroupClusteredMax(data[2].u4.xyz, 1u);
data[3].u4 = subgroupClusteredMax(data[3].u4, 1u);
data[0].i4.x = subgroupClusteredAnd(data[0].i4.x, 1u);
data[0].i4.xy = subgroupClusteredAnd(data[1].i4.xy, 1u);
data[0].i4.xyz = subgroupClusteredAnd(data[2].i4.xyz, 1u);
data[0].i4 = subgroupClusteredAnd(data[3].i4, 1u);
data[1].u4.x = subgroupClusteredAnd(data[0].u4.x, 1u);
data[1].u4.xy = subgroupClusteredAnd(data[1].u4.xy, 1u);
data[1].u4.xyz = subgroupClusteredAnd(data[2].u4.xyz, 1u);
data[1].u4 = subgroupClusteredAnd(data[3].u4, 1u);
data[2].i4.x = int(subgroupClusteredAnd(data[0].i4.x < 0, 1u));
data[2].i4.xy = ivec2(subgroupClusteredAnd(lessThan(data[1].i4.xy, ivec2(0)), 1u));
data[2].i4.xyz = ivec3(subgroupClusteredAnd(lessThan(data[1].i4.xyz, ivec3(0)), 1u));
data[2].i4 = ivec4(subgroupClusteredAnd(lessThan(data[1].i4, ivec4(0)), 1u));
data[3].i4.x = subgroupClusteredOr(data[0].i4.x, 1u);
data[3].i4.xy = subgroupClusteredOr(data[1].i4.xy, 1u);
data[3].i4.xyz = subgroupClusteredOr(data[2].i4.xyz, 1u);
data[3].i4 = subgroupClusteredOr(data[3].i4, 1u);
data[0].u4.x = subgroupClusteredOr(data[0].u4.x, 1u);
data[0].u4.xy = subgroupClusteredOr(data[1].u4.xy, 1u);
data[0].u4.xyz = subgroupClusteredOr(data[2].u4.xyz, 1u);
data[0].u4 = subgroupClusteredOr(data[3].u4, 1u);
data[1].i4.x = int(subgroupClusteredOr(data[0].i4.x < 0, 1u));
data[1].i4.xy = ivec2(subgroupClusteredOr(lessThan(data[1].i4.xy, ivec2(0)), 1u));
data[1].i4.xyz = ivec3(subgroupClusteredOr(lessThan(data[1].i4.xyz, ivec3(0)), 1u));
data[1].i4 = ivec4(subgroupClusteredOr(lessThan(data[1].i4, ivec4(0)), 1u));
data[2].i4.x = subgroupClusteredXor(data[0].i4.x, 1u);
data[2].i4.xy = subgroupClusteredXor(data[1].i4.xy, 1u);
data[2].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, 1u);
data[2].i4 = subgroupClusteredXor(data[3].i4, 1u);
data[3].u4.x = subgroupClusteredXor(data[0].u4.x, 1u);
data[3].u4.xy = subgroupClusteredXor(data[1].u4.xy, 1u);
data[3].u4.xyz = subgroupClusteredXor(data[2].u4.xyz, 1u);
data[3].u4 = subgroupClusteredXor(data[3].u4, 1u);
data[0].i4.x = int(subgroupClusteredXor(data[0].i4.x < 0, 1u));
data[0].i4.xy = ivec2(subgroupClusteredXor(lessThan(data[1].i4.xy, ivec2(0)), 1u));
data[0].i4.xyz = ivec3(subgroupClusteredXor(lessThan(data[1].i4.xyz, ivec3(0)), 1u));
data[0].i4 = ivec4(subgroupClusteredXor(lessThan(data[1].i4, ivec4(0)), 1u));
}
#version 320 es
#extension GL_KHR_shader_subgroup_clustered: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
int a = 1;
const int aConst = 1;
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
data[0].f4.xy = subgroupClusteredAdd(data[1].f4.xy, 0u); // ERROR, less than 1
data[0].f4.x = subgroupClusteredMul(data[0].f4.x, 3u); // ERROR, not a power of 2
data[1].i4.xy = subgroupClusteredMin(data[1].i4.xy, 8u);
data[1].i4.xyz = subgroupClusteredMin(data[2].i4.xyz, 6u); // ERROR, not a power of 2
data[3].i4.x = subgroupClusteredOr(data[0].i4.x, uint(a)); // ERROR, not constant
data[3].i4.xy = subgroupClusteredOr(data[1].i4.xy, uint(aConst));
data[0].i4.x = subgroupClusteredXor(data[0].i4.x, uint(1 + a)); // ERROR, not constant
data[0].i4.xy = subgroupClusteredXor(data[1].i4.xy, uint(aConst + a)); // ERROR, not constant
data[0].i4.xyz = subgroupClusteredXor(data[2].i4.xyz, uint(1 + aConst));
}
#version 320 es
#extension GL_KHR_shader_subgroup_quad: enable
layout (local_size_x = 8) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
data[0].f4.x = subgroupQuadBroadcast(data[0].f4.x, 1u);
data[0].f4.xy = subgroupQuadBroadcast(data[1].f4.xy, 1u);
data[0].f4.xyz = subgroupQuadBroadcast(data[2].f4.xyz, 1u);
data[0].f4 = subgroupQuadBroadcast(data[3].f4, 1u);
data[0].i4.x = subgroupQuadBroadcast(data[0].i4.x, 1u);
data[0].i4.xy = subgroupQuadBroadcast(data[1].i4.xy, 1u);
data[0].i4.xyz = subgroupQuadBroadcast(data[2].i4.xyz, 1u);
data[0].i4 = subgroupQuadBroadcast(data[3].i4, 1u);
data[0].u4.x = subgroupQuadBroadcast(data[0].u4.x, 1u);
data[0].u4.xy = subgroupQuadBroadcast(data[1].u4.xy, 1u);
data[0].u4.xyz = subgroupQuadBroadcast(data[2].u4.xyz, 1u);
data[0].u4 = subgroupQuadBroadcast(data[3].u4, 1u);
data[1].i4.x = int(subgroupQuadBroadcast(data[0].i4.x < 0, 1u));
data[1].i4.xy = ivec2(subgroupQuadBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1u));
data[1].i4.xyz = ivec3(subgroupQuadBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1u));
data[1].i4 = ivec4(subgroupQuadBroadcast(lessThan(data[1].i4, ivec4(0)), 1u));
data[1].f4.x = subgroupQuadSwapHorizontal(data[0].f4.x);
data[1].f4.xy = subgroupQuadSwapHorizontal(data[1].f4.xy);
data[1].f4.xyz = subgroupQuadSwapHorizontal(data[2].f4.xyz);
data[1].f4 = subgroupQuadSwapHorizontal(data[3].f4);
data[1].i4.x = subgroupQuadSwapHorizontal(data[0].i4.x);
data[1].i4.xy = subgroupQuadSwapHorizontal(data[1].i4.xy);
data[1].i4.xyz = subgroupQuadSwapHorizontal(data[2].i4.xyz);
data[1].i4 = subgroupQuadSwapHorizontal(data[3].i4);
data[1].u4.x = subgroupQuadSwapHorizontal(data[0].u4.x);
data[1].u4.xy = subgroupQuadSwapHorizontal(data[1].u4.xy);
data[1].u4.xyz = subgroupQuadSwapHorizontal(data[2].u4.xyz);
data[1].u4 = subgroupQuadSwapHorizontal(data[3].u4);
data[2].i4.x = int(subgroupQuadSwapHorizontal(data[0].i4.x < 0));
data[2].i4.xy = ivec2(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xy, ivec2(0))));
data[2].i4.xyz = ivec3(subgroupQuadSwapHorizontal(lessThan(data[1].i4.xyz, ivec3(0))));
data[2].i4 = ivec4(subgroupQuadSwapHorizontal(lessThan(data[1].i4, ivec4(0))));
data[2].f4.x = subgroupQuadSwapVertical(data[0].f4.x);
data[2].f4.xy = subgroupQuadSwapVertical(data[1].f4.xy);
data[2].f4.xyz = subgroupQuadSwapVertical(data[2].f4.xyz);
data[2].f4 = subgroupQuadSwapVertical(data[3].f4);
data[2].i4.x = subgroupQuadSwapVertical(data[0].i4.x);
data[2].i4.xy = subgroupQuadSwapVertical(data[1].i4.xy);
data[2].i4.xyz = subgroupQuadSwapVertical(data[2].i4.xyz);
data[2].i4 = subgroupQuadSwapVertical(data[3].i4);
data[2].u4.x = subgroupQuadSwapVertical(data[0].u4.x);
data[2].u4.xy = subgroupQuadSwapVertical(data[1].u4.xy);
data[2].u4.xyz = subgroupQuadSwapVertical(data[2].u4.xyz);
data[2].u4 = subgroupQuadSwapVertical(data[3].u4);
data[3].i4.x = int(subgroupQuadSwapVertical(data[0].i4.x < 0));
data[3].i4.xy = ivec2(subgroupQuadSwapVertical(lessThan(data[1].i4.xy, ivec2(0))));
data[3].i4.xyz = ivec3(subgroupQuadSwapVertical(lessThan(data[1].i4.xyz, ivec3(0))));
data[3].i4 = ivec4(subgroupQuadSwapVertical(lessThan(data[1].i4, ivec4(0))));
data[3].f4.x = subgroupQuadSwapDiagonal(data[0].f4.x);
data[3].f4.xy = subgroupQuadSwapDiagonal(data[1].f4.xy);
data[3].f4.xyz = subgroupQuadSwapDiagonal(data[2].f4.xyz);
data[3].f4 = subgroupQuadSwapDiagonal(data[3].f4);
data[3].i4.x = subgroupQuadSwapDiagonal(data[0].i4.x);
data[3].i4.xy = subgroupQuadSwapDiagonal(data[1].i4.xy);
data[3].i4.xyz = subgroupQuadSwapDiagonal(data[2].i4.xyz);
data[3].i4 = subgroupQuadSwapDiagonal(data[3].i4);
data[3].u4.x = subgroupQuadSwapDiagonal(data[0].u4.x);
data[3].u4.xy = subgroupQuadSwapDiagonal(data[1].u4.xy);
data[3].u4.xyz = subgroupQuadSwapDiagonal(data[2].u4.xyz);
data[3].u4 = subgroupQuadSwapDiagonal(data[3].u4);
data[3].i4.x = int(subgroupQuadSwapDiagonal(data[0].i4.x < 0));
data[3].i4.xy = ivec2(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xy, ivec2(0))));
data[3].i4.xyz = ivec3(subgroupQuadSwapDiagonal(lessThan(data[1].i4.xyz, ivec3(0))));
data[3].i4 = ivec4(subgroupQuadSwapDiagonal(lessThan(data[1].i4, ivec4(0))));
}
#version 320 es
#extension GL_KHR_shader_subgroup_shuffle: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
data[0].f4.x = subgroupShuffle(data[0].f4.x, invocation);
data[0].f4.xy = subgroupShuffle(data[1].f4.xy, invocation);
data[0].f4.xyz = subgroupShuffle(data[2].f4.xyz, invocation);
data[0].f4 = subgroupShuffle(data[3].f4, invocation);
data[0].i4.x = subgroupShuffle(data[0].i4.x, invocation);
data[0].i4.xy = subgroupShuffle(data[1].i4.xy, invocation);
data[0].i4.xyz = subgroupShuffle(data[2].i4.xyz, invocation);
data[0].i4 = subgroupShuffle(data[3].i4, invocation);
data[1].u4.x = subgroupShuffle(data[0].u4.x, invocation);
data[1].u4.xy = subgroupShuffle(data[1].u4.xy, invocation);
data[1].u4.xyz = subgroupShuffle(data[2].u4.xyz, invocation);
data[1].u4 = subgroupShuffle(data[3].u4, invocation);
data[1].i4.x = int(subgroupShuffle(data[0].i4.x < 0, invocation));
data[1].i4.xy = ivec2(subgroupShuffle(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[1].i4.xyz = ivec3(subgroupShuffle(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[1].i4 = ivec4(subgroupShuffle(lessThan(data[1].i4, ivec4(0)), invocation));
data[2].f4.x = subgroupShuffleXor(data[0].f4.x, invocation);
data[2].f4.xy = subgroupShuffleXor(data[1].f4.xy, invocation);
data[2].f4.xyz = subgroupShuffleXor(data[2].f4.xyz, invocation);
data[2].f4 = subgroupShuffleXor(data[3].f4, invocation);
data[2].i4.x = subgroupShuffleXor(data[0].i4.x, invocation);
data[2].i4.xy = subgroupShuffleXor(data[1].i4.xy, invocation);
data[2].i4.xyz = subgroupShuffleXor(data[2].i4.xyz, invocation);
data[2].i4 = subgroupShuffleXor(data[3].i4, invocation);
data[3].u4.x = subgroupShuffleXor(data[0].u4.x, invocation);
data[3].u4.xy = subgroupShuffleXor(data[1].u4.xy, invocation);
data[3].u4.xyz = subgroupShuffleXor(data[2].u4.xyz, invocation);
data[3].u4 = subgroupShuffleXor(data[3].u4, invocation);
data[3].i4.x = int(subgroupShuffleXor(data[0].i4.x < 0, invocation));
data[3].i4.xy = ivec2(subgroupShuffleXor(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[3].i4.xyz = ivec3(subgroupShuffleXor(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[3].i4 = ivec4(subgroupShuffleXor(lessThan(data[1].i4, ivec4(0)), invocation));
}
#version 320 es
#extension GL_KHR_shader_subgroup_shuffle_relative: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
data[0].f4.x = subgroupShuffleUp(data[0].f4.x, invocation);
data[0].f4.xy = subgroupShuffleUp(data[1].f4.xy, invocation);
data[0].f4.xyz = subgroupShuffleUp(data[2].f4.xyz, invocation);
data[0].f4 = subgroupShuffleUp(data[3].f4, invocation);
data[0].i4.x = subgroupShuffleUp(data[0].i4.x, invocation);
data[0].i4.xy = subgroupShuffleUp(data[1].i4.xy, invocation);
data[0].i4.xyz = subgroupShuffleUp(data[2].i4.xyz, invocation);
data[0].i4 = subgroupShuffleUp(data[3].i4, invocation);
data[1].u4.x = subgroupShuffleUp(data[0].u4.x, invocation);
data[1].u4.xy = subgroupShuffleUp(data[1].u4.xy, invocation);
data[1].u4.xyz = subgroupShuffleUp(data[2].u4.xyz, invocation);
data[1].u4 = subgroupShuffleUp(data[3].u4, invocation);
data[1].i4.x = int(subgroupShuffleUp(data[0].i4.x < 0, invocation));
data[1].i4.xy = ivec2(subgroupShuffleUp(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[1].i4.xyz = ivec3(subgroupShuffleUp(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[1].i4 = ivec4(subgroupShuffleUp(lessThan(data[1].i4, ivec4(0)), invocation));
data[2].f4.x = subgroupShuffleDown(data[0].f4.x, invocation);
data[2].f4.xy = subgroupShuffleDown(data[1].f4.xy, invocation);
data[2].f4.xyz = subgroupShuffleDown(data[2].f4.xyz, invocation);
data[2].f4 = subgroupShuffleDown(data[3].f4, invocation);
data[2].i4.x = subgroupShuffleDown(data[0].i4.x, invocation);
data[2].i4.xy = subgroupShuffleDown(data[1].i4.xy, invocation);
data[2].i4.xyz = subgroupShuffleDown(data[2].i4.xyz, invocation);
data[2].i4 = subgroupShuffleDown(data[3].i4, invocation);
data[3].u4.x = subgroupShuffleDown(data[0].u4.x, invocation);
data[3].u4.xy = subgroupShuffleDown(data[1].u4.xy, invocation);
data[3].u4.xyz = subgroupShuffleDown(data[2].u4.xyz, invocation);
data[3].u4 = subgroupShuffleDown(data[3].u4, invocation);
data[3].i4.x = int(subgroupShuffleDown(data[0].i4.x < 0, invocation));
data[3].i4.xy = ivec2(subgroupShuffleDown(lessThan(data[1].i4.xy, ivec2(0)), invocation));
data[3].i4.xyz = ivec3(subgroupShuffleDown(lessThan(data[1].i4.xyz, ivec3(0)), invocation));
data[3].i4 = ivec4(subgroupShuffleDown(lessThan(data[1].i4, ivec4(0)), invocation));
}
#version 320 es
#extension GL_KHR_shader_subgroup_vote: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
int r;
} data[4];
void main()
{
uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4u;
if (subgroupAll(data[0].r < 0))
{
data[0].r = int(subgroupAllEqual(data[0].f4.x));
data[0].r = int(subgroupAllEqual(data[1].f4.xy));
data[0].r = int(subgroupAllEqual(data[2].f4.xyz));
data[0].r = int(subgroupAllEqual(data[3].f4));
data[0].r = int(subgroupAllEqual(data[0].i4.x));
data[0].r = int(subgroupAllEqual(data[1].i4.xy));
data[0].r = int(subgroupAllEqual(data[2].i4.xyz));
data[0].r = int(subgroupAllEqual(data[3].i4));
data[0].r = int(subgroupAllEqual(data[0].u4.x));
data[0].r = int(subgroupAllEqual(data[1].u4.xy));
data[0].r = int(subgroupAllEqual(data[2].u4.xyz));
data[0].r = int(subgroupAllEqual(data[3].u4));
}
else if (subgroupAny(data[1].r < 0))
{
data[1].r = int(int(subgroupAllEqual(data[0].i4.x < 0)));
data[1].r = int(ivec2(subgroupAllEqual(lessThan(data[1].i4.xy, ivec2(0)))));
data[1].r = int(ivec3(subgroupAllEqual(lessThan(data[1].i4.xyz, ivec3(0)))));
data[1].r = int(ivec4(subgroupAllEqual(lessThan(data[1].i4, ivec4(0)))));
}
}
......@@ -1873,7 +1873,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
commonBuiltins.append(
"void subgroupBarrier();"
"void subgroupMemoryBarrier();"
......@@ -6126,7 +6127,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
const char* ballotDecls =
"in mediump uint gl_SubgroupSize;"
"in mediump uint gl_SubgroupInvocationID;"
......@@ -8160,7 +8162,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
......@@ -8479,7 +8482,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
......@@ -8663,7 +8667,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
......@@ -8690,7 +8695,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
......@@ -8859,7 +8865,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
......@@ -8948,7 +8955,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
......@@ -9365,7 +9373,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
}
// GL_KHR_shader_subgroup
if (spvVersion.vulkan > 0) {
if ((profile == EEsProfile && version >= 310) ||
(profile != EEsProfile && version >= 140)) {
symbolTable.relateToOperator("subgroupBarrier", EOpSubgroupBarrier);
symbolTable.relateToOperator("subgroupMemoryBarrier", EOpSubgroupMemoryBarrier);
symbolTable.relateToOperator("subgroupMemoryBarrierBuffer", EOpSubgroupMemoryBarrierBuffer);
......
......@@ -236,7 +236,39 @@ INSTANTIATE_TEST_CASE_P(
"precise_struct_block.vert",
"maxClipDistances.vert",
"findFunction.frag",
"constantUnaryConversion.comp"
"constantUnaryConversion.comp",
"glsl.450.subgroup.frag",
"glsl.450.subgroup.geom",
"glsl.450.subgroup.tesc",
"glsl.450.subgroup.tese",
"glsl.450.subgroup.vert",
"glsl.450.subgroupArithmetic.comp",
"glsl.450.subgroupBasic.comp",
"glsl.450.subgroupBallot.comp",
"glsl.450.subgroupBallotNeg.comp",
"glsl.450.subgroupClustered.comp",
"glsl.450.subgroupClusteredNeg.comp",
"glsl.450.subgroupPartitioned.comp",
"glsl.450.subgroupShuffle.comp",
"glsl.450.subgroupShuffleRelative.comp",
"glsl.450.subgroupQuad.comp",
"glsl.450.subgroupVote.comp",
"glsl.es320.subgroup.frag",
"glsl.es320.subgroup.geom",
"glsl.es320.subgroup.tesc",
"glsl.es320.subgroup.tese",
"glsl.es320.subgroup.vert",
"glsl.es320.subgroupArithmetic.comp",
"glsl.es320.subgroupBasic.comp",
"glsl.es320.subgroupBallot.comp",
"glsl.es320.subgroupBallotNeg.comp",
"glsl.es320.subgroupClustered.comp",
"glsl.es320.subgroupClusteredNeg.comp",
"glsl.es320.subgroupPartitioned.comp",
"glsl.es320.subgroupShuffle.comp",
"glsl.es320.subgroupShuffleRelative.comp",
"glsl.es320.subgroupQuad.comp",
"glsl.es320.subgroupVote.comp",
})),
FileNameAsCustomTestSuffix
);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment