From db38fec2a2a54408afd42f80e26303ec278690a1 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Fri, 21 Oct 2022 19:57:50 +0200 Subject: [PATCH] Add some omp pragmas to utilize multiple CPU cores Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- .../asset_loader/src/vkcv/asset/asset_loader.cpp | 10 +++++++++- .../shader_compiler/src/vkcv/shader/Compiler.cpp | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp index d8f2563d..ef83785e 100644 --- a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp +++ b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp @@ -825,6 +825,7 @@ namespace vkcv::asset { int loadScene(const std::filesystem::path &path, Scene &scene) { int result = probeScene(path, scene); + size_t i; if (result != ASSET_SUCCESS) { vkcv_log(LogLevel::ERROR, "Loading scene failed '%s'", @@ -832,7 +833,13 @@ namespace vkcv::asset { return result; } - for (size_t i = 0; i < scene.meshes.size(); i++) { + /* Preloading the textures of the scene to improve performance */ + #pragma omp parallel for shared(scene.textures) private(i) + for (i = 0; i < scene.textures.size(); i++) { + loadTextureData(scene.textures[i]); + } + + for (i = 0; i < scene.meshes.size(); i++) { result = loadMesh(scene, static_cast<int>(i)); if (result != ASSET_SUCCESS) { @@ -849,6 +856,7 @@ namespace vkcv::asset { Texture texture; texture.path = path; texture.sampler = -1; + if (loadTextureData(texture) != ASSET_SUCCESS) { texture.path.clear(); texture.w = texture.h = texture.channels = 0; diff --git a/modules/shader_compiler/src/vkcv/shader/Compiler.cpp b/modules/shader_compiler/src/vkcv/shader/Compiler.cpp index 1467bf22..dcf9e516 100644 --- a/modules/shader_compiler/src/vkcv/shader/Compiler.cpp +++ b/modules/shader_compiler/src/vkcv/shader/Compiler.cpp @@ -7,11 +7,24 @@ namespace vkcv::shader { const std::unordered_map<ShaderStage, const std::filesystem::path>& stages, const ShaderProgramCompiledFunction& compiled, const std::filesystem::path& includePath, bool update) { + std::vector<std::pair<ShaderStage, const std::filesystem::path>> stageList; + size_t i; + + stageList.reserve(stages.size()); for (const auto& stage : stages) { + stageList.push_back(stage); + } + + /* Compile a shader programs stages in parallel to improve performance */ + #pragma omp parallel for shared(stageList, includePath, update) private(i) + for (i = 0; i < stageList.size(); i++) { + const auto& stage = stageList[i]; + compile( stage.first, stage.second, [&program](ShaderStage shaderStage, const std::filesystem::path& path) { + #pragma omp critical program.addShader(shaderStage, path); }, includePath, -- GitLab