Skip to content

Commit efee021

Browse files
committed
GLSL: Add partial support for NV_cluster_acceleration_structure.
1 parent d8e3e2b commit efee021

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
@@ -617,6 +617,13 @@ void CompilerGLSL::find_static_extensions()
617617
ray_tracing_is_khr = true;
618618
break;
619619

620+
case CapabilityRayTracingClusterAccelerationStructureNV:
621+
if (options.es || options.version < 460 || !options.vulkan_semantics)
622+
SPIRV_CROSS_THROW("Cluster AS requires Vulkan GLSL 460.");
623+
require_extension_internal("GL_NV_cluster_acceleration_structure");
624+
ray_tracing_is_khr = true;
625+
break;
626+
620627
case CapabilityTensorsARM:
621628
if (options.es || options.version < 460 || !options.vulkan_semantics)
622629
SPIRV_CROSS_THROW("Tensor requires Vulkan GLSL 460.");
@@ -10305,6 +10312,14 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)
1030510312
case BuiltInCullPrimitiveEXT:
1030610313
return "gl_CullPrimitiveEXT";
1030710314

10315+
case BuiltInClusterIDNV:
10316+
{
10317+
if (!options.vulkan_semantics)
10318+
SPIRV_CROSS_THROW("Can only use ClusterIDNV in Vulkan GLSL.");
10319+
require_extension_internal("GL_NV_cluster_acceleration_structure");
10320+
return "gl_ClusterIDNV";
10321+
}
10322+
1030810323
default:
1030910324
return join("gl_BuiltIn_", convert_to_string(builtin));
1031010325
}
@@ -15455,6 +15470,10 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
1545515470
GLSL_RAY_QUERY_GET_OP2(IntersectionWorldToObject);
1545615471
#undef GLSL_RAY_QUERY_GET_OP
1545715472
#undef GLSL_RAY_QUERY_GET_OP2
15473+
case OpRayQueryGetClusterIdNV:
15474+
flush_variable_declaration(ops[2]);
15475+
emit_op(ops[0], ops[1], join("rayQueryGetIntersectionClusterIdNV(", to_expression(ops[2]), ", ", "bool(", to_expression(ops[3]), "))"), false);
15476+
break;
1545815477
case OpTensorQuerySizeARM:
1545915478
flush_variable_declaration(ops[1]);
1546015479
// tensorSizeARM(tensor, dimension)

0 commit comments

Comments
 (0)