Skip to content

Commit aad019d

Browse files
committed
- Async Shader Compilation
- ScreenShot File path from CElementFilm
1 parent b2c393d commit aad019d

File tree

7 files changed

+103
-62
lines changed

7 files changed

+103
-62
lines changed

examples_tests/22.RaytracedAO/CommandLineHandler.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,6 @@ bool CommandLineHandler::validateParameters()
146146
return false;
147147
}
148148
}
149-
150-
if(rawVariables[REA_SCREENSHOT_OUTPUT_FOLDER].has_value())
151-
{
152-
auto screenshotOutputFolder = rawVariables[REA_SCREENSHOT_OUTPUT_FOLDER].value();
153-
if(screenshotOutputFolder.empty())
154-
{
155-
logError("Expected at least one value for SCREENSHOT_OUTPUT_FOLDER");
156-
return false;
157-
}
158-
}
159149

160150
return true;
161151
}

examples_tests/22.RaytracedAO/CommandLineHandler.hpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ constexpr uint32_t MaxRayTracerCommandLineArgs = 8;
4646
enum RaytracerExampleArguments
4747
{
4848
REA_SCENE,
49-
REA_SCREENSHOT_OUTPUT_FOLDER,
5049
REA_TERMINATE,
5150
REA_COUNT,
5251
};
@@ -63,11 +62,6 @@ class CommandLineHandler
6362
{
6463
return sceneDirectory;
6564
}
66-
67-
auto& getOutputScreenshotsFolderPath() const
68-
{
69-
return outputScreenshotsFolderPath;
70-
}
7165

7266
auto& getTerminate() const
7367
{
@@ -79,16 +73,13 @@ class CommandLineHandler
7973
void initializeMatchingMap()
8074
{
8175
rawVariables[REA_SCENE];
82-
rawVariables[REA_SCREENSHOT_OUTPUT_FOLDER];
8376
rawVariables[REA_TERMINATE];
8477
}
8578

8679
RaytracerExampleArguments getMatchedVariableMapID(const std::string& variableName)
8780
{
8881
if (variableName == SCENE_VAR_NAME)
8982
return REA_SCENE;
90-
else if (variableName == SCREENSHOT_OUTPUT_FOLDER_VAR_NAME)
91-
return REA_SCREENSHOT_OUTPUT_FOLDER;
9283
else if (variableName == TERMINATE_VAR_NAME)
9384
return REA_TERMINATE;
9485
else
@@ -101,12 +92,6 @@ class CommandLineHandler
10192
{
10293
if(rawVariables[REA_SCENE].has_value())
10394
sceneDirectory = rawVariables[REA_SCENE].value();
104-
if(rawVariables[REA_SCREENSHOT_OUTPUT_FOLDER].has_value())
105-
{
106-
const auto& screenShotPathVector = rawVariables[REA_SCREENSHOT_OUTPUT_FOLDER].value();
107-
if(screenShotPathVector.size())
108-
outputScreenshotsFolderPath = screenShotPathVector[0];
109-
}
11095
if(rawVariables[REA_TERMINATE].has_value())
11196
terminate = true;
11297
}

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -913,29 +913,32 @@ void Renderer::initScreenSizedResources(uint32_t width, uint32_t height, core::s
913913
}
914914
}
915915

916-
// we have to recompile some shaders and runtime_defines.glsl changes
917-
{
918-
(std::ofstream("runtime_defines.glsl")
919-
<< "#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << m_globalMeta->m_global.getVTStorageViewCount() << "\n"
920-
<< m_globalMeta->m_global.m_materialCompilerGLSL_declarations
921-
<< "#define MAX_PATH_DEPTH " << m_maxDepth << "\n"
922-
<< "#ifndef MAX_RAYS_GENERATED\n"
923-
<< "# define MAX_RAYS_GENERATED " << m_staticViewData.samplesPerPixelPerDispatch << "\n"
924-
<< "#endif\n"
925-
).close();
916+
(std::ofstream("runtime_defines.glsl")
917+
<< "#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << m_globalMeta->m_global.getVTStorageViewCount() << "\n"
918+
<< m_globalMeta->m_global.m_materialCompilerGLSL_declarations
919+
<< "#define MAX_PATH_DEPTH " << m_maxDepth << "\n"
920+
<< "#ifndef MAX_RAYS_GENERATED\n"
921+
<< "# define MAX_RAYS_GENERATED " << m_staticViewData.samplesPerPixelPerDispatch << "\n"
922+
<< "#endif\n"
923+
).close();
926924

925+
compileShadersFuture = std::async(std::launch::async, [&]()
926+
{
927927
// cull
928-
m_cullPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_cullPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../cull.comp"));
928+
m_cullGPUShader = gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../cull.comp");
929929

930930
// raygen
931-
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_raygenPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp"));
931+
m_raygenGPUShader = gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp");
932932

933933
// closest hit
934-
m_closestHitPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_closestHitPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../closestHit.comp"));
934+
m_closestHitGPUShader = gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../closestHit.comp");
935935

936936
// resolve
937-
m_resolvePipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_resolvePipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,m_useDenoiser ? "../resolveForDenoiser.comp":"../resolve.comp"));
938-
}
937+
m_resolveGPUShader = gpuSpecializedShaderFromFile(m_assetManager,m_driver,m_useDenoiser ? "../resolveForDenoiser.comp":"../resolve.comp");
938+
939+
bool success = m_cullGPUShader && m_raygenGPUShader && m_closestHitGPUShader && m_resolveGPUShader;
940+
return success;
941+
});
939942

