Skip to content

Commit 520e26f

Browse files
committed
Simplify EX31 precompiled variants
1 parent 7b6c154 commit 520e26f

15 files changed

Lines changed: 196 additions & 275 deletions

31_HLSLPathTracer/CMakeLists.txt

Lines changed: 13 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,13 @@ include("${CMAKE_CURRENT_SOURCE_DIR}/pt.cmake")
33
include("${CMAKE_CURRENT_SOURCE_DIR}/pt.variant_ids.cmake")
44

55
if(NBL_BUILD_IMGUI)
6-
# PT_BUILD_MODE controls how EX31 packages triangle polygon-method variants.
7-
# WALLTIME_OPTIMIZED keeps triangle polygon-method selection inside one shared shader module.
8-
# This preserves the same runtime feature surface while keeping triangle methods on one heavy backend compile path.
9-
# SPECIALIZED bakes Area, SolidAngle and ProjectedSolidAngle into separate triangle entrypoints.
10-
# That does not add only thin entrypoints. It multiplies the heavy triangle-side path tracing instantiations and pushes more work into the DXC/SPIR-V backend.
6+
# EX31 keeps triangle polygon-method variants as separate precompiled entrypoints.
7+
# This keeps polygon-method choice compile-time and avoids runtime shader switching on this axis.
118
# On AMD Ryzen 5 5600G with Radeon Graphics (6C/12T),
12-
# a Visual Studio Debug x64 full rebuild of the SPIR-V project completed in:
13-
# WALLTIME_OPTIMIZED = 12.785 s
14-
# SPECIALIZED = 18.314 s
15-
# SPECIALIZED is +5.529 s slower which is +43.25%.
16-
# Equivalently, WALLTIME_OPTIMIZED is 30.19% faster than SPECIALIZED.
17-
# This comes from multiplying the heavy triangle-side path tracing instantiations
18-
# and pushing more work into the DXC/SPIR-V backend.
19-
# Therefore the default stays WALLTIME_OPTIMIZED.
20-
set(PT_BUILD_MODE "WALLTIME_OPTIMIZED" CACHE STRING
21-
"Choose the EX31 precompiled shader layout. WALLTIME_OPTIMIZED keeps polygon-method selection inside the shared triangle shader module to reduce compile wall time. SPECIALIZED bakes triangle polygon methods into distinct entrypoints, which increases backend work and rebuild time but keeps those variants as separate precompiled entrypoints."
22-
)
9+
# a Visual Studio Debug x64 full rebuild of the SPIR-V project completed in about 19.789 s.
2310
set(PT_CACHE_ROOT "pipeline/cache" CACHE STRING
2411
"Relative cache root written to path_tracer.runtime.json in the common bin directory. The runtime resolves this path relative to the JSON file location. Empty disables the generated dev-mode JSON and falls back to --pipeline-cache-dir or LocalAppData."
2512
)
26-
set_property(CACHE PT_BUILD_MODE PROPERTY STRINGS WALLTIME_OPTIMIZED SPECIALIZED)
27-
set(_PT_BUILD_MODE_VALUES WALLTIME_OPTIMIZED SPECIALIZED)
28-
if(NOT PT_BUILD_MODE IN_LIST _PT_BUILD_MODE_VALUES)
29-
message(FATAL_ERROR "Unsupported PT_BUILD_MODE='${PT_BUILD_MODE}'. Expected one of: ${_PT_BUILD_MODE_VALUES}")
30-
endif()
3113
if(IS_ABSOLUTE "${PT_CACHE_ROOT}")
3214
message(FATAL_ERROR "PT_CACHE_ROOT must stay relative because the runtime resolves it against path_tracer.runtime.json")
3315
endif()
@@ -45,12 +27,7 @@ if(NBL_BUILD_IMGUI)
4527
nbl_create_executable_project("" "" "${NBL_INCLUDE_SERACH_DIRECTORIES}" "${NBL_LIBRARIES}" "${NBL_EXECUTABLE_PROJECT_CREATION_PCH_TARGET}")
4628
add_dependencies(${EXECUTABLE_NAME} argparse)
4729
target_include_directories(${EXECUTABLE_NAME} PUBLIC $<TARGET_PROPERTY:argparse,INTERFACE_INCLUDE_DIRECTORIES>)
48-
target_compile_definitions(${EXECUTABLE_NAME} PRIVATE PT_BUILD_CONFIG_NAME=\"$<CONFIG>\")
49-
if(PT_BUILD_MODE STREQUAL "SPECIALIZED")
50-
target_compile_definitions(${EXECUTABLE_NAME} PRIVATE PT_BUILD_MODE_SPECIALIZED=1)
51-
else()
52-
target_compile_definitions(${EXECUTABLE_NAME} PRIVATE PT_BUILD_MODE_WALLTIME_OPTIMIZED=1)
53-
endif()
30+
target_compile_definitions(${EXECUTABLE_NAME} PRIVATE PATH_TRACER_BUILD_CONFIG_NAME=\"$<CONFIG>\")
5431
if(NOT PT_CACHE_ROOT STREQUAL "")
5532
string(REPLACE "\\" "/" PT_CACHE_ROOT_JSON "${PT_CACHE_ROOT}")
5633
configure_file(
@@ -80,21 +57,15 @@ if(NBL_BUILD_IMGUI)
8057
)
8158
8259
# Keep the payload flat and explicit here. Once Nabla PR #988 lands, these per-rule compile axes should move to first-class packaged-variant support there.
83-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.sphere.proxy.hlsl" KEY "pt.compute.sphere" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_SPHERE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=0")
84-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.sphere.rwmc.proxy.hlsl" KEY "pt.compute.sphere.rwmc" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_SPHERE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=0")
85-
if(PT_BUILD_MODE STREQUAL "SPECIALIZED")
86-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.linear.proxy.hlsl" KEY "pt.compute.triangle.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}")
87-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.persistent.proxy.hlsl" KEY "pt.compute.triangle.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}")
88-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.rwmc.linear.proxy.hlsl" KEY "pt.compute.triangle.rwmc.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}")
89-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.rwmc.persistent.proxy.hlsl" KEY "pt.compute.triangle.rwmc.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}")
90-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.rwmc.linear.proxy.hlsl" KEY "pt.compute.rectangle.rwmc.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
91-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.rwmc.persistent.proxy.hlsl" KEY "pt.compute.rectangle.rwmc.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
92-
else()
93-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.proxy.hlsl" KEY "pt.compute.triangle" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_TRIANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
94-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.rwmc.proxy.hlsl" KEY "pt.compute.triangle.rwmc" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_TRIANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
95-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.rwmc.proxy.hlsl" KEY "pt.compute.rectangle.rwmc" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
96-
endif()
97-
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.proxy.hlsl" KEY "pt.compute.rectangle" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_RUNTIME_UNIFORM}" "-DPT_VARIANT_RUNTIME_POLYGON_METHOD=1")
60+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.sphere.proxy.hlsl" KEY "pt.compute.sphere" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_SPHERE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_COMBINED}")
61+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.sphere.rwmc.proxy.hlsl" KEY "pt.compute.sphere.rwmc" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_SPHERE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_COMBINED}")
62+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.linear.proxy.hlsl" KEY "pt.compute.triangle.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}")
63+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.persistent.proxy.hlsl" KEY "pt.compute.triangle.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}")
64+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.rwmc.linear.proxy.hlsl" KEY "pt.compute.triangle.rwmc.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}")
65+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.triangle.rwmc.persistent.proxy.hlsl" KEY "pt.compute.triangle.rwmc.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}")
66+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.rwmc.linear.proxy.hlsl" KEY "pt.compute.rectangle.rwmc.linear" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_LINEAR}")
67+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.rwmc.persistent.proxy.hlsl" KEY "pt.compute.rectangle.rwmc.persistent" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=1" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_PERSISTENT}")
68+
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.compute.rectangle.proxy.hlsl" KEY "pt.compute.rectangle" COMPILE_OPTIONS "-DPT_VARIANT_USE_RWMC=0" "-DPT_VARIANT_SCENE_KIND=${PT_SCENE_RECTANGLE}" "-DPT_VARIANT_ENTRYPOINT_KIND=${PT_ENTRYPOINT_COMBINED}")
9869
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/resolve.comp.hlsl" KEY "pt.compute.resolve")
9970
PT_APPEND_SPIRV_RULE(VAR JSON INPUT "app_resources/hlsl/spirv/pt.misc.proxy.hlsl" KEY "pt.misc")
10071
PT_FINALIZE_JSON_PAYLOAD(INOUT JSON)

