Modern Extensions

Subgroups are hardware execution groups (32 on NVIDIA, 32/64 on AMD, variable on others).

33.1 Subgroup (wave/warp) operations

Subgroups are hardware execution groups (32 on NVIDIA, 32/64 on AMD, variable on others). GL_KHR_shader_subgroup_*:

Uses: fast reductions (fewer barriers and atomics), stream compaction, culling, scalarization of non-uniform resource indices.

#extension GL_KHR_shader_subgroup_arithmetic : require
#extension GL_KHR_shader_subgroup_ballot : require
float total = subgroupAdd(value);                    // reduction across the subgroup
float prefix = subgroupInclusiveAdd(value);           // scan
bool anyHit = subgroupAny(hit);
uvec4 ballot = subgroupBallot(cond);
uint count = subgroupBallotBitCount(ballot);
float first = subgroupBroadcastFirst(value);
float neighbor = subgroupShuffleXor(value, 1u);       // GL_KHR_shader_subgroup_shuffle
if (subgroupElect()) { /* one invocation per subgroup */ }
gl_SubgroupSize; gl_SubgroupInvocationID;

33.2 Bindless resources

OpenGL: GL_ARB_bindless_texture (uvec2 handles stored in buffers → sampler2D(handle)).

Vulkan: descriptor indexing with large arrays of textures/buffers and nonuniformEXT, or descriptor buffers.

Enables GPU-driven rendering where materials index textures dynamically.

33.3 Mesh & task shaders (GL_EXT_mesh_shader, GL_NV_mesh_shader)

Compute-like stages replacing the vertex/tessellation/geometry pipeline: task shaders cull/amplify work; mesh shaders output small meshlets (up to 256 vertices/primitives).

Benefits: fine-grained GPU culling (per-meshlet frustum/cone/occlusion), procedural geometry, better scalability (used by Nanite-style renderers).

#version 450
#extension GL_EXT_mesh_shader : require
layout (local_size_x = 32) in;
layout (triangles, max_vertices = 64, max_primitives = 124) out;

layout (location = 0) out vec3 vColor[];

void main() {
    uint meshlet = gl_WorkGroupID.x;
    // ... load meshlet vertices/indices from SSBOs, per-invocation work ...
    SetMeshOutputsEXT(numVerts, numPrims);
    // gl_MeshVerticesEXT[i].gl_Position = ...;  gl_PrimitiveTriangleIndicesEXT[j] = uvec3(a, b, c);
}

33.4 Hardware ray tracing (GL_EXT_ray_tracing, Vulkan)

Shader stages: ray generation (.rgen), closest hit (.rchit), any hit (.rahit), miss (.rmiss), intersection (.rint), callable (.rcall).

Ray queries (GL_EXT_ray_query) allow tracing rays inline from any stage (e.g., ray-traced shadows in a fragment or compute shader):

// raygen.rgen
#version 460
#extension GL_EXT_ray_tracing : require
layout (set = 0, binding = 0) uniform accelerationStructureEXT topLevelAS;
layout (set = 0, binding = 1, rgba8) uniform image2D outImage;
layout (location = 0) rayPayloadEXT vec3 payload;

void main() {
    vec2 uv = (vec2(gl_LaunchIDEXT.xy) + 0.5) / vec2(gl_LaunchSizeEXT.xy) * 2.0 - 1.0;
    vec3 origin = vec3(0, 0, -3), dir = normalize(vec3(uv, 1.5));
    traceRayEXT(topLevelAS, gl_RayFlagsOpaqueEXT, 0xFF, 0, 0, 0, origin, 0.001, dir, 100.0, 0);
    imageStore(outImage, ivec2(gl_LaunchIDEXT.xy), vec4(payload, 1.0));
}

// closesthit.rchit
#version 460
#extension GL_EXT_ray_tracing : require
layout (location = 0) rayPayloadInEXT vec3 payload;
hitAttributeEXT vec2 bary;
void main() {
    vec3 b = vec3(1.0 - bary.x - bary.y, bary.x, bary.y);
    payload = b;                                // visualize barycentrics
}

// miss.rmiss
#version 460
#extension GL_EXT_ray_tracing : require
layout (location = 0) rayPayloadInEXT vec3 payload;
void main() { payload = vec3(0.2, 0.3, 0.5); }
rayQueryEXT rq;
rayQueryInitializeEXT(rq, topLevelAS, gl_RayFlagsTerminateOnFirstHitEXT, 0xFF, pos, 0.01, lightDir, 1000.0);
while (rayQueryProceedEXT(rq)) {}
bool shadowed = rayQueryGetIntersectionTypeEXT(rq, true) != gl_RayQueryCommittedIntersectionNoneEXT;

33.5 Other notable extensions

Variable rate shading (GL_EXT_fragment_shading_rate), fragment shader interlock (GL_ARB_fragment_shader_interlock for programmable blending/OIT), sparse textures, shader clock (GL_ARB_shader_clock for profiling), demote to helper invocation, 16-bit/8-bit storage & arithmetic, cooperative matrices (GL_KHR_cooperative_matrix for matrix units), GL_EXT_debug_printf (printf from shaders in Vulkan).