/* * Copyright (C) 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef WebGLRenderingContext_h #define WebGLRenderingContext_h #include "CanvasRenderingContext.h" #include "ExceptionCode.h" #include "WebGLFloatArray.h" #include "WebGLGetInfo.h" #include "WebGLIntArray.h" #include "WebGLUnsignedByteArray.h" #include "GraphicsContext3D.h" #include "PlatformString.h" namespace WebCore { class WebGLActiveInfo; class WebGLBuffer; class WebGLFramebuffer; class CanvasObject; class WebGLProgram; class WebGLRenderbuffer; class WebGLShader; class WebGLTexture; class WebGLUniformLocation; class HTMLImageElement; class HTMLVideoElement; class ImageData; class WebKitCSSMatrix; class WebGLRenderingContext : public CanvasRenderingContext { public: static PassOwnPtr create(HTMLCanvasElement*); virtual ~WebGLRenderingContext(); virtual bool is3d() const { return true; } // Helper to return the size in bytes of OpenGL data types // like GL_FLOAT, GL_INT, etc. int sizeInBytes(int type, ExceptionCode& ec); void activeTexture(unsigned long texture, ExceptionCode& ec); void attachShader(WebGLProgram*, WebGLShader*, ExceptionCode& ec); void bindAttribLocation(WebGLProgram*, unsigned long index, const String& name, ExceptionCode& ec); void bindBuffer(unsigned long target, WebGLBuffer*, ExceptionCode& ec); void bindFramebuffer(unsigned long target, WebGLFramebuffer*, ExceptionCode& ec); void bindRenderbuffer(unsigned long target, WebGLRenderbuffer*, ExceptionCode& ec); void bindTexture(unsigned long target, WebGLTexture*, ExceptionCode& ec); void blendColor(double red, double green, double blue, double alpha); void blendEquation(unsigned long mode); void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); void blendFunc(unsigned long sfactor, unsigned long dfactor); void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); void bufferData(unsigned long target, int size, unsigned long usage, ExceptionCode&); void bufferData(unsigned long target, WebGLArray* data, unsigned long usage, ExceptionCode&); void bufferSubData(unsigned long target, long offset, WebGLArray* data, ExceptionCode&); unsigned long checkFramebufferStatus(unsigned long target); void clear(unsigned long mask); void clearColor(double red, double green, double blue, double alpha); void clearDepth(double); void clearStencil(long); void colorMask(bool red, bool green, bool blue, bool alpha); void compileShader(WebGLShader*, ExceptionCode& ec); //void compressedTexImage2D(unsigned long target, long level, unsigned long internalformat, unsigned long width, unsigned long height, long border, unsigned long imageSize, const void* data); //void compressedTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, unsigned long width, unsigned long height, unsigned long format, unsigned long imageSize, const void* data); void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); PassRefPtr createBuffer(); PassRefPtr createFramebuffer(); PassRefPtr createProgram(); PassRefPtr createRenderbuffer(); PassRefPtr createShader(unsigned long type, ExceptionCode&); PassRefPtr createTexture(); void cullFace(unsigned long mode); void deleteBuffer(WebGLBuffer*); void deleteFramebuffer(WebGLFramebuffer*); void deleteProgram(WebGLProgram*); void deleteRenderbuffer(WebGLRenderbuffer*); void deleteShader(WebGLShader*); void deleteTexture(WebGLTexture*); void depthFunc(unsigned long); void depthMask(bool); void depthRange(double zNear, double zFar); void detachShader(WebGLProgram*, WebGLShader*, ExceptionCode&); void disable(unsigned long cap); void disableVertexAttribArray(unsigned long index, ExceptionCode&); void drawArrays(unsigned long mode, long first, long count, ExceptionCode&); void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset, ExceptionCode&); void enable(unsigned long cap); void enableVertexAttribArray(unsigned long index, ExceptionCode&); void finish(); void flush(); void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, WebGLRenderbuffer*, ExceptionCode& ec); void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, WebGLTexture*, long level, ExceptionCode& ec); void frontFace(unsigned long mode); void generateMipmap(unsigned long target); PassRefPtr getActiveAttrib(WebGLProgram*, unsigned long index, ExceptionCode&); PassRefPtr getActiveUniform(WebGLProgram*, unsigned long index, ExceptionCode&); int getAttribLocation(WebGLProgram*, const String& name); WebGLGetInfo getBufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); unsigned long getError(); WebGLGetInfo getFramebufferAttachmentParameter(unsigned long target, unsigned long attachment, unsigned long pname, ExceptionCode&); WebGLGetInfo getParameter(unsigned long pname, ExceptionCode&); WebGLGetInfo getProgramParameter(WebGLProgram*, unsigned long pname, ExceptionCode&); String getProgramInfoLog(WebGLProgram*, ExceptionCode& ec); WebGLGetInfo getRenderbufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); WebGLGetInfo getShaderParameter(WebGLShader*, unsigned long pname, ExceptionCode& ec); String getShaderInfoLog(WebGLShader*, ExceptionCode& ec); // TBD // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); String getShaderSource(WebGLShader*, ExceptionCode&); String getString(unsigned long name); WebGLGetInfo getTexParameter(unsigned long target, unsigned long pname, ExceptionCode&); WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&); PassRefPtr getUniformLocation(WebGLProgram*, const String&, ExceptionCode&); WebGLGetInfo getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode&); long getVertexAttribOffset(unsigned long index, unsigned long pname); void hint(unsigned long target, unsigned long mode); bool isBuffer(WebGLBuffer*); bool isEnabled(unsigned long cap); bool isFramebuffer(WebGLFramebuffer*); bool isProgram(WebGLProgram*); bool isRenderbuffer(WebGLRenderbuffer*); bool isShader(WebGLShader*); bool isTexture(WebGLTexture*); void lineWidth(double); void linkProgram(WebGLProgram*, ExceptionCode&); void pixelStorei(unsigned long pname, long param); void polygonOffset(double factor, double units); PassRefPtr readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type); void releaseShaderCompiler(); void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); void sampleCoverage(double value, bool invert); void scissor(long x, long y, unsigned long width, unsigned long height); void shaderSource(WebGLShader*, const String&, ExceptionCode&); void stencilFunc(unsigned long func, long ref, unsigned long mask); void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); void stencilMask(unsigned long); void stencilMaskSeparate(unsigned long face, unsigned long mask); void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); void texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, WebGLArray* pixels, ExceptionCode&); void texImage2D(unsigned target, unsigned level, unsigned internalformat, unsigned width, unsigned height, unsigned border, unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); void texParameterf(unsigned target, unsigned pname, float param); void texParameteri(unsigned target, unsigned pname, int param); void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, WebGLArray* pixels, ExceptionCode&); void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, unsigned width, unsigned height, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); void uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode&); void uniform1fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&); void uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); void uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode&); void uniform1iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&); void uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); void uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode&); void uniform2fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&); void uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); void uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode&); void uniform2iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&); void uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); void uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode&); void uniform3fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&); void uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); void uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode&); void uniform3iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&); void uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); void uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode&); void uniform4fv(const WebGLUniformLocation* location, WebGLFloatArray* v, ExceptionCode&); void uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); void uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode&); void uniform4iv(const WebGLUniformLocation* location, WebGLIntArray* v, ExceptionCode&); void uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&); void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&); void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, WebGLFloatArray* value, ExceptionCode&); void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); void useProgram(WebGLProgram*, ExceptionCode&); void validateProgram(WebGLProgram*, ExceptionCode&); void vertexAttrib1f(unsigned long indx, float x); void vertexAttrib1fv(unsigned long indx, WebGLFloatArray* values); void vertexAttrib1fv(unsigned long indx, float* values, int size); void vertexAttrib2f(unsigned long indx, float x, float y); void vertexAttrib2fv(unsigned long indx, WebGLFloatArray* values); void vertexAttrib2fv(unsigned long indx, float* values, int size); void vertexAttrib3f(unsigned long indx, float x, float y, float z); void vertexAttrib3fv(unsigned long indx, WebGLFloatArray* values); void vertexAttrib3fv(unsigned long indx, float* values, int size); void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w); void vertexAttrib4fv(unsigned long indx, WebGLFloatArray* values); void vertexAttrib4fv(unsigned long indx, float* values, int size); void vertexAttribPointer(unsigned long indx, long size, unsigned long type, bool normalized, unsigned long stride, unsigned long offset, ExceptionCode&); void viewport(long x, long y, unsigned long width, unsigned long height); GraphicsContext3D* graphicsContext3D() const { return m_context.get(); } void reshape(int width, int height); // Helpers for notification about paint events. void beginPaint(); void endPaint(); void removeObject(CanvasObject*); private: friend class CanvasObject; WebGLRenderingContext(HTMLCanvasElement*, PassOwnPtr); void addObject(CanvasObject*); void detachAndRemoveAllObjects(); void markContextChanged(); void cleanupAfterGraphicsCall(bool changed) { if (changed) markContextChanged(); } bool validateIndexArray(unsigned long count, unsigned long type, long offset, long& numElements); bool validateRenderingState(long numElements); OwnPtr m_context; bool m_needsUpdate; bool m_markedCanvasDirty; // FIXME: I think this is broken -- it does not increment any // reference counts, so may refer to destroyed objects. HashSet > m_canvasObjects; // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER RefPtr m_boundArrayBuffer; RefPtr m_boundElementArrayBuffer; // Cached values for vertex attrib range checks class VertexAttribState { public: VertexAttribState() : enabled(false), numElements(0) { } bool enabled; long numElements; }; Vector m_vertexAttribState; unsigned m_maxVertexAttribs; RefPtr m_currentProgram; RefPtr m_framebufferBinding; RefPtr m_renderbufferBinding; class TextureUnitState { public: RefPtr m_texture2DBinding; RefPtr m_textureCubeMapBinding; }; TextureUnitState m_textureUnits[32]; unsigned long m_activeTextureUnit; // Helpers for getParameter and others WebGLGetInfo getBooleanParameter(unsigned long pname); WebGLGetInfo getFloatParameter(unsigned long pname); WebGLGetInfo getIntParameter(unsigned long pname); WebGLGetInfo getLongParameter(unsigned long pname); WebGLGetInfo getUnsignedLongParameter(unsigned long pname); WebGLGetInfo getWebGLFloatArrayParameter(unsigned long pname); WebGLGetInfo getWebGLIntArrayParameter(unsigned long pname); WebGLGetInfo getWebGLUnsignedByteArrayParameter(unsigned long pname); friend class WebGLStateRestorer; }; } // namespace WebCore #endif