From 76f90ab0317d35871a19fc4c7a0aed014c00373b Mon Sep 17 00:00:00 2001 From: William Moberg Date: Fri, 15 Jan 2016 11:29:46 +0100 Subject: [PATCH] The main thread is not mutex blocked while child threads load anymore. --- assets | 2 +- include/Engine/Rendering/Model.h | 2 +- include/Engine/Rendering/ModelJob.h | 14 ++++---- include/Engine/Rendering/RawModel.h | 2 +- resources/Schema/Entities/ThreadTestMap.xml | 30 ++++++++++++++++ src/Engine/Core/ResourceManager.cpp | 38 ++++++++++++--------- src/Engine/Rendering/Model.cpp | 2 +- src/Engine/Rendering/RawModel.cpp | 2 +- src/Engine/Rendering/RenderSystem.cpp | 6 ++-- src/Engine/Rendering/Renderer.cpp | 4 +-- 10 files changed, 68 insertions(+), 34 deletions(-) create mode 100644 resources/Schema/Entities/ThreadTestMap.xml diff --git a/assets b/assets index 6cbf2365..a3c92ac8 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 6cbf2365d49e6280750ea3bcd0f9c271779e6f15 +Subproject commit a3c92ac876dd061776c36d1594bd82264372f028 diff --git a/include/Engine/Rendering/Model.h b/include/Engine/Rendering/Model.h index 77e3df76..280fe5af 100644 --- a/include/Engine/Rendering/Model.h +++ b/include/Engine/Rendering/Model.h @@ -13,7 +13,7 @@ private: public: ~Model(); - const std::vector& TextureGroups() const { return m_RawModel->TextureGroups; } + const std::vector& MaterialGroups() const { return m_RawModel->MaterialGroups; } const glm::mat4& Matrix() const { return m_RawModel->m_Matrix; } const std::vector& Vertices() const { return m_RawModel->m_Vertices; } diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h index d598766f..353d1bbe 100644 --- a/include/Engine/Rendering/ModelJob.h +++ b/include/Engine/Rendering/ModelJob.h @@ -15,16 +15,16 @@ struct ModelJob : RenderJob { - ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::Model::MaterialGroup texGroup, ComponentWrapper modelComponent, World* world) + ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialGroup matGroup, ComponentWrapper modelComponent, World* world) : RenderJob() { Model = model; - TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - DiffuseTexture = texGroup.Texture.get(); - NormalTexture = texGroup.NormalMap.get(); - SpecularTexture = texGroup.SpecularMap.get(); - StartIndex = texGroup.StartIndex; - EndIndex = texGroup.EndIndex; + TextureID = (matGroup.Texture) ? matGroup.Texture->ResourceID : 0; + DiffuseTexture = matGroup.Texture.get(); + NormalTexture = matGroup.NormalMap.get(); + SpecularTexture = matGroup.SpecularMap.get(); + StartIndex = matGroup.StartIndex; + EndIndex = matGroup.EndIndex; Matrix = matrix; Color = modelComponent["Color"]; Entity = modelComponent.EntityID; diff --git a/include/Engine/Rendering/RawModel.h b/include/Engine/Rendering/RawModel.h index 5117f953..0477edb1 100644 --- a/include/Engine/Rendering/RawModel.h +++ b/include/Engine/Rendering/RawModel.h @@ -57,7 +57,7 @@ public: unsigned int EndIndex; }; - std::vector TextureGroups; + std::vector MaterialGroups; std::vector m_Vertices; std::vector m_Indices; diff --git a/resources/Schema/Entities/ThreadTestMap.xml b/resources/Schema/Entities/ThreadTestMap.xml new file mode 100644 index 00000000..b4b358c0 --- /dev/null +++ b/resources/Schema/Entities/ThreadTestMap.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Engine/Core/ResourceManager.cpp b/src/Engine/Core/ResourceManager.cpp index ffd6c76c..30614e5c 100644 --- a/src/Engine/Core/ResourceManager.cpp +++ b/src/Engine/Core/ResourceManager.cpp @@ -81,8 +81,6 @@ void ResourceManager::Update() Resource* ResourceManager::createResource(std::string resourceType, std::string resourceName, Resource* parent) { - //Lock the mutex immediately, and unlock it when leaving the function. - boost::lock_guard guard(m_Mutex); auto facIt = m_FactoryFunctions.find(resourceType); if (facIt == m_FactoryFunctions.end()) { LOG_ERROR("Failed to load resource \"%s\" of type \"%s\": type not registered", resourceName.c_str(), resourceType.c_str()); @@ -98,23 +96,29 @@ Resource* ResourceManager::createResource(std::string resourceType, std::string } catch (const std::exception& e) { LOG_ERROR("Failed to load resource \"%s\" of type \"%s\": %s", resourceName.c_str(), resourceType.c_str(), e.what()); } - if (resource != nullptr) { - // Store IDs - resource->TypeID = GetTypeID(resourceType); - resource->ResourceID = GetNewResourceID(resource->TypeID); + + { + //Lock the mutex immediately, and unlock it when leaving the code block. + boost::lock_guard guard(m_Mutex); + if (resource != nullptr) { + // Store IDs + resource->TypeID = GetTypeID(resourceType); + resource->ResourceID = GetNewResourceID(resource->TypeID); + } + + // Cache + m_ResourceCache[std::make_pair(resourceType, resourceName)] = resource; + m_ResourceFromName[resourceName] = resource; + if (parent != nullptr) { + m_ResourceParents[resource] = parent; + } + + if (!boost::filesystem::is_directory(resourceName)) { + LOG_DEBUG("Adding watch for %s", resourceName.c_str()); + m_FileWatcher.AddWatch(resourceName, fileWatcherCallback); + } } - // Cache - m_ResourceCache[std::make_pair(resourceType, resourceName)] = resource; - m_ResourceFromName[resourceName] = resource; - if (parent != nullptr) { - m_ResourceParents[resource] = parent; - } - - if (!boost::filesystem::is_directory(resourceName)) { - LOG_DEBUG("Adding watch for %s", resourceName.c_str()); - m_FileWatcher.AddWatch(resourceName, fileWatcherCallback); - } return resource; } diff --git a/src/Engine/Rendering/Model.cpp b/src/Engine/Rendering/Model.cpp index 8e24b704..c1afa037 100644 --- a/src/Engine/Rendering/Model.cpp +++ b/src/Engine/Rendering/Model.cpp @@ -9,7 +9,7 @@ Model::Model(std::string fileName) throw StillLoadingException(); } - for (auto& group : m_RawModel->TextureGroups) { + for (auto& group : m_RawModel->MaterialGroups) { if (!group.TexturePath.empty()) { group.Texture = std::shared_ptr(ResourceManager::Load(group.TexturePath)); } diff --git a/src/Engine/Rendering/RawModel.cpp b/src/Engine/Rendering/RawModel.cpp index 5b0b7260..256346f1 100644 --- a/src/Engine/Rendering/RawModel.cpp +++ b/src/Engine/Rendering/RawModel.cpp @@ -163,7 +163,7 @@ RawModel::RawModel(std::string fileName) material->GetTexture(aiTextureType_SPECULAR, 0, &path, &mapping); matGroup.SpecularMapPath = (boost::filesystem::path(fileName).branch_path() / path.C_Str()).string(); } - TextureGroups.push_back(matGroup); + MaterialGroups.push_back(matGroup); // Bones std::map>> vertexWeights; diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 1f2bac9d..e228b33e 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -84,15 +84,15 @@ void RenderSystem::fillModels(std::list>& jobs, World continue; } - Model* model = ResourceManager::Load<::Model>(resource); + Model* model = ResourceManager::Load<::Model, true>(resource); if (model == nullptr) { model = ResourceManager::Load<::Model>("Models/Core/Error.obj"); } glm::mat4 modelMatrix = Transform::ModelMatrix(modelComponent.EntityID, world); - for (auto texGroup : model->TextureGroups) { - std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, modelMatrix, texGroup, modelComponent, world)); + for (auto matGroup : model->MaterialGroups()) { + std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, modelMatrix, matGroup, modelComponent, world)); jobs.push_back(modelJob); } } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index a59a6bca..867398bd 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -131,8 +131,8 @@ void Renderer::DrawScreenQuad(GLuint textureToDraw) glBindVertexArray(m_ScreenQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->TextureGroups()[0].EndIndex - m_ScreenQuad->TextureGroups()[0].StartIndex +1 - , GL_UNSIGNED_INT, 0, m_ScreenQuad->TextureGroups()[0].StartIndex); + glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].EndIndex - m_ScreenQuad->MaterialGroups()[0].StartIndex +1 + , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].StartIndex); } void Renderer::InitializeTextures()