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