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 <eunkiki.hong@samsung.com>
hash ^= std::hash<uint32_t>{}(attr.location);
}
hash ^= std::hash<uint32_t>{}(attr.location);
}
- auto& gl = *mController.GetGL();
- auto iter = mProgramVAOMap.find(program);
+ auto& gl = *mController.GetGL();
+
+ if(DALI_UNLIKELY(!mDiscardedVAOList.empty()))
+ {
+ gl.DeleteVertexArrays(static_cast<Dali::GLsizei>(mDiscardedVAOList.size()), mDiscardedVAOList.data());
+ mDiscardedVAOList.clear();
+ }
+
+ auto iter = mProgramVAOMap.find(program);
if(iter != mProgramVAOMap.end())
{
auto attributeIter = iter->second.find(hash);
if(iter != mProgramVAOMap.end())
{
auto attributeIter = iter->second.find(hash);
std::unordered_map<const GLES::ProgramImpl*, std::map<std::size_t, uint32_t>> mProgramVAOMap; ///< GL program-VAO map
uint32_t mProgramVAOCurrentState{0u}; ///< Currently bound VAO
GLStateCache mGlStateCache{}; ///< GL status cache
std::unordered_map<const GLES::ProgramImpl*, std::map<std::size_t, uint32_t>> mProgramVAOMap; ///< GL program-VAO map
uint32_t mProgramVAOCurrentState{0u}; ///< Currently bound VAO
GLStateCache mGlStateCache{}; ///< GL status cache
+ std::vector<Dali::GLuint> mDiscardedVAOList{};
bool mGlContextCreated{false}; ///< True if the OpenGL context has been created
bool mGlContextCreated{false}; ///< True if the OpenGL context has been created
for(auto& attributeHashPair : iter->second)
{
auto vao = attributeHashPair.second;
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;
}
}
if(mImpl->mProgramVAOCurrentState == vao)
{
mImpl->mProgramVAOCurrentState = 0u;
}
}
+
+ // Clear cached Vertex buffer.
+ mImpl->mCurrentVertexBufferBindings.clear();
+
mImpl->mProgramVAOMap.erase(iter);
}
}
mImpl->mProgramVAOMap.erase(iter);
}
}