Refactor sync EPs (plus one extra).

More entry point validation refactor for auto-gen.

BUG=angleproject:747

Change-Id: I9462a28838df3f265e1401f66c838cc5a73d511f
Reviewed-on: https://chromium-review.googlesource.com/636517
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 021cacd..612ff9c 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -606,13 +606,6 @@
     return mState.mRenderbuffers->createRenderbuffer();
 }
 
-GLsync Context::createFenceSync()
-{
-    GLuint handle = mState.mFenceSyncs->createFenceSync(mImplementation.get());
-
-    return reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
-}
-
 GLuint Context::createPaths(GLsizei range)
 {
     auto resultOrError = mState.mPaths->createPaths(mImplementation.get(), range);
@@ -682,14 +675,13 @@
     mState.mRenderbuffers->deleteObject(this, renderbuffer);
 }
 
-void Context::deleteFenceSync(GLsync fenceSync)
+void Context::deleteSync(GLsync sync)
 {
     // The spec specifies the underlying Fence object is not deleted until all current
     // wait commands finish. However, since the name becomes invalid, we cannot query the fence,
     // and since our API is currently designed for being called from a single thread, we can delete
     // the fence immediately.
-    mState.mFenceSyncs->deleteObject(this,
-                                     static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
+    mState.mFenceSyncs->deleteObject(this, static_cast<GLuint>(reinterpret_cast<uintptr_t>(sync)));
 }
 
 void Context::deletePaths(GLuint first, GLsizei range)
@@ -1599,7 +1591,7 @@
     }
 }
 
-void Context::getInteger64v(GLenum pname, GLint64 *params)
+void Context::getInteger64vImpl(GLenum pname, GLint64 *params)
 {
     // Queries about context capabilities and maximums are answered by Context.
     // Queries about current GL state values are answered by State.
@@ -5175,4 +5167,57 @@
     programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
 }
 
+GLsync Context::fenceSync(GLenum condition, GLbitfield flags)
+{
+    GLuint handle    = mState.mFenceSyncs->createFenceSync(mImplementation.get());
+    GLsync fenceSync = reinterpret_cast<GLsync>(static_cast<uintptr_t>(handle));
+
+    FenceSync *fenceSyncObject = getFenceSync(fenceSync);
+    Error error                = fenceSyncObject->set(condition, flags);
+    if (error.isError())
+    {
+        deleteSync(fenceSync);
+        handleError(error);
+        return nullptr;
+    }
+
+    return fenceSync;
+}
+
+GLboolean Context::isSync(GLsync sync)
+{
+    return (getFenceSync(sync) != nullptr);
+}
+
+GLenum Context::clientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+    FenceSync *syncObject = getFenceSync(sync);
+
+    GLenum result = GL_WAIT_FAILED;
+    handleError(syncObject->clientWait(flags, timeout, &result));
+    return result;
+}
+
+void Context::waitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+{
+    FenceSync *syncObject = getFenceSync(sync);
+    handleError(syncObject->serverWait(flags, timeout));
+}
+
+void Context::getInteger64v(GLenum pname, GLint64 *params)
+{
+    GLenum nativeType      = GL_NONE;
+    unsigned int numParams = 0;
+    getQueryParameterInfo(pname, &nativeType, &numParams);
+
+    if (nativeType == GL_INT_64_ANGLEX)
+    {
+        getInteger64vImpl(pname, params);
+    }
+    else
+    {
+        CastStateValues(this, nativeType, pname, numParams, params);
+    }
+}
+
 }  // namespace gl