940943
auto setBufferInfo = [&](IGPUDescriptorSet::SDescriptorInfo* info, const core::smart_refctd_ptr<IGPUBuffer>& buffer) -> void
941944
{
@@ -1226,23 +1229,18 @@ void Renderer::resetSampleAndFrameCounters()
12261229
m_prevCamTform = nbl::core::matrix4x3();
12271230
}
12281231

1229-
void Renderer::takeAndSaveScreenShot(const std::string& screenShotName, const std::filesystem::path& screenshotFolderPath)
1232+
void Renderer::takeAndSaveScreenShot(const std::filesystem::path& screenshotFilePath)
12301233
{
12311234
auto commandQueue = m_rrManager->getCLCommandQueue();
12321235
ocl::COpenCLHandler::ocl.pclFinish(commandQueue);
12331236

12341237
glFinish();
12351238

1236-
auto finalFile = (screenshotFolderPath / (screenShotName + ".exr").c_str());
1237-
1238-
if(!screenshotFolderPath.empty() && !std::filesystem::is_directory(screenshotFolderPath))
1239-
{
1240-
std::cout << "ScreenShot Directorty (" << screenshotFolderPath.string().c_str() << ") does not exist, Defaulting to executable folder" << std::endl;
1241-
finalFile = std::filesystem::path(screenShotName + ".exr");
1242-
}
1239+
// TODO: Deduce Format from CElementFilm (How?) -> Get format from input
1240+
asset::E_FORMAT format = asset::EF_R32G32B32A32_SFLOAT;
12431241

12441242
if (m_tonemapOutput)
1245-
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_tonemapOutput.get(),finalFile.string(),asset::EF_R32G32B32A32_SFLOAT);
1243+
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_tonemapOutput.get(),screenshotFilePath.string(), format);
12461244
}
12471245

12481246
// one day it will just work like that
@@ -1289,6 +1287,23 @@ void Renderer::render(nbl::ITimer* timer)
12891287

12901288
// TODO: update positions and rr->Commit() if stuff starts to move
12911289

