123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /* -*- 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
|