@@ -73,7 +73,10 @@ void temporarilyBindBuffer(GLuint bufferID, GLenum target = GL_ARRAY_BUFFER) {
7373 GLenum bindingQuery = GetBindingQuery (target);
7474 GLint prev = 0 ;
7575 glGetIntegerv (bindingQuery, &prev);
76-
76+ if (prev == bufferID) {
77+ bufferBindingStack[target].push_back (-1 );
78+ return ;
79+ }
7780 bufferBindingStack[target].push_back (static_cast <GLuint>(prev));
7881
7982 LOG_D (" [DSA] [TempBind] target=0x%X, prev=%u -> bind=%u" , target, prev, bufferID);
@@ -91,6 +94,11 @@ void restoreTemporaryBufferBinding(GLenum target = GL_ARRAY_BUFFER) {
9194 GLuint toRestore = it->second .back ();
9295 it->second .pop_back ();
9396
97+ if (toRestore == static_cast <GLuint>(-1 )) {
98+ LOG_D (" [DSA] [Restore] target=0x%X, no binding to restore" , target);
99+ return ;
100+ }
101+
94102 LOG_D (" [DSA] [Restore] target=0x%X, bind back to %u" , target, toRestore);
95103 CHECK_GL_ERROR ;
96104 glBindBuffer (target, toRestore);
@@ -374,6 +382,10 @@ void temporarilyBindFramebuffer(GLuint framebufferID, GLenum target = GL_DRAW_FR
374382 GLenum bindingQuery = GetBindingQuery (target);
375383 GLint prev = 0 ;
376384 glGetIntegerv (bindingQuery, &prev);
385+ if (prev == framebufferID) {
386+ framebufferBindingStack[target].push_back (-1 );
387+ return ;
388+ }
377389 framebufferBindingStack[target].push_back (static_cast <GLuint>(prev));
378390 LOG_D (" [DSA] [TempBind] target=0x%X, prev=%u -> bind=%u" , target, prev, framebufferID);
379391 CHECK_GL_ERROR ;
@@ -388,6 +400,10 @@ void restoreTemporaryFramebufferBinding(GLenum target = GL_DRAW_FRAMEBUFFER) {
388400 }
389401 GLuint toRestore = it->second .back ();
390402 it->second .pop_back ();
403+ if (toRestore == static_cast <GLuint>(-1 )) {
404+ LOG_D (" [DSA] [Restore] target=0x%X, no binding to restore" , target);
405+ return ;
406+ }
391407 LOG_D (" [DSA] [Restore] target=0x%X, bind back to %u" , target, toRestore);
392408 CHECK_GL_ERROR ;
393409 glBindFramebuffer (target, toRestore);
@@ -674,6 +690,10 @@ void temporarilyBindRenderbuffer(GLuint renderbufferID) {
674690 GLenum bindingQuery = GetBindingQuery (GL_RENDERBUFFER );
675691 GLint prev = 0 ;
676692 glGetIntegerv (bindingQuery, &prev);
693+ if (prev == renderbufferID) {
694+ renderbufferBindingStack[GL_RENDERBUFFER ].push_back (-1 );
695+ return ;
696+ }
677697 renderbufferBindingStack[GL_RENDERBUFFER ].push_back (static_cast <GLuint>(prev));
678698 LOG_D (" [DSA] [TempBind] prev=%u -> bind=%u" , prev, renderbufferID);
679699 CHECK_GL_ERROR ;
@@ -688,6 +708,10 @@ void restoreTemporaryRenderbufferBinding() {
688708 }
689709 GLuint toRestore = it->second .back ();
690710 it->second .pop_back ();
711+ if (toRestore == static_cast <GLuint>(-1 )) {
712+ LOG_D (" [DSA] [Restore] no binding to restore for GL_RENDERBUFFER" );
713+ return ;
714+ }
691715 LOG_D (" [DSA] [Restore] bind back to %u" , toRestore);
692716 CHECK_GL_ERROR ;
693717 glBindRenderbuffer (GL_RENDERBUFFER , toRestore);
@@ -776,6 +800,10 @@ void temporarilyBindTexture(GLuint textureID, GLenum possibleTarget = 0) {
776800 GLenum bindingQuery = GetBindingQuery (target, true );
777801 GLint prev = 0 ;
778802 glGetIntegerv (bindingQuery, &prev);
803+ if (prev == static_cast <GLint>(textureID)) {
804+ textureBindingStack[target].push_back (-1 );
805+ return ;
806+ }
779807 textureBindingStack[target].push_back (static_cast <GLuint>(prev));
780808 LOG_D (" [DSA] [TempBind] target=0x%X, prev=%u -> bind=%u" , target, prev, textureID);
781809 CHECK_GL_ERROR ;
@@ -793,6 +821,10 @@ void restoreTemporaryTextureBinding(GLuint textureID, GLenum possibleTarget = 0)
793821
794822 GLuint toRestore = stackIt->second .back ();
795823 stackIt->second .pop_back ();
824+ if (toRestore == static_cast <GLuint>(-1 )) {
825+ LOG_D (" [DSA] [Restore] target=0x%X, no binding to restore" , target);
826+ return ;
827+ }
796828 LOG_D (" [DSA] [Restore] target=0x%X, bind back to %u" , target, toRestore);
797829 CHECK_GL_ERROR ;
798830 glBindTexture (target, toRestore);
@@ -1108,9 +1140,10 @@ void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint* params) {
11081140}
11091141
11101142// vertex array
1111- static thread_local GLint prevVAO = 0 ;
1143+ static thread_local GLint prevVAO = - 1 ;
11121144void temporarilyBindVertexArray (GLint vaoID) {
11131145 if (prevVAO == vaoID) {
1146+ prevVAO = -1 ;
11141147 return ;
11151148 }
11161149 LOG_D (" [DSA] [TempBind] VAO: %u -> bind=%u" , prevVAO, vaoID);
@@ -1120,14 +1153,14 @@ void temporarilyBindVertexArray(GLint vaoID) {
11201153 CHECK_GL_ERROR_NO_INIT ;
11211154}
11221155void restoreTemporaryVertexArrayBinding () {
1123- if (prevVAO == 0 ) {
1156+ if (prevVAO == - 1 ) {
11241157 return ;
11251158 }
11261159 LOG_D (" [DSA] [Restore] VAO: bind back to %u" , prevVAO);
11271160 CHECK_GL_ERROR ;
11281161 glBindVertexArray (prevVAO);
11291162 CHECK_GL_ERROR_NO_INIT ;
1130- prevVAO = 0 ;
1163+ prevVAO = - 1 ;
11311164}
11321165
11331166void glCreateVertexArrays (GLsizei n, GLuint* arrays) {
@@ -1503,6 +1536,10 @@ static void pushXFB(GLuint xfb) {
15031536 LOG_D (" [DSA] pushXFB, xfb: %u" , xfb);
15041537 GLint prev = 0 ;
15051538 glGetIntegerv (GL_TRANSFORM_FEEDBACK_BINDING , &prev);
1539+ if (xfb == prev) {
1540+ g_xfbBindingStack.push_back (-1 );
1541+ return ;
1542+ }
15061543 g_xfbBindingStack.push_back (prev);
15071544 glBindTransformFeedback (GL_TRANSFORM_FEEDBACK , xfb);
15081545 CHECK_GL_ERROR ;
@@ -1513,6 +1550,10 @@ static void popXFB() {
15131550 assert (!g_xfbBindingStack.empty ());
15141551 GLint prev = g_xfbBindingStack.back ();
15151552 g_xfbBindingStack.pop_back ();
1553+ if (prev == -1 ) {
1554+ LOG_D (" [DSA] No previous XFB binding to restore" );
1555+ return ;
1556+ }
15161557 glBindTransformFeedback (GL_TRANSFORM_FEEDBACK , (GLuint)prev);
15171558 CHECK_GL_ERROR ;
15181559}
0 commit comments