1290+
if(compileShadersFuture.valid())
1291+
{
1292+
bool compiledShaders = compileShadersFuture.get();
1293+
if(compiledShaders)
1294+
{
1295+
m_cullPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_cullPipelineLayout), core::smart_refctd_ptr(m_cullGPUShader));
1296+
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_raygenPipelineLayout), core::smart_refctd_ptr(m_raygenGPUShader));
1297+
m_closestHitPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_closestHitPipelineLayout), core::smart_refctd_ptr(m_closestHitGPUShader));
1298+
m_resolvePipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_resolvePipelineLayout), core::smart_refctd_ptr(m_resolveGPUShader));
1299+
bool createPipelinesSuceess = m_cullPipeline && m_raygenPipeline && m_closestHitPipeline && m_resolvePipeline;
1300+
if(!createPipelinesSuceess)
1301+
std::cout << "Pipeline Compilation Failed." << std::endl;
1302+
}
1303+
else
1304+
std::cout << "Shader Compilation Failed." << std::endl;
1305+
}
1306+
12921307
// raster jittered frame
12931308
{
12941309
// jitter with AA AntiAliasingSequence

examples_tests/22.RaytracedAO/Renderer.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#define _RENDERER_INCLUDED_
33

44
#include "nabla.h"
5-
65
#include "nbl/ext/RadeonRays/RadeonRays.h"
76
// pesky leaking defines
87
#undef PI
@@ -15,6 +14,8 @@
1514
#include "nbl/ext/OptiX/Manager.h"
1615
#endif
1716

17+
#include <thread>
18+
#include <future>
1819

1920
class Renderer : public nbl::core::IReferenceCounted, public nbl::core::InterfaceUnmovable
2021
{
@@ -40,7 +41,7 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
4041

4142
void resetSampleAndFrameCounters();
4243

43-
void takeAndSaveScreenShot(const std::string& screenShotName, const std::filesystem::path& screenshotFolderPath = "");
44+
void takeAndSaveScreenShot(const std::filesystem::path& screenshotFilePath);
4445

4546
void render(nbl::ITimer* timer);
4647

@@ -147,7 +148,11 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
147148
nbl::core::smart_refctd_ptr<nbl::video::IGPUPipelineLayout> m_raygenPipelineLayout;
148149
nbl::core::smart_refctd_ptr<nbl::video::IGPUPipelineLayout> m_closestHitPipelineLayout;
149150
nbl::core::smart_refctd_ptr<nbl::video::IGPUPipelineLayout> m_resolvePipelineLayout;
150-
151+
152+
nbl::core::smart_refctd_ptr<IGPUSpecializedShader> m_cullGPUShader;
153+
nbl::core::smart_refctd_ptr<IGPUSpecializedShader> m_raygenGPUShader;
154+
nbl::core::smart_refctd_ptr<IGPUSpecializedShader> m_closestHitGPUShader;
155+
nbl::core::smart_refctd_ptr<IGPUSpecializedShader> m_resolveGPUShader;
151156

152157
// scene specific data
153158
nbl::core::vector<::RadeonRays::Shape*> rrShapes;
@@ -193,6 +198,8 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
193198
nbl::core::smart_refctd_ptr<nbl::video::IGPUImageView> m_accumulation,m_tonemapOutput;
194199
nbl::video::IFrameBuffer* m_visibilityBuffer,* m_colorBuffer;
195200

201+
std::future<bool> compileShadersFuture;
202+
196203
#ifdef _NBL_BUILD_OPTIX_
197204
nbl::core::smart_refctd_ptr<nbl::ext::OptiX::IDenoiser> m_denoiser;
198205
OptixDenoiserSizes m_denoiserMemReqs;

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "CSceneNodeAnimatorCameraModifiedMaya.h"
1818
#include "Renderer.h"
1919

20-
2120
using namespace nbl;
2221
using namespace core;
2322

@@ -107,7 +106,6 @@ int main(int argc, char** argv)
107106
auto sceneDir = cmdHandler.getSceneDirectory();
108107
std::string filePath = (sceneDir.size() >= 1) ? sceneDir[0] : ""; // zip or xml
109108
std::string extraPath = (sceneDir.size() >= 2) ? sceneDir[1] : "";; // xml in zip
110-
std::string outputScreenshotsFolderPath = cmdHandler.getOutputScreenshotsFolderPath();
111109
bool shouldTerminate = cmdHandler.getTerminate(); // skip interaction with window and take screenshots only
112110
bool takeScreenShots = true;
113111
std::string mainFileName; // std::filesystem::path(filePath).filename().string();
@@ -248,7 +246,8 @@ int main(int argc, char** argv)
248246
float moveSpeed = core::nan<float>();
249247
scene::ICameraSceneNode * staticCamera;
250248
scene::ICameraSceneNode * interactiveCamera;
251-
std::string outputFileName = "";
249+
std::filesystem::path outputFilePath;
250+
ext::MitsubaLoader::CElementFilm::FileFormat format;
252251

253252
void resetInteractiveCamera()
254253
{
@@ -268,6 +267,28 @@ int main(int argc, char** argv)
268267
};
269268

270269
auto smgr = device->getSceneManager();
270+
271+
auto isFileExtensionCompatibleWithFormat = [](std::string extension, ext::MitsubaLoader::CElementFilm::FileFormat format) -> bool
272+
{
273+
if(extension.empty())
274+
return false;
275+
276+
if(extension[0] == '.')
277+
extension = extension.substr(1, extension.size());
278+
279+
// TODO: get the supported extensions from loaders(?)
280+
using FileFormat = ext::MitsubaLoader::CElementFilm::FileFormat;
281+
switch (format) {
282+
case FileFormat::PNG:
283+
return extension == "png";
284+
case FileFormat::OPENEXR:
285+
return extension == "exr";
286+
case FileFormat::JPEG:
287+
return extension == "jpg" || extension == "jpeg" || extension == "jpe" || extension == "jif" || extension == "jfif" || extension == "jfi";
288+
default:
289+
return false;
290+
}
291+
};
271292

272293
auto isOkSensorType = [](const ext::MitsubaLoader::CElementSensor& sensor) -> bool {
273294
return sensor.type == ext::MitsubaLoader::CElementSensor::Type::PERSPECTIVE || sensor.type == ext::MitsubaLoader::CElementSensor::Type::THINLENS;
@@ -349,6 +370,13 @@ int main(int argc, char** argv)
349370
outSensorData.moveSpeed = persp->moveSpeed;
350371
std::cout << "\t Camera Move Speed = " << outSensorData.moveSpeed << std::endl;
351372

373+
outSensorData.outputFilePath = std::filesystem::path(film.outputFilePath);
374+
375+
if(!isFileExtensionCompatibleWithFormat(outSensorData.outputFilePath.extension().string(), film.fileFormat))
376+
{
377+
std::cout << "[ERROR] film.outputFilePath's extension is not compatible with film.fileFormat" << std::endl;
378+
}
379+
352380
float realFoVDegrees;
353381
auto width = film.cropWidth;
354382
auto height = film.cropHeight;
@@ -556,7 +584,7 @@ int main(int argc, char** argv)
556584
}
557585
}
558586

559-
renderer->takeAndSaveScreenShot("LastView_" + mainFileName + "_Sensor_" + std::to_string(activeSensor), outputScreenshotsFolderPath);
587+
renderer->takeAndSaveScreenShot(std::filesystem::path("LastView_" + mainFileName + "_Sensor_" + std::to_string(activeSensor) + ".exr"));
560588
renderer->deinitScreenSizedResources();
561589
}
562590

