1 /* -*- Mode: C++; tab-width: 20; 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 #ifndef WEBGL_EXTENSIONS_H_
7 #define WEBGL_EXTENSIONS_H_
8 
9 #include "mozilla/AlreadyAddRefed.h"
10 #include "nsString.h"
11 #include "nsTArray.h"
12 #include "nsWrapperCache.h"
13 #include "WebGLObjectModel.h"
14 #include "WebGLTypes.h"
15 
16 namespace mozilla {
17 class ErrorResult;
18 
19 namespace dom {
20 template <typename>
21 struct Nullable;
22 template <typename>
23 class Sequence;
24 }  // namespace dom
25 
26 namespace webgl {
27 class FormatUsageAuthority;
28 }  // namespace webgl
29 
30 class WebGLContext;
31 class WebGLShader;
32 class WebGLQuery;
33 class WebGLVertexArray;
34 
35 class WebGLExtensionBase : public nsWrapperCache,
36                            public WebGLContextBoundObject {
37  public:
38   explicit WebGLExtensionBase(WebGLContext* webgl);
39 
GetParentObject()40   WebGLContext* GetParentObject() const { return mContext; }
41 
42   void MarkLost();
43 
44   NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGLExtensionBase)
45   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(WebGLExtensionBase)
46 
47  protected:
48   virtual ~WebGLExtensionBase();
49 
OnMarkLost()50   virtual void OnMarkLost() {}
51 
52   bool mIsLost;
53 };
54 
55 #define DECL_WEBGL_EXTENSION_GOOP             \
56   virtual JSObject* WrapObject(JSContext* cx, \
57                                JS::Handle<JSObject*> givenProto) override;
58 
59 #define IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionType, WebGLBindingType)        \
60   JSObject* WebGLExtensionType::WrapObject(JSContext* cx,                      \
61                                            JS::Handle<JSObject*> givenProto) { \
62     return dom::WebGLBindingType##Binding::Wrap(cx, this, givenProto);         \
63   }
64 
65 ////
66 
67 class WebGLExtensionCompressedTextureASTC : public WebGLExtensionBase {
68  public:
69   explicit WebGLExtensionCompressedTextureASTC(WebGLContext* webgl);
70   virtual ~WebGLExtensionCompressedTextureASTC();
71 
72   void GetSupportedProfiles(dom::Nullable<nsTArray<nsString> >& retval) const;
73 
74   static bool IsSupported(const WebGLContext* webgl);
75 
76   DECL_WEBGL_EXTENSION_GOOP
77 };
78 
79 class WebGLExtensionCompressedTextureATC : public WebGLExtensionBase {
80  public:
81   explicit WebGLExtensionCompressedTextureATC(WebGLContext*);
82   virtual ~WebGLExtensionCompressedTextureATC();
83 
84   DECL_WEBGL_EXTENSION_GOOP
85 };
86 
87 class WebGLExtensionCompressedTextureES3 : public WebGLExtensionBase {
88  public:
89   explicit WebGLExtensionCompressedTextureES3(WebGLContext*);
90   virtual ~WebGLExtensionCompressedTextureES3();
91 
92   DECL_WEBGL_EXTENSION_GOOP
93 };
94 
95 class WebGLExtensionCompressedTextureETC1 : public WebGLExtensionBase {
96  public:
97   explicit WebGLExtensionCompressedTextureETC1(WebGLContext*);
98   virtual ~WebGLExtensionCompressedTextureETC1();
99 
100   DECL_WEBGL_EXTENSION_GOOP
101 };
102 
103 class WebGLExtensionCompressedTexturePVRTC : public WebGLExtensionBase {
104  public:
105   explicit WebGLExtensionCompressedTexturePVRTC(WebGLContext*);
106   virtual ~WebGLExtensionCompressedTexturePVRTC();
107 
108   DECL_WEBGL_EXTENSION_GOOP
109 };
110 
111 class WebGLExtensionCompressedTextureS3TC : public WebGLExtensionBase {
112  public:
113   explicit WebGLExtensionCompressedTextureS3TC(WebGLContext*);
114   virtual ~WebGLExtensionCompressedTextureS3TC();
115 
116   static bool IsSupported(const WebGLContext*);
117 
118   DECL_WEBGL_EXTENSION_GOOP
119 };
120 
121 class WebGLExtensionCompressedTextureS3TC_SRGB : public WebGLExtensionBase {
122  public:
123   explicit WebGLExtensionCompressedTextureS3TC_SRGB(WebGLContext*);
124   virtual ~WebGLExtensionCompressedTextureS3TC_SRGB();
125 
126   static bool IsSupported(const WebGLContext*);
127 
128   DECL_WEBGL_EXTENSION_GOOP
129 };
130 
131 class WebGLExtensionDebugRendererInfo : public WebGLExtensionBase {
132  public:
133   explicit WebGLExtensionDebugRendererInfo(WebGLContext*);
134   virtual ~WebGLExtensionDebugRendererInfo();
135 
136   DECL_WEBGL_EXTENSION_GOOP
137 };
138 
139 class WebGLExtensionDebugShaders : public WebGLExtensionBase {
140  public:
141   explicit WebGLExtensionDebugShaders(WebGLContext*);
142   virtual ~WebGLExtensionDebugShaders();
143 
144   void GetTranslatedShaderSource(const WebGLShader& shader,
145                                  nsAString& retval) const;
146 
147   DECL_WEBGL_EXTENSION_GOOP
148 };
149 
150 class WebGLExtensionDepthTexture : public WebGLExtensionBase {
151  public:
152   explicit WebGLExtensionDepthTexture(WebGLContext*);
153   virtual ~WebGLExtensionDepthTexture();
154 
155   DECL_WEBGL_EXTENSION_GOOP
156 };
157 
158 class WebGLExtensionElementIndexUint : public WebGLExtensionBase {
159  public:
160   explicit WebGLExtensionElementIndexUint(WebGLContext*);
161   virtual ~WebGLExtensionElementIndexUint();
162 
163   DECL_WEBGL_EXTENSION_GOOP
164 };
165 
166 class WebGLExtensionEXTColorBufferFloat : public WebGLExtensionBase {
167  public:
168   explicit WebGLExtensionEXTColorBufferFloat(WebGLContext*);
~WebGLExtensionEXTColorBufferFloat()169   virtual ~WebGLExtensionEXTColorBufferFloat() {}
170 
171   static bool IsSupported(const WebGLContext*);
172 
173   DECL_WEBGL_EXTENSION_GOOP
174 };
175 
176 class WebGLExtensionFragDepth : public WebGLExtensionBase {
177  public:
178   explicit WebGLExtensionFragDepth(WebGLContext*);
179   virtual ~WebGLExtensionFragDepth();
180 
181   static bool IsSupported(const WebGLContext* context);
182 
183   DECL_WEBGL_EXTENSION_GOOP
184 };
185 
186 class WebGLExtensionLoseContext : public WebGLExtensionBase {
187  public:
188   explicit WebGLExtensionLoseContext(WebGLContext*);
189   virtual ~WebGLExtensionLoseContext();
190 
191   void LoseContext();
192   void RestoreContext();
193 
194   DECL_WEBGL_EXTENSION_GOOP
195 };
196 
197 class WebGLExtensionSRGB : public WebGLExtensionBase {
198  public:
199   explicit WebGLExtensionSRGB(WebGLContext*);
200   virtual ~WebGLExtensionSRGB();
201 
202   static bool IsSupported(const WebGLContext* context);
203 
204   DECL_WEBGL_EXTENSION_GOOP
205 };
206 
207 class WebGLExtensionStandardDerivatives : public WebGLExtensionBase {
208  public:
209   explicit WebGLExtensionStandardDerivatives(WebGLContext*);
210   virtual ~WebGLExtensionStandardDerivatives();
211 
212   DECL_WEBGL_EXTENSION_GOOP
213 };
214 
215 class WebGLExtensionShaderTextureLod : public WebGLExtensionBase {
216  public:
217   explicit WebGLExtensionShaderTextureLod(WebGLContext*);
218   virtual ~WebGLExtensionShaderTextureLod();
219 
220   DECL_WEBGL_EXTENSION_GOOP
221 };
222 
223 class WebGLExtensionTextureFilterAnisotropic : public WebGLExtensionBase {
224  public:
225   explicit WebGLExtensionTextureFilterAnisotropic(WebGLContext*);
226   virtual ~WebGLExtensionTextureFilterAnisotropic();
227 
228   DECL_WEBGL_EXTENSION_GOOP
229 };
230 
231 class WebGLExtensionTextureFloat : public WebGLExtensionBase {
232  public:
233   static void InitWebGLFormats(webgl::FormatUsageAuthority* authority);
234 
235   explicit WebGLExtensionTextureFloat(WebGLContext*);
236   virtual ~WebGLExtensionTextureFloat();
237 
238   static bool IsSupported(const WebGLContext*);
239 
240   DECL_WEBGL_EXTENSION_GOOP
241 };
242 
243 class WebGLExtensionTextureFloatLinear : public WebGLExtensionBase {
244  public:
245   explicit WebGLExtensionTextureFloatLinear(WebGLContext*);
246   virtual ~WebGLExtensionTextureFloatLinear();
247 
248   DECL_WEBGL_EXTENSION_GOOP
249 };
250 
251 class WebGLExtensionTextureHalfFloat : public WebGLExtensionBase {
252  public:
253   static void InitWebGLFormats(webgl::FormatUsageAuthority* authority);
254 
255   explicit WebGLExtensionTextureHalfFloat(WebGLContext*);
256   virtual ~WebGLExtensionTextureHalfFloat();
257 
258   static bool IsSupported(const WebGLContext*);
259 
260   DECL_WEBGL_EXTENSION_GOOP
261 };
262 
263 class WebGLExtensionTextureHalfFloatLinear : public WebGLExtensionBase {
264  public:
265   explicit WebGLExtensionTextureHalfFloatLinear(WebGLContext*);
266   virtual ~WebGLExtensionTextureHalfFloatLinear();
267 
268   DECL_WEBGL_EXTENSION_GOOP
269 };
270 
271 class WebGLExtensionColorBufferFloat : public WebGLExtensionBase {
272  public:
273   explicit WebGLExtensionColorBufferFloat(WebGLContext*);
274   virtual ~WebGLExtensionColorBufferFloat();
275 
276   static bool IsSupported(const WebGLContext*);
277 
278   DECL_WEBGL_EXTENSION_GOOP
279 };
280 
281 class WebGLExtensionColorBufferHalfFloat : public WebGLExtensionBase {
282  public:
283   explicit WebGLExtensionColorBufferHalfFloat(WebGLContext*);
284   virtual ~WebGLExtensionColorBufferHalfFloat();
285 
286   static bool IsSupported(const WebGLContext*);
287 
288   DECL_WEBGL_EXTENSION_GOOP
289 };
290 
291 class WebGLExtensionDrawBuffers : public WebGLExtensionBase {
292  public:
293   explicit WebGLExtensionDrawBuffers(WebGLContext*);
294   virtual ~WebGLExtensionDrawBuffers();
295 
296   void DrawBuffersWEBGL(const dom::Sequence<GLenum>& buffers);
297 
298   static bool IsSupported(const WebGLContext*);
299 
300   DECL_WEBGL_EXTENSION_GOOP
301 };
302 
303 class WebGLExtensionVertexArray : public WebGLExtensionBase {
304  public:
305   explicit WebGLExtensionVertexArray(WebGLContext* webgl);
306   virtual ~WebGLExtensionVertexArray();
307 
308   already_AddRefed<WebGLVertexArray> CreateVertexArrayOES();
309   void DeleteVertexArrayOES(WebGLVertexArray* array);
310   bool IsVertexArrayOES(const WebGLVertexArray* array);
311   void BindVertexArrayOES(WebGLVertexArray* array);
312 
313   DECL_WEBGL_EXTENSION_GOOP
314 };
315 
316 class WebGLExtensionInstancedArrays : public WebGLExtensionBase {
317  public:
318   explicit WebGLExtensionInstancedArrays(WebGLContext* webgl);
319   virtual ~WebGLExtensionInstancedArrays();
320 
321   void DrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count,
322                                 GLsizei primcount);
323   void DrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type,
324                                   WebGLintptr offset, GLsizei primcount);
325   void VertexAttribDivisorANGLE(GLuint index, GLuint divisor);
326 
327   static bool IsSupported(const WebGLContext* webgl);
328 
329   DECL_WEBGL_EXTENSION_GOOP
330 };
331 
332 class WebGLExtensionBlendMinMax : public WebGLExtensionBase {
333  public:
334   explicit WebGLExtensionBlendMinMax(WebGLContext* webgl);
335   virtual ~WebGLExtensionBlendMinMax();
336 
337   static bool IsSupported(const WebGLContext*);
338 
339   DECL_WEBGL_EXTENSION_GOOP
340 };
341 
342 class WebGLExtensionDisjointTimerQuery : public WebGLExtensionBase {
343  public:
344   explicit WebGLExtensionDisjointTimerQuery(WebGLContext* webgl);
345   virtual ~WebGLExtensionDisjointTimerQuery();
346 
347   already_AddRefed<WebGLQuery> CreateQueryEXT() const;
348   void DeleteQueryEXT(WebGLQuery* query) const;
349   bool IsQueryEXT(const WebGLQuery* query) const;
350   void BeginQueryEXT(GLenum target, WebGLQuery& query) const;
351   void EndQueryEXT(GLenum target) const;
352   void QueryCounterEXT(WebGLQuery& query, GLenum target) const;
353   void GetQueryEXT(JSContext* cx, GLenum target, GLenum pname,
354                    JS::MutableHandleValue retval) const;
355   void GetQueryObjectEXT(JSContext* cx, const WebGLQuery& query, GLenum pname,
356                          JS::MutableHandleValue retval) const;
357 
358   static bool IsSupported(const WebGLContext*);
359 
360   DECL_WEBGL_EXTENSION_GOOP
361 };
362 
363 class WebGLExtensionMOZDebug final : public WebGLExtensionBase {
364  public:
365   explicit WebGLExtensionMOZDebug(WebGLContext* webgl);
366   virtual ~WebGLExtensionMOZDebug();
367 
368   void GetParameter(JSContext* cx, GLenum pname,
369                     JS::MutableHandle<JS::Value> retval, ErrorResult& er) const;
370 
371   DECL_WEBGL_EXTENSION_GOOP
372 };
373 
374 }  // namespace mozilla
375 
376 #endif  // WEBGL_EXTENSIONS_H_
377