1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "WebGL2Context.h"
7 
8 #include "GLContext.h"
9 #include "WebGLSync.h"
10 
11 namespace mozilla {
12 
13 // -------------------------------------------------------------------------
14 // Sync objects
15 
16 already_AddRefed<WebGLSync>
FenceSync(GLenum condition,GLbitfield flags)17 WebGL2Context::FenceSync(GLenum condition, GLbitfield flags)
18 {
19     if (IsContextLost())
20         return nullptr;
21 
22     if (condition != LOCAL_GL_SYNC_GPU_COMMANDS_COMPLETE) {
23         ErrorInvalidEnum("fenceSync: condition must be SYNC_GPU_COMMANDS_COMPLETE");
24         return nullptr;
25     }
26 
27     if (flags != 0) {
28         ErrorInvalidValue("fenceSync: flags must be 0");
29         return nullptr;
30     }
31 
32     MakeContextCurrent();
33     RefPtr<WebGLSync> globj = new WebGLSync(this, condition, flags);
34     return globj.forget();
35 }
36 
37 bool
IsSync(const WebGLSync * sync)38 WebGL2Context::IsSync(const WebGLSync* sync)
39 {
40     if (!ValidateIsObject("isSync", sync))
41         return false;
42 
43     return true;
44 }
45 
46 void
DeleteSync(WebGLSync * sync)47 WebGL2Context::DeleteSync(WebGLSync* sync)
48 {
49     if (!ValidateDeleteObject("deleteSync", sync))
50         return;
51 
52     sync->RequestDelete();
53 }
54 
55 GLenum
ClientWaitSync(const WebGLSync & sync,GLbitfield flags,GLuint64 timeout)56 WebGL2Context::ClientWaitSync(const WebGLSync& sync, GLbitfield flags, GLuint64 timeout)
57 {
58     const char funcName[] = "clientWaitSync";
59     if (IsContextLost())
60         return LOCAL_GL_WAIT_FAILED;
61 
62     if (!ValidateObject(funcName, sync))
63         return LOCAL_GL_WAIT_FAILED;
64 
65     if (flags != 0 && flags != LOCAL_GL_SYNC_FLUSH_COMMANDS_BIT) {
66         ErrorInvalidValue("%s: `flags` must be SYNC_FLUSH_COMMANDS_BIT or 0.", funcName);
67         return LOCAL_GL_WAIT_FAILED;
68     }
69 
70     if (timeout > kMaxClientWaitSyncTimeoutNS) {
71         ErrorInvalidOperation("%s: `timeout` must not exceed %s nanoseconds.", funcName,
72                               "MAX_CLIENT_WAIT_TIMEOUT_WEBGL");
73         return LOCAL_GL_WAIT_FAILED;
74     }
75 
76     MakeContextCurrent();
77     return gl->fClientWaitSync(sync.mGLName, flags, timeout);
78 }
79 
80 void
WaitSync(const WebGLSync & sync,GLbitfield flags,GLint64 timeout)81 WebGL2Context::WaitSync(const WebGLSync& sync, GLbitfield flags, GLint64 timeout)
82 {
83     const char funcName[] = "waitSync";
84     if (IsContextLost())
85         return;
86 
87     if (!ValidateObject(funcName, sync))
88         return;
89 
90     if (flags != 0) {
91         ErrorInvalidValue("%s: `flags` must be 0.", funcName);
92         return;
93     }
94 
95     if (timeout != -1) {
96         ErrorInvalidValue("%s: `timeout` must be TIMEOUT_IGNORED.", funcName);
97         return;
98     }
99 
100     MakeContextCurrent();
101     gl->fWaitSync(sync.mGLName, flags, LOCAL_GL_TIMEOUT_IGNORED);
102 }
103 
104 void
GetSyncParameter(JSContext *,const WebGLSync & sync,GLenum pname,JS::MutableHandleValue retval)105 WebGL2Context::GetSyncParameter(JSContext*, const WebGLSync& sync, GLenum pname,
106                                 JS::MutableHandleValue retval)
107 {
108     const char funcName[] = "getSyncParameter";
109     retval.setNull();
110     if (IsContextLost())
111         return;
112 
113     if (!ValidateObject(funcName, sync))
114         return;
115 
116     ////
117 
118     gl->MakeCurrent();
119 
120     GLint result = 0;
121     switch (pname) {
122     case LOCAL_GL_OBJECT_TYPE:
123     case LOCAL_GL_SYNC_STATUS:
124     case LOCAL_GL_SYNC_CONDITION:
125     case LOCAL_GL_SYNC_FLAGS:
126         gl->fGetSynciv(sync.mGLName, pname, 1, nullptr, &result);
127         retval.set(JS::Int32Value(result));
128         return;
129 
130     default:
131         ErrorInvalidEnum("%s: Invalid pname 0x%04x", funcName, pname);
132         return;
133     }
134 }
135 
136 } // namespace mozilla
137