@@ -607,13 +635,13 @@ int main(int argc, char** argv)
607635
itr++;
608636
}
609637

610-
auto screenshotFileNameWithoutExtension = sensorData.outputFileName;
611-
if (screenshotFileNameWithoutExtension.empty())
612-
screenshotFileNameWithoutExtension = "ScreenShot_" + mainFileName + "_Sensor_" + std::to_string(s);
638+
auto screenshotFilePath = sensorData.outputFilePath;
639+
if (screenshotFilePath.empty())
640+
screenshotFilePath = std::filesystem::path("ScreenShot_" + mainFileName + "_Sensor_" + std::to_string(s) + ".exr");
613641

614-
std::cout << "-- Rendered Successfully: " << filePath << " (Sensor=" << s << ") to file (" << screenshotFileNameWithoutExtension << ")." << std::endl;
642+
std::cout << "-- Rendered Successfully: " << filePath << " (Sensor=" << s << ") to file (" << screenshotFilePath.string() << ")." << std::endl;
615643

616-
renderer->takeAndSaveScreenShot(screenshotFileNameWithoutExtension, outputScreenshotsFolderPath);
644+
renderer->takeAndSaveScreenShot(screenshotFilePath);
617645
}
618646

619647
renderer->deinitSceneResources();

include/nbl/ext/MitsubaLoader/CElementFilm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ class CElementFilm : public IElement
133133
LDR ldrfilm;
134134
M mfilm;
135135
};
136+
137+
_NBL_STATIC_INLINE_CONSTEXPR size_t MaxPathLen = 256;
138+
char outputFilePath[MaxPathLen+1];
136139
};
137140

138141

src/nbl/ext/MitsubaLoader/CElementFilm.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ bool CElementFilm::addProperty(SNamedPropertyElement&& _property)
9494
static const core::unordered_map<std::string, FileFormat, core::CaseInsensitiveHash, core::CaseInsensitiveEquals> StringToType =
9595
{
9696
{"openexr", OPENEXR},
97+
{"png", PNG},
9798
{"rgbe", RGBE},
9899
{"pfm", PFM},
99100
{"matlab", MATLAB},
@@ -227,7 +228,18 @@ bool CElementFilm::addProperty(SNamedPropertyElement&& _property)
227228
memcpy(mfilm.variable,_property.svalue,len);
228229
mfilm.variable[len] = 0;
229230
};
231+
auto setOutputFilePath = [&]() -> void
232+
{
233+
if (_property.type != SNamedPropertyElement::Type::STRING)
234+
{
235+
error = true;
236+
return;
237+
}
230238

239+
size_t len = std::min(strlen(_property.svalue),MaxPathLen);
240+
memcpy(outputFilePath,_property.svalue,len);
241+
outputFilePath[len] = 0;
242+
};
231243

232244
const core::unordered_map<std::string, std::function<void()>, core::CaseInsensitiveHash, core::CaseInsensitiveEquals> SetPropertyMap =
233245
{
@@ -249,7 +261,8 @@ bool CElementFilm::addProperty(SNamedPropertyElement&& _property)
249261
{"key", setKey},
250262
{"burn", setBurn},
251263
{"digits", setDigits},
252-
{"variable", setVariable}
264+
{"variable", setVariable},
265+
{"outputFilePath", setOutputFilePath}
253266
};
254267

255268
auto found = SetPropertyMap.find(_property.name);

0 commit comments

Comments
 (0)