31_HLSLPathTracer/app_resources/hlsl/compute.render.linear.entrypoints.hlsl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
#endif
44

55
#ifndef PATH_TRACER_ENTRYPOINT_POLYGON_METHOD
6-
#ifdef PATH_TRACER_RUNTIME_POLYGON_METHOD
7-
#define PATH_TRACER_ENTRYPOINT_POLYGON_METHOD PATH_TRACER_RUNTIME_POLYGON_METHOD
8-
#else
96
#define PATH_TRACER_ENTRYPOINT_POLYGON_METHOD PPM_APPROX_PROJECTED_SOLID_ANGLE
107
#endif
11-
#endif
128

139
#if !PATH_TRACER_ENABLE_LINEAR
1410
#error Linear entrypoint requested while PATH_TRACER_ENABLE_LINEAR is disabled
@@ -18,7 +14,7 @@
1814
[shader("compute")]
1915
void PATH_TRACER_ENTRYPOINT_NAME(uint32_t3 threadID : SV_DispatchThreadID)
2016
{
21-
pathtracer_render_variant::runLinear(threadID, PATH_TRACER_ENTRYPOINT_POLYGON_METHOD);
17+
pathtracer_render_variant::runLinear<PATH_TRACER_ENTRYPOINT_POLYGON_METHOD>(threadID);
2218
}
2319

