| /* |
| * Copyright (C) 2010 Google 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 AND ITS CONTRIBUTORS "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 OR ITS 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 GraphicsContext3DInternal_h |
| #define GraphicsContext3DInternal_h |
| |
| #include "GraphicsContext3D.h" |
| #include <wtf/HashSet.h> |
| #include <wtf/OwnPtr.h> |
| #if USE(SKIA) |
| #include "SkBitmap.h" |
| #endif |
| |
| namespace WebKit { |
| class WebGraphicsContext3D; |
| class WebViewImpl; |
| } // namespace WebKit |
| |
| namespace WebCore { |
| |
| class Extensions3DChromium; |
| #if USE(ACCELERATED_COMPOSITING) |
| class WebGLLayerChromium; |
| #endif |
| class GraphicsContextLostCallbackAdapter; |
| |
| class GraphicsContext3DInternal { |
| public: |
| GraphicsContext3DInternal(); |
| ~GraphicsContext3DInternal(); |
| |
| bool initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow); |
| |
| // Helper function to provide access to the lower-level WebGraphicsContext3D, |
| // which is needed for subordinate contexts like WebGL's to share resources |
| // with the compositor's context. |
| static WebKit::WebGraphicsContext3D* extractWebGraphicsContext3D(GraphicsContext3D* context); |
| |
| PlatformGraphicsContext3D platformGraphicsContext3D() const; |
| Platform3DObject platformTexture() const; |
| |
| bool makeContextCurrent(); |
| |
| void reshape(int width, int height); |
| IntSize getInternalFramebufferSize(); |
| |
| void markContextChanged(); |
| bool layerComposited() const; |
| void markLayerComposited(); |
| |
| void paintRenderingResultsToCanvas(CanvasRenderingContext*); |
| PassRefPtr<ImageData> paintRenderingResultsToImageData(); |
| bool paintsIntoCanvasBuffer() const; |
| |
| void prepareTexture(); |
| |
| #if USE(ACCELERATED_COMPOSITING) |
| WebGLLayerChromium* platformLayer() const; |
| #endif |
| bool isGLES2Compliant() const; |
| |
| void releaseShaderCompiler(); |
| bool isContextLost(); |
| |
| //---------------------------------------------------------------------- |
| // Entry points for WebGL. |
| // |
| void activeTexture(GC3Denum texture); |
| void attachShader(Platform3DObject program, Platform3DObject shader); |
| void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name); |
| void bindBuffer(GC3Denum target, Platform3DObject); |
| void bindFramebuffer(GC3Denum target, Platform3DObject); |
| void bindRenderbuffer(GC3Denum target, Platform3DObject); |
| void bindTexture(GC3Denum target, Platform3DObject); |
| void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha); |
| void blendEquation(GC3Denum mode); |
| void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha); |
| void blendFunc(GC3Denum sfactor, GC3Denum dfactor); |
| void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha); |
| |
| void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage); |
| void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage); |
| void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data); |
| |
| GC3Denum checkFramebufferStatus(GC3Denum target); |
| void clear(GC3Dbitfield mask); |
| void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha); |
| void clearDepth(GC3Dclampf depth); |
| void clearStencil(GC3Dint s); |
| void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha); |
| void compileShader(Platform3DObject); |
| |
| void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border); |
| void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); |
| void cullFace(GC3Denum mode); |
| void depthFunc(GC3Denum func); |
| void depthMask(GC3Dboolean flag); |
| void depthRange(GC3Dclampf zNear, GC3Dclampf zFar); |
| void detachShader(Platform3DObject, Platform3DObject); |
| void disable(GC3Denum cap); |
| void disableVertexAttribArray(GC3Duint index); |
| void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count); |
| void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset); |
| |
| void enable(GC3Denum cap); |
| void enableVertexAttribArray(GC3Duint index); |
| void finish(); |
| void flush(); |
| void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject); |
| void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level); |
| void frontFace(GC3Denum mode); |
| void generateMipmap(GC3Denum target); |
| |
| bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&); |
| bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&); |
| void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders); |
| GC3Dint getAttribLocation(Platform3DObject, const String& name); |
| void getBooleanv(GC3Denum pname, GC3Dboolean* value); |
| void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); |
| GraphicsContext3D::Attributes getContextAttributes(); |
| GC3Denum getError(); |
| void getFloatv(GC3Denum pname, GC3Dfloat* value); |
| void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value); |
| void getIntegerv(GC3Denum pname, GC3Dint* value); |
| void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value); |
| String getProgramInfoLog(Platform3DObject); |
| void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); |
| void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value); |
| String getShaderInfoLog(Platform3DObject); |
| |
| String getShaderSource(Platform3DObject); |
| String getString(GC3Denum name); |
| void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value); |
| void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); |
| void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value); |
| void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value); |
| GC3Dint getUniformLocation(Platform3DObject, const String& name); |
| void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value); |
| void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value); |
| GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname); |
| |
| void hint(GC3Denum target, GC3Denum mode); |
| GC3Dboolean isBuffer(Platform3DObject); |
| GC3Dboolean isEnabled(GC3Denum cap); |
| GC3Dboolean isFramebuffer(Platform3DObject); |
| GC3Dboolean isProgram(Platform3DObject); |
| GC3Dboolean isRenderbuffer(Platform3DObject); |
| GC3Dboolean isShader(Platform3DObject); |
| GC3Dboolean isTexture(Platform3DObject); |
| void lineWidth(GC3Dfloat); |
| void linkProgram(Platform3DObject); |
| void pixelStorei(GC3Denum pname, GC3Dint param); |
| void polygonOffset(GC3Dfloat factor, GC3Dfloat units); |
| |
| void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data); |
| |
| void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height); |
| void sampleCoverage(GC3Dclampf value, GC3Dboolean invert); |
| void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); |
| void shaderSource(Platform3DObject, const String& string); |
| void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask); |
| void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask); |
| void stencilMask(GC3Duint mask); |
| void stencilMaskSeparate(GC3Denum face, GC3Duint mask); |
| void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass); |
| void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass); |
| |
| // texImage2D return false on any error rather than using an ExceptionCode. |
| bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels); |
| void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param); |
| void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param); |
| void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels); |
| |
| void uniform1f(GC3Dint location, GC3Dfloat x); |
| void uniform1fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); |
| void uniform1i(GC3Dint location, GC3Dint x); |
| void uniform1iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); |
| void uniform2f(GC3Dint location, GC3Dfloat x, float y); |
| void uniform2fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); |
| void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y); |
| void uniform2iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); |
| void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z); |
| void uniform3fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); |
| void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z); |
| void uniform3iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); |
| void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w); |
| void uniform4fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); |
| void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w); |
| void uniform4iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); |
| void uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); |
| void uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); |
| void uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); |
| |
| void useProgram(Platform3DObject); |
| void validateProgram(Platform3DObject); |
| |
| void vertexAttrib1f(GC3Duint index, GC3Dfloat x); |
| void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values); |
| void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y); |
| void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values); |
| void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z); |
| void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values); |
| void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w); |
| void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values); |
| void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, |
| GC3Dsizei stride, GC3Dintptr offset); |
| |
| void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); |
| |
| Platform3DObject createBuffer(); |
| Platform3DObject createFramebuffer(); |
| Platform3DObject createProgram(); |
| Platform3DObject createRenderbuffer(); |
| Platform3DObject createShader(GC3Denum); |
| Platform3DObject createTexture(); |
| |
| void deleteBuffer(Platform3DObject); |
| void deleteFramebuffer(Platform3DObject); |
| void deleteProgram(Platform3DObject); |
| void deleteRenderbuffer(Platform3DObject); |
| void deleteShader(Platform3DObject); |
| void deleteTexture(Platform3DObject); |
| |
| void synthesizeGLError(GC3Denum error); |
| |
| void setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback>); |
| |
| // Extensions3D support. |
| Extensions3D* getExtensions(); |
| bool supportsExtension(const String& name); |
| bool ensureExtensionEnabled(const String& name); |
| bool isExtensionEnabled(const String& name); |
| |
| // EXT_texture_format_BGRA8888 |
| bool supportsBGRA(); |
| |
| // GL_CHROMIUM_map_sub |
| bool supportsMapSubCHROMIUM(); |
| void* mapBufferSubDataCHROMIUM(GC3Denum target, GC3Dsizeiptr offset, GC3Dsizei size, GC3Denum access); |
| void unmapBufferSubDataCHROMIUM(const void*); |
| void* mapTexSubImage2DCHROMIUM(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Denum access); |
| void unmapTexSubImage2DCHROMIUM(const void*); |
| |
| // GL_CHROMIUM_copy_texture_to_parent_texture |
| bool supportsCopyTextureToParentTextureCHROMIUM(); |
| void copyTextureToParentTextureCHROMIUM(Platform3DObject texture, Platform3DObject parentTexture); |
| |
| // GL_CHROMIUM_framebuffer_multisample |
| void blitFramebufferCHROMIUM(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter); |
| void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height); |
| |
| // Latch support |
| void getParentToChildLatchCHROMIUM(GC3Duint* latchId); |
| void getChildToParentLatchCHROMIUM(GC3Duint* latchId); |
| void waitLatchCHROMIUM(GC3Duint latchId); |
| void setLatchCHROMIUM(GC3Duint latchId); |
| |
| private: |
| OwnPtr<WebKit::WebGraphicsContext3D> m_impl; |
| OwnPtr<Extensions3DChromium> m_extensions; |
| OwnPtr<GraphicsContextLostCallbackAdapter> m_contextLostCallbackAdapter; |
| WebKit::WebViewImpl* m_webViewImpl; |
| bool m_initializedAvailableExtensions; |
| HashSet<String> m_enabledExtensions; |
| HashSet<String> m_requestableExtensions; |
| bool m_layerComposited; |
| #if USE(ACCELERATED_COMPOSITING) |
| RefPtr<WebGLLayerChromium> m_compositingLayer; |
| #endif |
| #if USE(SKIA) |
| // If the width and height of the Canvas's backing store don't |
| // match those that we were given in the most recent call to |
| // reshape(), then we need an intermediate bitmap to read back the |
| // frame buffer into. This seems to happen when CSS styles are |
| // used to resize the Canvas. |
| SkBitmap m_resizingBitmap; |
| #endif |
| |
| #if USE(CG) |
| unsigned char* m_renderOutput; |
| #endif |
| |
| void initializeExtensions(); |
| }; |
| |
| } // namespace WebCore |
| |
| #endif // GraphicsContext3D_h |