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