From 318f58f073b2c5712c5c31cbe0313ec13350bca9 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Wed, 13 Dec 2023 19:30:28 +0900 Subject: [PATCH] [Tizen] Discard deleted VAO at matched context Since InvalidateCachedPipeline() can be called not for currented context, we should not call gl.DeleteVertexArrays() that timming. Instead, let we keep discarded VAO items, and then delete them immediately, if we call BindProgramVAO, where we can assume that the context is current. Change-Id: Iac417a862e68bc5503e843a0c27cae98cebee5b0 Signed-off-by: Eunki, Hong --- dali/internal/graphics/gles-impl/gles-context.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/dali/internal/graphics/gles-impl/gles-context.cpp b/dali/internal/graphics/gles-impl/gles-context.cpp index 2b56974..addd1ad 100644 --- a/dali/internal/graphics/gles-impl/gles-context.cpp +++ b/dali/internal/graphics/gles-impl/gles-context.cpp @@ -63,8 +63,15 @@ struct Context::Impl hash ^= std::hash{}(attr.location); } - auto& gl = *mController.GetGL(); - auto iter = mProgramVAOMap.find(program); + auto& gl = *mController.GetGL(); + + if(DALI_UNLIKELY(!mDiscardedVAOList.empty())) + { + gl.DeleteVertexArrays(static_cast(mDiscardedVAOList.size()), mDiscardedVAOList.data()); + mDiscardedVAOList.clear(); + } + + auto iter = mProgramVAOMap.find(program); if(iter != mProgramVAOMap.end()) { auto attributeIter = iter->second.find(hash); @@ -228,6 +235,7 @@ struct Context::Impl std::unordered_map> mProgramVAOMap; ///< GL program-VAO map uint32_t mProgramVAOCurrentState{0u}; ///< Currently bound VAO GLStateCache mGlStateCache{}; ///< GL status cache + std::vector mDiscardedVAOList{}; bool mGlContextCreated{false}; ///< True if the OpenGL context has been created @@ -1074,12 +1082,18 @@ void Context::InvalidateCachedPipeline(GLES::Pipeline* pipeline) for(auto& attributeHashPair : iter->second) { auto vao = attributeHashPair.second; - gl->DeleteVertexArrays(1, &vao); + + // Do not delete vao now. (Since Context might not be current.) + mImpl->mDiscardedVAOList.emplace_back(vao); if(mImpl->mProgramVAOCurrentState == vao) { mImpl->mProgramVAOCurrentState = 0u; } } + + // Clear cached Vertex buffer. + mImpl->mCurrentVertexBufferBindings.clear(); + mImpl->mProgramVAOMap.erase(iter); } } -- 2.7.4