diff --git a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp index 50686af3..35abb221 100644 --- a/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp +++ b/MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp @@ -909,8 +909,9 @@ namespace MobileGL::MG_Impl::GLImpl { } GLboolean IsTransformFeedback(GLuint id) { - // Name 0 is the default object, which glIsTransformFeedback reports as not an object. - return (id != 0 && MG_State::pGLContext->ValidateTransformFeedbackName(id)) ? GL_TRUE : GL_FALSE; + // Name 0 is the default object, and a name glGenTransformFeedbacks handed out only + // becomes the name of an object once it has been bound. + return MG_State::pGLContext->IsTransformFeedbackObject(id) ? GL_TRUE : GL_FALSE; } // glDrawTransformFeedback[Stream][Instanced]: replays the vertices the named object diff --git a/MobileGL/MG_State/GLState/Core.cpp b/MobileGL/MG_State/GLState/Core.cpp index edb7eb74..f4738080 100644 --- a/MobileGL/MG_State/GLState/Core.cpp +++ b/MobileGL/MG_State/GLState/Core.cpp @@ -798,9 +798,16 @@ namespace MobileGL::MG_State { if (index == m_boundTransformFeedback) return; SaveBoundTransformFeedbackState(); m_boundTransformFeedback = index; + m_transformFeedbackObjects[index].everBound = true; RestoreBoundTransformFeedbackState(); } + Bool GLContext::IsTransformFeedbackObject(Uint index) const { + if (index == 0 || !m_transformFeedbackNames.IsValid(index)) return false; + const auto it = m_transformFeedbackObjects.find(index); + return it != m_transformFeedbackObjects.end() && it->second.everBound; + } + void GLContext::MarkTransformFeedbackObjectForDeletion(Uint index) { if (index == 0 || !m_transformFeedbackNames.IsValid(index)) return; // Deleting the bound object reverts to the default one (GL 4.6 core 13.2.1); diff --git a/MobileGL/MG_State/GLState/Core.h b/MobileGL/MG_State/GLState/Core.h index 376aa799..0961f850 100644 --- a/MobileGL/MG_State/GLState/Core.h +++ b/MobileGL/MG_State/GLState/Core.h @@ -274,6 +274,9 @@ namespace MobileGL { // A name glGenTransformFeedbacks handed out and glDeleteTransformFeedbacks // has not taken back. Name 0 is always valid. Bool ValidateTransformFeedbackName(Uint index) const; + // What glIsTransformFeedback reports: a generated name only becomes the name + // of an object once it has been bound at least once (GL 4.6 core 13.2.1). + Bool IsTransformFeedbackObject(Uint index) const; void BindTransformFeedbackObject(Uint index); void MarkTransformFeedbackObjectForDeletion(Uint index); Uint GetBoundTransformFeedbackName() const { return m_boundTransformFeedback; } @@ -344,6 +347,7 @@ namespace MobileGL { Uint64 inputPrimitives = 0; Uint64 recordedVertices = 0; Bool hasCompletedSpan = false; + Bool everBound = false; }; void SaveBoundTransformFeedbackState(); void RestoreBoundTransformFeedbackState();