From 582cd7f7c0fd3c588708a001fc271c945103c6f1 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 2 Jul 2022 01:35:52 +0200 Subject: [PATCH] RunAsync serves no purpose anymore as it now doesn't actually do anything in the main thread --- src/lightmap/gpuraytracer.cpp | 127 +++++++++++----------------------- 1 file changed, 42 insertions(+), 85 deletions(-) diff --git a/src/lightmap/gpuraytracer.cpp b/src/lightmap/gpuraytracer.cpp index 1a0ccc9..c215569 100644 --- a/src/lightmap/gpuraytracer.cpp +++ b/src/lightmap/gpuraytracer.cpp @@ -93,60 +93,58 @@ void GPURaytracer::Raytrace(LevelMesh* level) //printf("Ray tracing with %d bounce(s)\n", mesh->map->LightBounce); printf("Ray tracing in progress...\n"); - RunAsync([&]() { - size_t maxTasks = (size_t)rayTraceImageSize * rayTraceImageSize; - for (size_t startTask = 0; startTask < tasks.size(); startTask += maxTasks) + size_t maxTasks = (size_t)rayTraceImageSize * rayTraceImageSize; + for (size_t startTask = 0; startTask < tasks.size(); startTask += maxTasks) + { + printf("\r%.1f%%\t%llu/%llu", double(startTask) / double(tasks.size()) * 100, startTask, tasks.size()); + size_t numTasks = std::min(tasks.size() - startTask, maxTasks); + UploadTasks(tasks.data() + startTask, numTasks); + + BeginTracing(); + + Uniforms uniforms = {}; + uniforms.SunDir = mesh->map->GetSunDirection(); + uniforms.SunColor = mesh->map->GetSunColor(); + uniforms.SunIntensity = 1.0f; + + uniforms.PassType = 0; + uniforms.SampleIndex = 0; + uniforms.SampleCount = bounceSampleCount; + RunTrace(uniforms, rgenBounceRegion); + + uniforms.SampleCount = coverageSampleCount; + RunTrace(uniforms, rgenLightRegion, 0, mesh->map->ThingLights.Size()); + + for (uint32_t i = 0; i < (uint32_t)bounceSampleCount; i++) { - printf("\r%.1f%%\t%llu/%llu", double(startTask) / double(tasks.size()) * 100, startTask, tasks.size()); - size_t numTasks = std::min(tasks.size() - startTask, maxTasks); - UploadTasks(tasks.data() + startTask, numTasks); - - BeginTracing(); - - Uniforms uniforms = {}; - uniforms.SunDir = mesh->map->GetSunDirection(); - uniforms.SunColor = mesh->map->GetSunColor(); - uniforms.SunIntensity = 1.0f; - - uniforms.PassType = 0; - uniforms.SampleIndex = 0; + uniforms.PassType = 1; + uniforms.SampleIndex = i; uniforms.SampleCount = bounceSampleCount; + uniforms.HemisphereVec = HemisphereVectors[uniforms.SampleIndex]; RunTrace(uniforms, rgenBounceRegion); - uniforms.SampleCount = coverageSampleCount; - RunTrace(uniforms, rgenLightRegion, 0, mesh->map->ThingLights.Size()); - - for (uint32_t i = 0; i < (uint32_t)bounceSampleCount; i++) + for (int bounce = 0; bounce < mesh->map->LightBounce; bounce++) { - uniforms.PassType = 1; - uniforms.SampleIndex = i; + uniforms.SampleCount = coverageSampleCount; + RunTrace(uniforms, rgenLightRegion, 0, mesh->map->ThingLights.Size()); + + uniforms.PassType = 2; + uniforms.SampleIndex = (i + bounce) % uniforms.SampleCount; uniforms.SampleCount = bounceSampleCount; uniforms.HemisphereVec = HemisphereVectors[uniforms.SampleIndex]; RunTrace(uniforms, rgenBounceRegion); - - for (int bounce = 0; bounce < mesh->map->LightBounce; bounce++) - { - uniforms.SampleCount = coverageSampleCount; - RunTrace(uniforms, rgenLightRegion, 0, mesh->map->ThingLights.Size()); - - uniforms.PassType = 2; - uniforms.SampleIndex = (i + bounce) % uniforms.SampleCount; - uniforms.SampleCount = bounceSampleCount; - uniforms.HemisphereVec = HemisphereVectors[uniforms.SampleIndex]; - RunTrace(uniforms, rgenBounceRegion); - } } - - uniforms.PassType = 0; - uniforms.SampleIndex = 0; - uniforms.SampleCount = ambientSampleCount; - RunTrace(uniforms, rgenAmbientRegion); - - EndTracing(); - DownloadTasks(tasks.data() + startTask, numTasks); } - printf("\r%.1f%%\t%llu/%llu\n", 100.0, tasks.size(), tasks.size()); - }); + + uniforms.PassType = 0; + uniforms.SampleIndex = 0; + uniforms.SampleCount = ambientSampleCount; + RunTrace(uniforms, rgenAmbientRegion); + + EndTracing(); + DownloadTasks(tasks.data() + startTask, numTasks); + } + printf("\r%.1f%%\t%llu/%llu\n", 100.0, tasks.size(), tasks.size()); if (device->renderdoc) device->renderdoc->EndFrameCapture(0, 0); @@ -972,44 +970,3 @@ float GPURaytracer::RadicalInverse_VdC(uint32_t bits) bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); return float(bits) * 2.3283064365386963e-10f; // / 0x100000000 } - -void GPURaytracer::RunAsync(std::function callback) -{ - std::exception_ptr e; - std::condition_variable condvar; - std::mutex m; - bool stop; - - { - std::unique_lock lock(m); - stop = false; - } - - std::thread t([&]() { - try - { - callback(); - } - catch (...) - { - e = std::current_exception(); - } - std::unique_lock lock(m); - stop = true; - lock.unlock(); - condvar.notify_all(); - }); - - { - std::unique_lock lock(m); - while (!stop) - { - condvar.wait_for(lock, std::chrono::milliseconds(500), [&]() { return stop; }); - } - } - - t.join(); - - if (e) - std::rethrow_exception(e); -}