Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_fence_arb.cc
index da13f10..05bda6b 100644 (file)
@@ -4,11 +4,26 @@
 
 #include "ui/gl/gl_fence_arb.h"
 
+#include "base/strings/stringprintf.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 
 namespace gfx {
 
+namespace {
+
+std::string GetGLErrors() {
+  // Clears and logs all current gl errors.
+  std::string accumulated_errors;
+  GLenum error;
+  while ((error = glGetError()) != GL_NO_ERROR) {
+    accumulated_errors += base::StringPrintf("0x%x ", error);
+  }
+  return accumulated_errors;
+}
+
+}  // namespace
+
 GLFenceARB::GLFenceARB(bool flush) {
   sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
@@ -28,13 +43,22 @@ bool GLFenceARB::HasCompleted() {
   // We could potentially use glGetSynciv here, but it doesn't work
   // on OSX 10.7 (always says the fence is not signaled yet).
   // glClientWaitSync works better, so let's use that instead.
-  return glClientWaitSync(sync_, 0, 0) != GL_TIMEOUT_EXPIRED;
+  GLenum result = glClientWaitSync(sync_, 0, 0);
+  if (result == GL_WAIT_FAILED) {
+    LOG(FATAL) << "Failed to wait for GLFence. error code:" << GetGLErrors();
+  }
+  return result != GL_TIMEOUT_EXPIRED;
 }
 
 void GLFenceARB::ClientWait() {
   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
   if (!flush_event_.get() || flush_event_->IsSignaled()) {
-    glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
+    GLenum result =
+        glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
+    DCHECK_NE(static_cast<GLenum>(GL_TIMEOUT_EXPIRED), result);
+    if (result == GL_WAIT_FAILED) {
+      LOG(FATAL) << "Failed to wait for GLFence. error code:" << GetGLErrors();
+    }
   } else {
     LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping...";
   }