Skip to content

Commit 256192e

Browse files
Merge pull request #2499 from Saancreed/glsl-nv-cluster-acceleration-structure
GLSL: Add partial support for NV_cluster_acceleration_structure.
2 parents 8245791 + efee021 commit 256192e

File tree

7 files changed

+219
-0
lines changed

7 files changed

+219
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#version 460
2+
#extension GL_EXT_ray_tracing : require
3+
#extension GL_NV_cluster_acceleration_structure : require
4+
5+
layout(location = 0) rayPayloadInEXT int payload;
6+
7+
void main()
8+
{
9+
payload = gl_ClusterIDNV;
10+
}
11+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#version 460
2+
#extension GL_EXT_ray_query : require
3+
#extension GL_NV_cluster_acceleration_structure : require
4+
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
5+
6+
layout(set = 0, binding = 1, std140) uniform Params
7+
{
8+
uint ray_flags;
9+
uint cull_mask;
10+
vec3 origin;
11+
float tmin;
12+
vec3 dir;
13+
float tmax;
14+
} _18;
15+
16+
layout(set = 0, binding = 2, std430) buffer SSBO
17+
{
18+
int id;
19+
} _68;
20+
21+
layout(set = 0, binding = 0) uniform accelerationStructureEXT AS;
22+
23+
rayQueryEXT q;
24+
25+
void main()
26+
{
27+
rayQueryInitializeEXT(q, AS, _18.ray_flags, _18.cull_mask, _18.origin, _18.tmin, _18.dir, _18.tmax);
28+
for (;;)
29+
{
30+
bool _47 = rayQueryProceedEXT(q);
31+
if (_47)
32+
{
33+
uint _49 = rayQueryGetIntersectionTypeEXT(q, bool(0));
34+
bool _51 = _49 == 0u;
35+
bool _57;
36+
if (_51)
37+
{
38+
int _54 = rayQueryGetIntersectionClusterIdNV(q, bool(0));
39+
_57 = _54 != (-1);
40+
}
41+
else
42+
{
43+
_57 = _51;
44+
}
45+
if (_57)
46+
{
47+
rayQueryTerminateEXT(q);
48+
rayQueryConfirmIntersectionEXT(q);
49+
}
50+
continue;
51+
}
52+
else
53+
{
54+
break;
55+
}
56+
}
57+
uint _61 = rayQueryGetIntersectionTypeEXT(q, bool(1));
58+
if (_61 == 1u)
59+
{
60+
int _69 = rayQueryGetIntersectionClusterIdNV(q, bool(1));
61+
_68.id = _69;
62+
}
63+
}
64+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#version 460
2+
#extension GL_EXT_ray_tracing : require
3+
#extension GL_NV_cluster_acceleration_structure : require
4+
5+
layout(location = 0) rayPayloadInEXT int payload;
6+
7+
void main()
8+
{
9+
payload = gl_ClusterIDNV;
10+
}
11+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#version 460
2+
#extension GL_EXT_ray_query : require
3+
#extension GL_NV_cluster_acceleration_structure : require
4+
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
5+
6+
layout(set = 0, binding = 1, std140) uniform Params
7+
{
8+
uint ray_flags;
9+
uint cull_mask;
10+
vec3 origin;
11+
float tmin;
12+
vec3 dir;
13+
float tmax;
14+
} _18;
15+
16+
layout(set = 0, binding = 2, std430) buffer SSBO
17+
{
18+
int id;
19+
} _68;
20+
21+
layout(set = 0, binding = 0) uniform accelerationStructureEXT AS;
22+
23+
rayQueryEXT q;
24+
25+
void main()
26+
{
27+
rayQueryInitializeEXT(q, AS, _18.ray_flags, _18.cull_mask, _18.origin, _18.tmin, _18.dir, _18.tmax);
28+
for (;;)
29+
{
30+
bool _47 = rayQueryProceedEXT(q);
31+
if (_47)
32+
{
33+
uint _49 = rayQueryGetIntersectionTypeEXT(q, bool(0));
34+
bool _51 = _49 == 0u;
35+
bool _57;
36+
if (_51)
37+
{
38+
int _54 = rayQueryGetIntersectionClusterIdNV(q, bool(0));
39+
_57 = _54 != (-1);
40+
}
41+
else
42+
{
43+
_57 = _51;
44+
}
45+
if (_57)
46+
{
47+
rayQueryTerminateEXT(q);
48+
rayQueryConfirmIntersectionEXT(q);
49+
}
50+
continue;
51+
}
52+
else
53+
{
54+
break;
55+
}
56+
}
57+
uint _61 = rayQueryGetIntersectionTypeEXT(q, bool(1));
58+
if (_61 == 1u)
59+
{
60+
int _69 = rayQueryGetIntersectionClusterIdNV(q, bool(1));
61+
_68.id = _69;
62+
}
63+
}
64+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#version 460
2+
#extension GL_EXT_ray_tracing : require
3+
#extension GL_NV_cluster_acceleration_structure : require
4+
5+
rayPayloadInEXT int payload;
6+
7+
void main()
8+
{
9+
payload = gl_ClusterIDNV;
10+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#version 460
2+
#extension GL_EXT_ray_query : require
3+
#extension GL_EXT_ray_tracing : require
4+
#extension GL_NV_cluster_acceleration_structure : require
5+
6+
layout(set = 0, binding = 0) uniform accelerationStructureEXT AS;
7+
8+
layout(set = 0, binding = 1) uniform Params
9+
{
10+
uint ray_flags;
11+
uint cull_mask;
12+
vec3 origin;
13+
float tmin;
14+
vec3 dir;
15+
float tmax;
16+
};
17+
18+
layout(set = 0, binding = 2) buffer SSBO
19+
{
20+
int id;
21+
};
22+
23+
void main()
24+
{
25+
rayQueryEXT q;
26+
rayQueryInitializeEXT(q, AS, ray_flags, cull_mask, origin, tmin, dir, tmax);
27+
28+
while (rayQueryProceedEXT(q))
29+
{
30+
if (rayQueryGetIntersectionTypeEXT(q, false) == gl_RayQueryCandidateIntersectionTriangleEXT
31+
&& rayQueryGetIntersectionClusterIdNV(q, false) != gl_ClusterIDNoneNV)
32+
{
33+
rayQueryTerminateEXT(q);
34+
rayQueryConfirmIntersectionEXT(q);
35+
}
36+
}
37+
38+
if (rayQueryGetIntersectionTypeEXT(q, true) == gl_RayQueryCommittedIntersectionTriangleEXT)
39+
id = rayQueryGetIntersectionClusterIdNV(q, true);
40+
}

spirv_glsl.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,13 @@ void CompilerGLSL::find_static_extensions()
661661
ray_tracing_is_khr = true;
662662
break;
663663

664+
case CapabilityRayTracingClusterAccelerationStructureNV:
665+
if (options.es || options.version < 460 || !options.vulkan_semantics)
666+
SPIRV_CROSS_THROW("Cluster AS requires Vulkan GLSL 460.");
667+
require_extension_internal("GL_NV_cluster_acceleration_structure");
668+
ray_tracing_is_khr = true;
669+
break;
670+
664671
case CapabilityTensorsARM:
665672
if (options.es || options.version < 460 || !options.vulkan_semantics)
666673
SPIRV_CROSS_THROW("Tensor requires Vulkan GLSL 460.");
@@ -10349,6 +10356,14 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)
1034910356
case BuiltInCullPrimitiveEXT:
1035010357
return "gl_CullPrimitiveEXT";
1035110358

