summaryrefslogtreecommitdiff
path: root/dom/canvas/WebGL2ContextSync.cpp
blob: 5a5ac2b0a6e7d9e432dae7f78013a8b1c6504888 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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