1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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/. */
6 #ifndef CLIENTWEBGLEXTENSIONS_H_
7 #define CLIENTWEBGLEXTENSIONS_H_
9 #include "WebGLExtensions.h"
10 #include "ClientWebGLContext.h"
14 class ClientWebGLExtensionBase
: public nsWrapperCache
{
15 friend ClientWebGLContext
;
18 WeakPtr
<ClientWebGLContext
> mContext
;
21 NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(ClientWebGLExtensionBase
)
22 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(ClientWebGLExtensionBase
)
25 explicit ClientWebGLExtensionBase(ClientWebGLContext
& context
)
26 : mContext(&context
) {}
27 virtual ~ClientWebGLExtensionBase() = default;
30 ClientWebGLContext
* GetParentObject() const { return mContext
.get(); }
35 // To be used for implementations of ClientWebGLExtensionBase
36 #define DEFINE_WEBGL_EXTENSION_GOOP(_WebGLBindingType, _Extension) \
37 JSObject* Client##_Extension::WrapObject(JSContext* cx, \
38 JS::Handle<JSObject*> givenProto) { \
39 return dom::_WebGLBindingType##_Binding::Wrap(cx, this, givenProto); \
41 Client##_Extension::Client##_Extension(ClientWebGLContext& aClient) \
42 : ClientWebGLExtensionBase(aClient) {}
44 // Many extensions have no methods. This is a shorthand for declaring client
45 // versions of such classes.
46 #define DECLARE_SIMPLE_WEBGL_EXTENSION(_Extension) \
47 class Client##_Extension : public ClientWebGLExtensionBase { \
49 virtual JSObject* WrapObject(JSContext* cx, \
50 JS::Handle<JSObject*> givenProto) override; \
51 explicit Client##_Extension(ClientWebGLContext&); \
56 class ClientWebGLExtensionCompressedTextureASTC
57 : public ClientWebGLExtensionBase
{
59 virtual JSObject
* WrapObject(JSContext
* cx
,
60 JS::Handle
<JSObject
*> givenProto
) override
;
61 explicit ClientWebGLExtensionCompressedTextureASTC(ClientWebGLContext
&);
63 void GetSupportedProfiles(dom::Nullable
<nsTArray
<nsString
>>& retval
) const {
64 if (MOZ_UNLIKELY(!mContext
)) {
65 AutoJsWarning("getSupportedProfiles: Extension is `invalidated`.");
68 mContext
->GetSupportedProfilesASTC(retval
);
72 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionFloatBlend
)
74 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureBPTC
)
76 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureES3
)
78 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureETC1
)
80 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTexturePVRTC
)
82 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureRGTC
)
84 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionFBORenderMipmap
)
86 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureS3TC
)
88 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionCompressedTextureS3TC_SRGB
)
90 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionDebugRendererInfo
)
92 class ClientWebGLExtensionDebugShaders
: public ClientWebGLExtensionBase
{
94 virtual JSObject
* WrapObject(JSContext
* cx
,
95 JS::Handle
<JSObject
*> givenProto
) override
;
96 explicit ClientWebGLExtensionDebugShaders(ClientWebGLContext
&);
98 void GetTranslatedShaderSource(const WebGLShaderJS
& shader
,
99 nsAString
& retval
) const {
100 if (MOZ_UNLIKELY(!mContext
)) {
101 AutoJsWarning("getTranslatedShaderSource: Extension is `invalidated`.");
104 mContext
->GetTranslatedShaderSource(shader
, retval
);
108 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionDepthTexture
)
110 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionElementIndexUint
)
112 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionEXTColorBufferFloat
)
114 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionFragDepth
)
116 class ClientWebGLExtensionLoseContext
: public ClientWebGLExtensionBase
{
118 virtual JSObject
* WrapObject(JSContext
* cx
,
119 JS::Handle
<JSObject
*> givenProto
) override
;
120 explicit ClientWebGLExtensionLoseContext(ClientWebGLContext
&);
123 if (MOZ_UNLIKELY(!mContext
)) {
124 AutoJsWarning("loseContext: Extension is `invalidated`.");
127 mContext
->EmulateLoseContext();
129 void RestoreContext() {
130 if (MOZ_UNLIKELY(!mContext
)) {
131 AutoJsWarning("restoreContext: Extension is `invalidated`.");
134 mContext
->RestoreContext(webgl::LossStatus::LostManually
);
138 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionSRGB
)
140 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionStandardDerivatives
)
142 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionShaderTextureLod
)
144 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureFilterAnisotropic
)
146 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureFloat
)
148 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureFloatLinear
)
150 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureHalfFloat
)
152 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureHalfFloatLinear
)
154 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionTextureNorm16
)
156 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionColorBufferFloat
)
158 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionColorBufferHalfFloat
)
160 class ClientWebGLExtensionDrawBuffers
: public ClientWebGLExtensionBase
{
162 virtual JSObject
* WrapObject(JSContext
* cx
,
163 JS::Handle
<JSObject
*> givenProto
) override
;
164 explicit ClientWebGLExtensionDrawBuffers(ClientWebGLContext
&);
166 void DrawBuffersWEBGL(const dom::Sequence
<GLenum
>& buffers
) {
167 if (MOZ_UNLIKELY(!mContext
)) {
168 AutoJsWarning("drawBuffersWEBGL: Extension is `invalidated`.");
171 mContext
->DrawBuffers(buffers
);
175 class ClientWebGLExtensionVertexArray
: public ClientWebGLExtensionBase
{
177 virtual JSObject
* WrapObject(JSContext
* cx
,
178 JS::Handle
<JSObject
*> givenProto
) override
;
179 explicit ClientWebGLExtensionVertexArray(ClientWebGLContext
&);
181 already_AddRefed
<WebGLVertexArrayJS
> CreateVertexArrayOES() {
182 if (MOZ_UNLIKELY(!mContext
)) {
183 AutoJsWarning("createVertexArrayOES: Extension is `invalidated`.");
186 return mContext
->CreateVertexArray();
188 void DeleteVertexArrayOES(WebGLVertexArrayJS
* array
) {
189 if (MOZ_UNLIKELY(!mContext
)) {
190 AutoJsWarning("deleteVertexArrayOES: Extension is `invalidated`.");
193 mContext
->DeleteVertexArray(array
);
195 bool IsVertexArrayOES(const WebGLVertexArrayJS
* array
) {
196 if (MOZ_UNLIKELY(!mContext
)) {
197 AutoJsWarning("isVertexArrayOES: Extension is `invalidated`.");
200 return mContext
->IsVertexArray(array
);
202 void BindVertexArrayOES(WebGLVertexArrayJS
* array
) {
203 if (MOZ_UNLIKELY(!mContext
)) {
204 AutoJsWarning("bindVertexArrayOES: Extension is `invalidated`.");
207 mContext
->BindVertexArray(array
);
211 class ClientWebGLExtensionInstancedArrays
: public ClientWebGLExtensionBase
{
213 virtual JSObject
* WrapObject(JSContext
* cx
,
214 JS::Handle
<JSObject
*> givenProto
) override
;
215 explicit ClientWebGLExtensionInstancedArrays(ClientWebGLContext
&);
217 void DrawArraysInstancedANGLE(GLenum mode
, GLint first
, GLsizei count
,
219 if (MOZ_UNLIKELY(!mContext
)) {
220 AutoJsWarning("drawArraysInstancedANGLE: Extension is `invalidated`.");
223 mContext
->DrawArraysInstanced(mode
, first
, count
, primcount
);
225 void DrawElementsInstancedANGLE(GLenum mode
, GLsizei count
, GLenum type
,
226 WebGLintptr offset
, GLsizei primcount
) {
227 if (MOZ_UNLIKELY(!mContext
)) {
228 AutoJsWarning("drawElementsInstancedANGLE: Extension is `invalidated`.");
231 mContext
->DrawElementsInstanced(mode
, count
, type
, offset
, primcount
,
232 FuncScopeId::drawElementsInstanced
);
234 void VertexAttribDivisorANGLE(GLuint index
, GLuint divisor
) {
235 if (MOZ_UNLIKELY(!mContext
)) {
236 AutoJsWarning("vertexAttribDivisorANGLE: Extension is `invalidated`.");
239 mContext
->VertexAttribDivisor(index
, divisor
);
243 DECLARE_SIMPLE_WEBGL_EXTENSION(WebGLExtensionBlendMinMax
)
245 class ClientWebGLExtensionDisjointTimerQuery
: public ClientWebGLExtensionBase
{
247 virtual JSObject
* WrapObject(JSContext
* cx
,
248 JS::Handle
<JSObject
*> givenProto
) override
;
249 explicit ClientWebGLExtensionDisjointTimerQuery(ClientWebGLContext
&);
251 already_AddRefed
<WebGLQueryJS
> CreateQueryEXT() const {
252 if (MOZ_UNLIKELY(!mContext
)) {
253 AutoJsWarning("createQueryEXT: Extension is `invalidated`.");
256 return mContext
->CreateQuery();
258 void DeleteQueryEXT(WebGLQueryJS
* query
) const {
259 if (MOZ_UNLIKELY(!mContext
)) {
260 AutoJsWarning("deleteQueryEXT: Extension is `invalidated`.");
263 mContext
->DeleteQuery(query
);
265 bool IsQueryEXT(const WebGLQueryJS
* query
) const {
266 if (MOZ_UNLIKELY(!mContext
)) {
267 AutoJsWarning("isQueryEXT: Extension is `invalidated`.");
270 return mContext
->IsQuery(query
);
272 void BeginQueryEXT(GLenum target
, WebGLQueryJS
& query
) const {
273 if (MOZ_UNLIKELY(!mContext
)) {
274 AutoJsWarning("beginQueryEXT: Extension is `invalidated`.");
277 mContext
->BeginQuery(target
, query
);
279 void EndQueryEXT(GLenum target
) const {
280 if (MOZ_UNLIKELY(!mContext
)) {
281 AutoJsWarning("endQueryEXT: Extension is `invalidated`.");
284 mContext
->EndQuery(target
);
286 void QueryCounterEXT(WebGLQueryJS
& query
, GLenum target
) const {
287 if (MOZ_UNLIKELY(!mContext
)) {
288 AutoJsWarning("queryCounterEXT: Extension is `invalidated`.");
291 mContext
->QueryCounter(query
, target
);
293 void GetQueryEXT(JSContext
* cx
, GLenum target
, GLenum pname
,
294 JS::MutableHandle
<JS::Value
> retval
) const {
295 if (MOZ_UNLIKELY(!mContext
)) {
296 AutoJsWarning("getQueryEXT: Extension is `invalidated`.");
299 mContext
->GetQuery(cx
, target
, pname
, retval
);
301 void GetQueryObjectEXT(JSContext
* cx
, WebGLQueryJS
& query
, GLenum pname
,
302 JS::MutableHandle
<JS::Value
> retval
) const {
303 if (MOZ_UNLIKELY(!mContext
)) {
304 AutoJsWarning("getQueryObjectEXT: Extension is `invalidated`.");
307 mContext
->GetQueryParameter(cx
, query
, pname
, retval
);
311 class ClientWebGLExtensionExplicitPresent
: public ClientWebGLExtensionBase
{
313 virtual JSObject
* WrapObject(JSContext
* cx
,
314 JS::Handle
<JSObject
*> givenProto
) override
;
315 explicit ClientWebGLExtensionExplicitPresent(ClientWebGLContext
&);
317 void Present() const {
318 if (MOZ_UNLIKELY(!mContext
)) {
319 AutoJsWarning("present: Extension is `invalidated`.");
322 mContext
->OnBeforePaintTransaction();
326 class ClientWebGLExtensionMOZDebug
: public ClientWebGLExtensionBase
{
328 virtual JSObject
* WrapObject(JSContext
* cx
,
329 JS::Handle
<JSObject
*> givenProto
) override
;
330 explicit ClientWebGLExtensionMOZDebug(ClientWebGLContext
&);
332 void GetParameter(JSContext
* cx
, GLenum pname
,
333 JS::MutableHandle
<JS::Value
> retval
,
334 ErrorResult
& er
) const {
335 if (MOZ_UNLIKELY(!mContext
)) {
336 AutoJsWarning("getParameter: Extension is `invalidated`.");
339 mContext
->MOZDebugGetParameter(cx
, pname
, retval
, er
);
343 class ClientWebGLExtensionMultiview
: public ClientWebGLExtensionBase
{
345 virtual JSObject
* WrapObject(JSContext
* cx
,
346 JS::Handle
<JSObject
*> givenProto
) override
;
347 explicit ClientWebGLExtensionMultiview(ClientWebGLContext
&);
349 void FramebufferTextureMultiviewOVR(const GLenum target
,
350 const GLenum attachment
,
351 WebGLTextureJS
* const texture
,
353 const GLint baseViewIndex
,
354 const GLsizei numViews
) const {
355 if (MOZ_UNLIKELY(!mContext
)) {
357 "framebufferTextureMultiviewOVR: Extension is `invalidated`.");
360 mContext
->FramebufferTextureMultiview(target
, attachment
, texture
, level
,
361 baseViewIndex
, numViews
);
365 } // namespace mozilla
367 #endif // CLIENTWEBGLEXTENSIONS_H_