michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef WEBGLEXTENSIONS_H_ michael@0: #define WEBGLEXTENSIONS_H_ michael@0: michael@0: #include "jsapi.h" michael@0: #include "mozilla/Attributes.h" michael@0: #include "nsWrapperCache.h" michael@0: #include "WebGLObjectModel.h" michael@0: #include "WebGLTypes.h" michael@0: michael@0: namespace mozilla { michael@0: michael@0: class WebGLContext; michael@0: class WebGLShader; michael@0: class WebGLVertexArray; michael@0: michael@0: class WebGLExtensionBase michael@0: : public nsWrapperCache michael@0: , public WebGLContextBoundObject michael@0: { michael@0: public: michael@0: WebGLExtensionBase(WebGLContext*); michael@0: virtual ~WebGLExtensionBase(); michael@0: michael@0: WebGLContext *GetParentObject() const { michael@0: return Context(); michael@0: } michael@0: michael@0: void MarkLost(); michael@0: michael@0: NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGLExtensionBase) michael@0: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(WebGLExtensionBase) michael@0: michael@0: protected: michael@0: bool mIsLost; michael@0: }; michael@0: michael@0: #define DECL_WEBGL_EXTENSION_GOOP \ michael@0: virtual JSObject* WrapObject(JSContext *cx) MOZ_OVERRIDE; michael@0: michael@0: #define IMPL_WEBGL_EXTENSION_GOOP(WebGLExtensionType) \ michael@0: JSObject* \ michael@0: WebGLExtensionType::WrapObject(JSContext *cx) { \ michael@0: return dom::WebGLExtensionType##Binding::Wrap(cx, this); \ michael@0: } michael@0: michael@0: class WebGLExtensionCompressedTextureATC michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionCompressedTextureATC(WebGLContext*); michael@0: virtual ~WebGLExtensionCompressedTextureATC(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionCompressedTextureETC1 michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionCompressedTextureETC1(WebGLContext*); michael@0: virtual ~WebGLExtensionCompressedTextureETC1(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionCompressedTexturePVRTC michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionCompressedTexturePVRTC(WebGLContext*); michael@0: virtual ~WebGLExtensionCompressedTexturePVRTC(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionCompressedTextureS3TC michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionCompressedTextureS3TC(WebGLContext*); michael@0: virtual ~WebGLExtensionCompressedTextureS3TC(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionDebugRendererInfo michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionDebugRendererInfo(WebGLContext*); michael@0: virtual ~WebGLExtensionDebugRendererInfo(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionDebugShaders michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionDebugShaders(WebGLContext*); michael@0: virtual ~WebGLExtensionDebugShaders(); michael@0: michael@0: void GetTranslatedShaderSource(WebGLShader* shader, nsAString& retval); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionDepthTexture michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionDepthTexture(WebGLContext*); michael@0: virtual ~WebGLExtensionDepthTexture(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionElementIndexUint michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionElementIndexUint(WebGLContext*); michael@0: virtual ~WebGLExtensionElementIndexUint(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionFragDepth michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionFragDepth(WebGLContext*); michael@0: virtual ~WebGLExtensionFragDepth(); michael@0: michael@0: static bool IsSupported(const WebGLContext* context); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionLoseContext michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionLoseContext(WebGLContext*); michael@0: virtual ~WebGLExtensionLoseContext(); michael@0: michael@0: void LoseContext(); michael@0: void RestoreContext(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionSRGB michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionSRGB(WebGLContext*); michael@0: virtual ~WebGLExtensionSRGB(); michael@0: michael@0: static bool IsSupported(const WebGLContext* context); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionStandardDerivatives michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionStandardDerivatives(WebGLContext*); michael@0: virtual ~WebGLExtensionStandardDerivatives(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionTextureFilterAnisotropic michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionTextureFilterAnisotropic(WebGLContext*); michael@0: virtual ~WebGLExtensionTextureFilterAnisotropic(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionTextureFloat michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionTextureFloat(WebGLContext*); michael@0: virtual ~WebGLExtensionTextureFloat(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionTextureFloatLinear michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionTextureFloatLinear(WebGLContext*); michael@0: virtual ~WebGLExtensionTextureFloatLinear(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionTextureHalfFloat michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionTextureHalfFloat(WebGLContext*); michael@0: virtual ~WebGLExtensionTextureHalfFloat(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionTextureHalfFloatLinear michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionTextureHalfFloatLinear(WebGLContext*); michael@0: virtual ~WebGLExtensionTextureHalfFloatLinear(); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionColorBufferFloat michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionColorBufferFloat(WebGLContext*); michael@0: virtual ~WebGLExtensionColorBufferFloat(); michael@0: michael@0: static bool IsSupported(const WebGLContext*); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionColorBufferHalfFloat michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionColorBufferHalfFloat(WebGLContext*); michael@0: virtual ~WebGLExtensionColorBufferHalfFloat(); michael@0: michael@0: static bool IsSupported(const WebGLContext*); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionDrawBuffers michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionDrawBuffers(WebGLContext*); michael@0: virtual ~WebGLExtensionDrawBuffers(); michael@0: michael@0: void DrawBuffersWEBGL(const dom::Sequence& buffers); michael@0: michael@0: static bool IsSupported(const WebGLContext*); michael@0: michael@0: static const size_t sMinColorAttachments = 4; michael@0: static const size_t sMinDrawBuffers = 4; michael@0: /* michael@0: WEBGL_draw_buffers does not give a minal value for GL_MAX_DRAW_BUFFERS. But, we request michael@0: for GL_MAX_DRAW_BUFFERS = 4 at least to be able to use all requested color attachments. michael@0: See DrawBuffersWEBGL in WebGLExtensionDrawBuffers.cpp inner comments for more informations. michael@0: */ michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionVertexArray michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionVertexArray(WebGLContext*); michael@0: virtual ~WebGLExtensionVertexArray(); michael@0: michael@0: already_AddRefed CreateVertexArrayOES(); michael@0: void DeleteVertexArrayOES(WebGLVertexArray* array); michael@0: bool IsVertexArrayOES(WebGLVertexArray* array); michael@0: void BindVertexArrayOES(WebGLVertexArray* array); michael@0: michael@0: static bool IsSupported(const WebGLContext* context); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: class WebGLExtensionInstancedArrays michael@0: : public WebGLExtensionBase michael@0: { michael@0: public: michael@0: WebGLExtensionInstancedArrays(WebGLContext* context); michael@0: virtual ~WebGLExtensionInstancedArrays(); michael@0: michael@0: void DrawArraysInstancedANGLE(GLenum mode, GLint first, michael@0: GLsizei count, GLsizei primcount); michael@0: void DrawElementsInstancedANGLE(GLenum mode, GLsizei count, michael@0: GLenum type, WebGLintptr offset, michael@0: GLsizei primcount); michael@0: void VertexAttribDivisorANGLE(GLuint index, GLuint divisor); michael@0: michael@0: static bool IsSupported(const WebGLContext* context); michael@0: michael@0: DECL_WEBGL_EXTENSION_GOOP michael@0: }; michael@0: michael@0: } // namespace mozilla michael@0: michael@0: #endif // WEBGLEXTENSIONS_H_