2420
#undef PATH_TRACER_ENTRYPOINT_POLYGON_METHOD

31_HLSLPathTracer/app_resources/hlsl/compute.render.persistent.entrypoints.hlsl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
#endif
44

55
#ifndef PATH_TRACER_ENTRYPOINT_POLYGON_METHOD
6-
#ifdef PATH_TRACER_RUNTIME_POLYGON_METHOD
7-
#define PATH_TRACER_ENTRYPOINT_POLYGON_METHOD PATH_TRACER_RUNTIME_POLYGON_METHOD
8-
#else
96
#define PATH_TRACER_ENTRYPOINT_POLYGON_METHOD PPM_APPROX_PROJECTED_SOLID_ANGLE
107
#endif
11-
#endif
128

139
#if !PATH_TRACER_ENABLE_PERSISTENT
1410
#error Persistent entrypoint requested while PATH_TRACER_ENABLE_PERSISTENT is disabled
@@ -18,7 +14,7 @@
1814
[shader("compute")]
1915
void PATH_TRACER_ENTRYPOINT_NAME(uint32_t3 threadID : SV_DispatchThreadID)
2016
{
21-
pathtracer_render_variant::runPersistent(PATH_TRACER_ENTRYPOINT_POLYGON_METHOD);
17+
pathtracer_render_variant::runPersistent<PATH_TRACER_ENTRYPOINT_POLYGON_METHOD>();
2218
}
2319

2420
#undef PATH_TRACER_ENTRYPOINT_POLYGON_METHOD

31_HLSLPathTracer/app_resources/hlsl/compute_render_scene_impl.hlsl

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,24 @@ using iri_conductor_bxdf_type = bxdf::reflection::SIridescent<iso_microfacet_con
2424
using iri_dielectric_bxdf_type = bxdf::transmission::SIridescent<iso_microfacet_config_t>;
2525

2626
using payload_type = Payload<float>;
27-
using ray_type = Ray<payload_type, PPM_APPROX_PROJECTED_SOLID_ANGLE>;
2827
using randgen_type = RandomUniformND<Xoroshiro64Star, 3>;
29-
using raygen_type = path_tracing::BasicRayGenerator<ray_type>;
30-
using intersector_type = Intersector<ray_type, scene_type, aniso_interaction>;
3128
using material_system_type = MaterialSystem<bxdfnode_type, diffuse_bxdf_type, conductor_bxdf_type, dielectric_bxdf_type, iri_conductor_bxdf_type, iri_dielectric_bxdf_type, scene_type>;
32-
using nee_type = NextEventEstimator<scene_type, light_type, ray_type, sample_t, aniso_interaction, LIGHT_TYPE>;
3329

3430
#if PATH_TRACER_USE_RWMC
3531
using accumulator_type = rwmc::CascadeAccumulator<rwmc::DefaultCascades<float32_t3, CascadeCount> >;
3632
#else
3733
using accumulator_type = path_tracing::DefaultAccumulator<float32_t3>;
3834
#endif
3935

40-
using pathtracer_type = path_tracing::Unidirectional<randgen_type, ray_type, intersector_type, material_system_type, nee_type, accumulator_type, scene_type>;
36+
template<NEEPolygonMethod PPM>
37+
struct SVariantTypes
38+
{
39+
using ray_type = Ray<payload_type, PPM>;
40+
using raygen_type = path_tracing::BasicRayGenerator<ray_type>;
41+
using intersector_type = Intersector<ray_type, scene_type, aniso_interaction>;
42+
using nee_type = NextEventEstimator<scene_type, light_type, ray_type, sample_t, aniso_interaction, LIGHT_TYPE, PPM>;
43+
using pathtracer_type = path_tracing::Unidirectional<randgen_type, ray_type, intersector_type, material_system_type, nee_type, accumulator_type, scene_type>;
44+
};
4145

