diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp index d8f2563d867e5521bce29a3880650f0418ad9db8..ef83785e6a7280dc7e6e45a850915f2ad4fc56c1 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 1467bf22616764e00399ada69d5f866b929416d5..dcf9e5167c2b2fdd251e4e245a8ea7a6d7e62712 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,