68908355a9
Add support for declaring a fixed subgroup size. Metal, like Vulkan with `VK_EXT_subgroup_size_control`, allows the thread execution width to vary depending on factors such as register usage. Unfortunately, this breaks several tests that depend on the subgroup size being what the device says it is. So we'll fix the subgroup size at the size the device declares. The extra invocations in the subgroup will appear to be inactive. Because of this, the ballot mask builtins are now ANDed with the active subgroup mask. Add support for emulating a subgroup of size 1. This is intended to be used by Vulkan Portability implementations (e.g. MoltenVK) when the hardware/software combo provides insufficient support for subgroups. Luckily for us, Vulkan 1.1 only requires that the subgroup size be at least 1. Add support for quadgroup and SIMD-group functions which were added to iOS in Metal 2.2 and 2.3. This will allow clients to take advantage of expanded quadgroup and SIMD-group support in recent Metal versions and on recent Apple GPUs (families 6 and 7). Gut emulation of subgroup builtins in fragment shaders. It turns out codegen for the SIMD-group functions in fragment wasn't implemented for AMD on Mojave; it's a safe bet that it wasn't implemented for the other drivers either. Subgroup support in fragment shaders now requires Metal 2.2.
26 lines
556 B
Plaintext
26 lines
556 B
Plaintext
#version 450
|
|
#extension GL_KHR_shader_subgroup_basic : require
|
|
layout(local_size_x = 1) in;
|
|
|
|
layout(std430, binding = 0) buffer SSBO
|
|
{
|
|
float FragColor;
|
|
};
|
|
|
|
// Reduced test for emulated functionality.
|
|
|
|
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();
|
|
}
|