Bug 1427668 - Flush on mac after EndTransformFeedback. - r=daoshengmu draft
authorJeff Gilbert <jgilbert@mozilla.com>
Wed, 03 Jan 2018 17:07:36 -0800
changeset 716066 b137e187bfcdab2af07ad531200226d1b4830dfc
parent 716065 e2e2f523f22141be0fde1309268ce96746fc5575
child 744938 a14f512be77e52c2069b08aaed0c57134af92aae
push id94316
push userbmo:jgilbert@mozilla.com
push dateFri, 05 Jan 2018 03:14:09 +0000
reviewersdaoshengmu
bugs1427668
milestone59.0a1
Bug 1427668 - Flush on mac after EndTransformFeedback. - r=daoshengmu MozReview-Commit-ID: A0Tbk2pIng
dom/canvas/WebGLTransformFeedback.cpp
--- a/dom/canvas/WebGLTransformFeedback.cpp
+++ b/dom/canvas/WebGLTransformFeedback.cpp
@@ -118,16 +118,28 @@ WebGLTransformFeedback::EndTransformFeed
     if (!mIsActive)
         return mContext->ErrorInvalidOperation("%s: Not active.", funcName);
 
     ////
 
     const auto& gl = mContext->gl;
     gl->fEndTransformFeedback();
 
+    if (gl->WorkAroundDriverBugs()) {
+#ifdef XP_MACOSX
+        // Multi-threaded GL on mac will generate INVALID_OP in some cases for at least
+        // BindBufferBase after an EndTransformFeedback if there is not a flush between
+        // the two.
+        // Single-threaded GL does not have this issue.
+        // This is likely due to not synchronizing client/server state, and erroring in
+        // BindBufferBase because the client thinks we're still in transform feedback.
+        gl->fFlush();
+#endif
+    }
+
     ////
 
     mIsActive = false;
     mIsPaused = false;
 
     ////
 
     mActive_Program->mNumActiveTFOs--;