4246
RenderPushConstants getRenderPushConstants()
4347
{
@@ -48,9 +52,11 @@ RenderPushConstants getRenderPushConstants()
4852
#endif
4953
}
5054

51-
void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
55+
template<NEEPolygonMethod PPM>
56+
void tracePixel(int32_t2 coords)
5257
{
5358
const RenderPushConstants renderPushConstants = getRenderPushConstants();
59+
using variant_types = SVariantTypes<PPM>;
5460

5561
uint32_t width, height, imageArraySize;
5662
::outImage.GetDimensions(width, height, imageArraySize);
@@ -66,7 +72,7 @@ void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
6672
return;
6773
}
6874

69-
pathtracer_type pathtracer;
75+
typename variant_types::pathtracer_type pathtracer;
7076

7177
uint2 scrambleDim;
7278
::scramblebuf.GetDimensions(scrambleDim.x, scrambleDim.y);
@@ -83,7 +89,7 @@ void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
8389
scene_type scene;
8490
scene.updateLight(renderPushConstants.generalPurposeLightMatrix);
8591

86-
raygen_type rayGen;
92+
typename variant_types::raygen_type rayGen;
8793
rayGen.pixOffsetParam = pixOffsetParam;
8894
rayGen.camPos = camPos;
8995
rayGen.NDC = NDC;
@@ -92,7 +98,6 @@ void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
9298
pathtracer.scene = scene;
9399
pathtracer.randGen = randgen_type::create(::scramblebuf[coords].rg, renderPushConstants.pSampleSequence);
94100
pathtracer.nee.lights = lights;
95-
pathtracer.nee.polygonMethod = polygonMethod;
96101
pathtracer.materialSystem.bxdfs = bxdfs;
97102
pathtracer.bxdfPdfThreshold = 0.0001;
98103
pathtracer.lumaContributionThreshold = hlsl::dot(colorspace::scRGBtoXYZ[1], colorspace::eotf::sRGB(hlsl::promote<spectral_t>(1.0 / 255.0)));
@@ -107,7 +112,7 @@ void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
107112
for (int i = 0; i < renderPushConstants.sampleCount; ++i)
108113
{
109114
const float32_t3 uvw = pathtracer.randGen(0u, i);
110-
ray_type ray = rayGen.generate(uvw);
115+
typename variant_types::ray_type ray = rayGen.generate(uvw);
111116
ray.initPayload();
112117
pathtracer.sampleMeasure(ray, i, renderPushConstants.depth, accumulator);
113118
}
@@ -121,16 +126,18 @@ void tracePixel(int32_t2 coords, NEEPolygonMethod polygonMethod)
121126
}
122127

123128
#if PATH_TRACER_ENABLE_LINEAR
124-
void runLinear(uint32_t3 threadID, NEEPolygonMethod polygonMethod)
129+
template<NEEPolygonMethod PPM>
130+
void runLinear(uint32_t3 threadID)
125131
{
126132
uint32_t width, height, imageArraySize;
127133
::outImage.GetDimensions(width, height, imageArraySize);
128-
tracePixel(int32_t2(threadID.x % width, threadID.x / width), polygonMethod);
134+
tracePixel<PPM>(int32_t2(threadID.x % width, threadID.x / width));
129135
}
130136
#endif
131137

132138
#if PATH_TRACER_ENABLE_PERSISTENT
133-
void runPersistent(NEEPolygonMethod polygonMethod)
139+
template<NEEPolygonMethod PPM>
140+
void runPersistent()
134141
{
135142
uint32_t width, height, imageArraySize;
136143
::outImage.GetDimensions(width, height, imageArraySize);
@@ -144,7 +151,7 @@ void runPersistent(NEEPolygonMethod polygonMethod)
144151
morton::code<true, 32, 2> mc;
145152
mc.value = glsl::gl_LocalInvocationIndex().x;
146153
const int32_t2 localCoords = _static_cast<int32_t2>(mc);
147-
tracePixel(wgCoords * int32_t2(RenderWorkgroupSizeSqrt, RenderWorkgroupSizeSqrt) + localCoords, polygonMethod);
154+
tracePixel<PPM>(wgCoords * int32_t2(RenderWorkgroupSizeSqrt, RenderWorkgroupSizeSqrt) + localCoords);
148155
}
149156
}
150157
#endif

0 commit comments

Comments
 (0)