From: Eunki, Hong Date: Wed, 13 Dec 2023 10:30:28 +0000 (+0900) Subject: [Tizen] Discard deleted VAO at matched context X-Git-Tag: accepted/tizen/7.0/unified/20231218.071009^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=318f58f073b2c5712c5c31cbe0313ec13350bca9 [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 --- 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); } }