diff options
Diffstat (limited to 'dom/canvas/WebGL2ContextSync.cpp')
-rw-r--r-- | dom/canvas/WebGL2ContextSync.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/dom/canvas/WebGL2ContextSync.cpp b/dom/canvas/WebGL2ContextSync.cpp new file mode 100644 index 000000000..5a5ac2b0a --- /dev/null +++ b/dom/canvas/WebGL2ContextSync.cpp @@ -0,0 +1,136 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "WebGL2Context.h" + +#include "GLContext.h" +#include "WebGLSync.h" + +namespace mozilla { + +// ------------------------------------------------------------------------- +// Sync objects + +already_AddRefed<WebGLSync> +WebGL2Context::FenceSync(GLenum condition, GLbitfield flags) +{ + if (IsContextLost()) + return nullptr; + + if (condition != LOCAL_GL_SYNC_GPU_COMMANDS_COMPLETE) { + ErrorInvalidEnum("fenceSync: condition must be SYNC_GPU_COMMANDS_COMPLETE"); + return nullptr; + } + + if (flags != 0) { + ErrorInvalidValue("fenceSync: flags must be 0"); + return nullptr; + } + + MakeContextCurrent(); + RefPtr<WebGLSync> globj = new WebGLSync(this, condition, flags); + return globj.forget(); +} + +bool +WebGL2Context::IsSync(const WebGLSync* sync) +{ + if (!ValidateIsObject("isSync", sync)) + return false; + + return true; +} + +void +WebGL2Context::DeleteSync(WebGLSync* sync) +{ + if (!ValidateDeleteObject("deleteSync", sync)) + return; + + sync->RequestDelete(); +} + +GLenum +WebGL2Context::ClientWaitSync(const WebGLSync& sync, GLbitfield flags, GLuint64 timeout) +{ + const char funcName[] = "clientWaitSync"; + if (IsContextLost()) + return LOCAL_GL_WAIT_FAILED; + + if (!ValidateObject(funcName, sync)) + return LOCAL_GL_WAIT_FAILED; + + if (flags != 0 && flags != LOCAL_GL_SYNC_FLUSH_COMMANDS_BIT) { + ErrorInvalidValue("%s: `flags` must be SYNC_FLUSH_COMMANDS_BIT or 0.", funcName); + return LOCAL_GL_WAIT_FAILED; + } + + if (timeout > kMaxClientWaitSyncTimeoutNS) { + ErrorInvalidOperation("%s: `timeout` must not exceed %s nanoseconds.", funcName, + "MAX_CLIENT_WAIT_TIMEOUT_WEBGL"); + return LOCAL_GL_WAIT_FAILED; + } + + MakeContextCurrent(); + return gl->fClientWaitSync(sync.mGLName, flags, timeout); +} + +void +WebGL2Context::WaitSync(const WebGLSync& sync, GLbitfield flags, GLint64 timeout) +{ + const char funcName[] = "waitSync"; + if (IsContextLost()) + return; + + if (!ValidateObject(funcName, sync)) + return; + + if (flags != 0) { + ErrorInvalidValue("%s: `flags` must be 0.", funcName); + return; + } + + if (timeout != -1) { + ErrorInvalidValue("%s: `timeout` must be TIMEOUT_IGNORED.", funcName); + return; + } + + MakeContextCurrent(); + gl->fWaitSync(sync.mGLName, flags, LOCAL_GL_TIMEOUT_IGNORED); +} + +void +WebGL2Context::GetSyncParameter(JSContext*, const WebGLSync& sync, GLenum pname, + JS::MutableHandleValue retval) +{ + const char funcName[] = "getSyncParameter"; + retval.setNull(); + if (IsContextLost()) + return; + + if (!ValidateObject(funcName, sync)) + return; + + //// + + gl->MakeCurrent(); + + GLint result = 0; + switch (pname) { + case LOCAL_GL_OBJECT_TYPE: + case LOCAL_GL_SYNC_STATUS: + case LOCAL_GL_SYNC_CONDITION: + case LOCAL_GL_SYNC_FLAGS: + gl->fGetSynciv(sync.mGLName, pname, 1, nullptr, &result); + retval.set(JS::Int32Value(result)); + return; + + default: + ErrorInvalidEnum("%s: Invalid pname 0x%04x", funcName, pname); + return; + } +} + +} // namespace mozilla |