10359+
case BuiltInClusterIDNV:
10360+
{
10361+
if (!options.vulkan_semantics)
10362+
SPIRV_CROSS_THROW("Can only use ClusterIDNV in Vulkan GLSL.");
10363+
require_extension_internal("GL_NV_cluster_acceleration_structure");
10364+
return "gl_ClusterIDNV";
10365+
}
10366+
1035210367
default:
1035310368
return join("gl_BuiltIn_", convert_to_string(builtin));
1035410369
}
@@ -15499,6 +15514,10 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
1549915514
GLSL_RAY_QUERY_GET_OP2(IntersectionWorldToObject);
1550015515
#undef GLSL_RAY_QUERY_GET_OP
1550115516
#undef GLSL_RAY_QUERY_GET_OP2
15517+
case OpRayQueryGetClusterIdNV:
15518+
flush_variable_declaration(ops[2]);
15519+
emit_op(ops[0], ops[1], join("rayQueryGetIntersectionClusterIdNV(", to_expression(ops[2]), ", ", "bool(", to_expression(ops[3]), "))"), false);
15520+
break;
1550215521
case OpTensorQuerySizeARM:
1550315522
flush_variable_declaration(ops[1]);
1550415523
// tensorSizeARM(tensor, dimension)

0 commit comments

Comments
 (0)