[Tizen] Reset vertex buffer cache at the end of flush 50/320150/4 accepted/tizen/9.0/unified/20250226.133030
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 24 Feb 2025 13:55:45 +0000 (22:55 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 25 Feb 2025 06:42:50 +0000 (15:42 +0900)
We only check the internal value of VertexBufferBindingDescriptor.

But if the size of mImpl->mCurrentVertexBufferBindings changed, or cleared,
the vertex buffer's pointer might be same as previos old items.
In this case, we might miss vertex attribute, or VAO relative actions.

To avoid this case, let we clear current binded vertex
whenever if the size of mImpl->mCurrentVertexBufferBindings changed.

Change-Id: I8a4081d9ead39ea9927572876e1a6fe50bef376e
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/graphics/gles-impl/gles-context.cpp
dali/internal/graphics/gles-impl/gles-context.h

index 11c1004b51f20ff6f02561ad1dbdd0bf81921b1d..d9c3830f0134b9375b2e1ba1bf2dd0d56e2afe63 100644 (file)
@@ -586,6 +586,7 @@ void Context::BindVertexBuffers(const GLES::VertexBufferBindingDescriptor* bindi
   if(count > mImpl->mCurrentVertexBufferBindings.size())
   {
     mImpl->mCurrentVertexBufferBindings.resize(count);
+    mImpl->mVertexBuffersChanged = true;
   }
   // Copy only set slots
   auto toIter = mImpl->mCurrentVertexBufferBindings.begin();
@@ -973,6 +974,21 @@ void Context::ClearState()
   mImpl->mCurrentUBOBindings.clear();
 }
 
+void Context::ClearVertexBufferCache()
+{
+  mImpl->mCurrentVertexBufferBindings.clear();
+  mImpl->mVertexBuffersChanged   = true;
+  mImpl->mProgramVAOCurrentState = 0;
+  if(DALI_LIKELY(!EglGraphicsController::IsShuttingDown()))
+  {
+    if(!(mImpl->mController.GetGLESVersion() >= GLESVersion::GLES_30))
+    {
+      memset(&mImpl->mGlStateCache.mVertexAttributeCachedState, 0, sizeof(mImpl->mGlStateCache.mVertexAttributeCachedState));
+      memset(&mImpl->mGlStateCache.mVertexAttributeCurrentState, 0, sizeof(mImpl->mGlStateCache.mVertexAttributeCurrentState));
+    }
+  }
+}
+
 void Context::ColorMask(bool enabled)
 {
   auto* gl = mImpl->GetGL();
@@ -1292,14 +1308,12 @@ void Context::InvalidateCachedPipeline(GLES::Pipeline* pipeline)
 
             // 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();
+          ClearVertexBufferCache();
+
+          mImpl->mGlStateCache.ResetBufferCache();
 
           mImpl->mProgramVAOMap.erase(iter);
         }
@@ -1372,15 +1386,13 @@ void Context::ResetGLESState()
   mImpl->mCurrentPipeline = nullptr;
   mImpl->mCurrentUBOBindings.clear();
   mImpl->mCurrentTextureBindings.clear();
-  mImpl->mCurrentVertexBufferBindings.clear();
   mImpl->mCurrentRenderTarget       = nullptr;
   mImpl->mCurrentRenderPass         = nullptr;
-  mImpl->mVertexBuffersChanged      = true;
   mImpl->mCurrentIndexBufferBinding = {};
   mImpl->mCurrentSamplerBindings    = {};
-  mImpl->mProgramVAOCurrentState    = 0;
 
   ClearState();
+  ClearVertexBufferCache();
   mImpl->InitializeGlState();
 }
 
index 9086769d38ae42c922be62ebcb702a0f6e43e876..bb7ef3ff3989d0b18393ddceb36dfcd3f54f3277 100644 (file)
@@ -237,6 +237,11 @@ private:
    */
   void ClearState();
 
+  /**
+   * @brief Clear vertex buffer relative caches.
+   */
+  void ClearVertexBufferCache();
+
 private:
   struct Impl;
   std::unique_ptr<Impl> mImpl;