1/* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef GraphicsContext3DInternal_h 27#define GraphicsContext3DInternal_h 28 29#include "GraphicsContext3D.h" 30#include <wtf/HashSet.h> 31#include <wtf/OwnPtr.h> 32#if USE(SKIA) 33#include "SkBitmap.h" 34#endif 35 36namespace WebKit { 37class WebGraphicsContext3D; 38class WebViewImpl; 39} // namespace WebKit 40 41namespace WebCore { 42 43class Extensions3DChromium; 44#if USE(ACCELERATED_COMPOSITING) 45class WebGLLayerChromium; 46#endif 47class GraphicsContextLostCallbackAdapter; 48 49class GraphicsContext3DInternal { 50public: 51 GraphicsContext3DInternal(); 52 ~GraphicsContext3DInternal(); 53 54 bool initialize(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow); 55 56 // Helper function to provide access to the lower-level WebGraphicsContext3D, 57 // which is needed for subordinate contexts like WebGL's to share resources 58 // with the compositor's context. 59 static WebKit::WebGraphicsContext3D* extractWebGraphicsContext3D(GraphicsContext3D* context); 60 61 PlatformGraphicsContext3D platformGraphicsContext3D() const; 62 Platform3DObject platformTexture() const; 63 64 bool makeContextCurrent(); 65 66 void reshape(int width, int height); 67 IntSize getInternalFramebufferSize(); 68 69 void markContextChanged(); 70 bool layerComposited() const; 71 void markLayerComposited(); 72 73 void paintRenderingResultsToCanvas(CanvasRenderingContext*); 74 PassRefPtr<ImageData> paintRenderingResultsToImageData(); 75 bool paintsIntoCanvasBuffer() const; 76 77 void prepareTexture(); 78 79#if USE(ACCELERATED_COMPOSITING) 80 WebGLLayerChromium* platformLayer() const; 81#endif 82 bool isGLES2Compliant() const; 83 84 void releaseShaderCompiler(); 85 bool isContextLost(); 86 87 //---------------------------------------------------------------------- 88 // Entry points for WebGL. 89 // 90 void activeTexture(GC3Denum texture); 91 void attachShader(Platform3DObject program, Platform3DObject shader); 92 void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name); 93 void bindBuffer(GC3Denum target, Platform3DObject); 94 void bindFramebuffer(GC3Denum target, Platform3DObject); 95 void bindRenderbuffer(GC3Denum target, Platform3DObject); 96 void bindTexture(GC3Denum target, Platform3DObject); 97 void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha); 98 void blendEquation(GC3Denum mode); 99 void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha); 100 void blendFunc(GC3Denum sfactor, GC3Denum dfactor); 101 void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha); 102 103 void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage); 104 void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage); 105 void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data); 106 107 GC3Denum checkFramebufferStatus(GC3Denum target); 108 void clear(GC3Dbitfield mask); 109 void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha); 110 void clearDepth(GC3Dclampf depth); 111 void clearStencil(GC3Dint s); 112 void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha); 113 void compileShader(Platform3DObject); 114 115 void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border); 116 void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); 117 void cullFace(GC3Denum mode); 118 void depthFunc(GC3Denum func); 119 void depthMask(GC3Dboolean flag); 120 void depthRange(GC3Dclampf zNear, GC3Dclampf zFar); 121 void detachShader(Platform3DObject, Platform3DObject); 122 void disable(GC3Denum cap); 123 void disableVertexAttribArray(GC3Duint index); 124 void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count); 125 void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset); 126 127 void enable(GC3Denum cap); 128 void enableVertexAttribArray(GC3Duint index); 129 void finish(); 130 void flush(); 131 void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject); 132 void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level); 133 void frontFace(GC3Denum mode); 134 void generateMipmap(GC3Denum target); 135 136 bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&); 137 bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&); 138 void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders); 139 GC3Dint getAttribLocation(Platform3DObject, const String& name); 140 void getBooleanv(GC3Denum pname, GC3Dboolean* value); 141 void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); 142 GraphicsContext3D::Attributes getContextAttributes(); 143 GC3Denum getError(); 144 void getFloatv(GC3Denum pname, GC3Dfloat* value); 145 void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value); 146 void getIntegerv(GC3Denum pname, GC3Dint* value); 147 void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value); 148 String getProgramInfoLog(Platform3DObject); 149 void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); 150 void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value); 151 String getShaderInfoLog(Platform3DObject); 152 153 String getShaderSource(Platform3DObject); 154 String getString(GC3Denum name); 155 void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value); 156 void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value); 157 void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value); 158 void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value); 159 GC3Dint getUniformLocation(Platform3DObject, const String& name); 160 void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value); 161 void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value); 162 GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname); 163 164 void hint(GC3Denum target, GC3Denum mode); 165 GC3Dboolean isBuffer(Platform3DObject); 166 GC3Dboolean isEnabled(GC3Denum cap); 167 GC3Dboolean isFramebuffer(Platform3DObject); 168 GC3Dboolean isProgram(Platform3DObject); 169 GC3Dboolean isRenderbuffer(Platform3DObject); 170 GC3Dboolean isShader(Platform3DObject); 171 GC3Dboolean isTexture(Platform3DObject); 172 void lineWidth(GC3Dfloat); 173 void linkProgram(Platform3DObject); 174 void pixelStorei(GC3Denum pname, GC3Dint param); 175 void polygonOffset(GC3Dfloat factor, GC3Dfloat units); 176 177 void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data); 178 179 void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height); 180 void sampleCoverage(GC3Dclampf value, GC3Dboolean invert); 181 void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); 182 void shaderSource(Platform3DObject, const String& string); 183 void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask); 184 void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask); 185 void stencilMask(GC3Duint mask); 186 void stencilMaskSeparate(GC3Denum face, GC3Duint mask); 187 void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass); 188 void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass); 189 190 // texImage2D return false on any error rather than using an ExceptionCode. 191 bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels); 192 void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param); 193 void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param); 194 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels); 195 196 void uniform1f(GC3Dint location, GC3Dfloat x); 197 void uniform1fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); 198 void uniform1i(GC3Dint location, GC3Dint x); 199 void uniform1iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); 200 void uniform2f(GC3Dint location, GC3Dfloat x, float y); 201 void uniform2fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); 202 void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y); 203 void uniform2iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); 204 void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z); 205 void uniform3fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); 206 void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z); 207 void uniform3iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); 208 void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w); 209 void uniform4fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size); 210 void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w); 211 void uniform4iv(GC3Dint location, GC3Dint* v, GC3Dsizei size); 212 void uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); 213 void uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); 214 void uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size); 215 216 void useProgram(Platform3DObject); 217 void validateProgram(Platform3DObject); 218 219 void vertexAttrib1f(GC3Duint index, GC3Dfloat x); 220 void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values); 221 void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y); 222 void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values); 223 void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z); 224 void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values); 225 void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w); 226 void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values); 227 void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized, 228 GC3Dsizei stride, GC3Dintptr offset); 229 230 void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height); 231 232 Platform3DObject createBuffer(); 233 Platform3DObject createFramebuffer(); 234 Platform3DObject createProgram(); 235 Platform3DObject createRenderbuffer(); 236 Platform3DObject createShader(GC3Denum); 237 Platform3DObject createTexture(); 238 239 void deleteBuffer(Platform3DObject); 240 void deleteFramebuffer(Platform3DObject); 241 void deleteProgram(Platform3DObject); 242 void deleteRenderbuffer(Platform3DObject); 243 void deleteShader(Platform3DObject); 244 void deleteTexture(Platform3DObject); 245 246 void synthesizeGLError(GC3Denum error); 247 248 void setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback>); 249 250 // Extensions3D support. 251 Extensions3D* getExtensions(); 252 bool supportsExtension(const String& name); 253 bool ensureExtensionEnabled(const String& name); 254 bool isExtensionEnabled(const String& name); 255 256 // EXT_texture_format_BGRA8888 257 bool supportsBGRA(); 258 259 // GL_CHROMIUM_map_sub 260 bool supportsMapSubCHROMIUM(); 261 void* mapBufferSubDataCHROMIUM(GC3Denum target, GC3Dsizeiptr offset, GC3Dsizei size, GC3Denum access); 262 void unmapBufferSubDataCHROMIUM(const void*); 263 void* mapTexSubImage2DCHROMIUM(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Denum access); 264 void unmapTexSubImage2DCHROMIUM(const void*); 265 266 // GL_CHROMIUM_copy_texture_to_parent_texture 267 bool supportsCopyTextureToParentTextureCHROMIUM(); 268 void copyTextureToParentTextureCHROMIUM(Platform3DObject texture, Platform3DObject parentTexture); 269 270 // GL_CHROMIUM_framebuffer_multisample 271 void blitFramebufferCHROMIUM(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter); 272 void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height); 273 274 // Latch support 275 void getParentToChildLatchCHROMIUM(GC3Duint* latchId); 276 void getChildToParentLatchCHROMIUM(GC3Duint* latchId); 277 void waitLatchCHROMIUM(GC3Duint latchId); 278 void setLatchCHROMIUM(GC3Duint latchId); 279 280private: 281 OwnPtr<WebKit::WebGraphicsContext3D> m_impl; 282 OwnPtr<Extensions3DChromium> m_extensions; 283 OwnPtr<GraphicsContextLostCallbackAdapter> m_contextLostCallbackAdapter; 284 WebKit::WebViewImpl* m_webViewImpl; 285 bool m_initializedAvailableExtensions; 286 HashSet<String> m_enabledExtensions; 287 HashSet<String> m_requestableExtensions; 288 bool m_layerComposited; 289#if USE(ACCELERATED_COMPOSITING) 290 RefPtr<WebGLLayerChromium> m_compositingLayer; 291#endif 292#if USE(SKIA) 293 // If the width and height of the Canvas's backing store don't 294 // match those that we were given in the most recent call to 295 // reshape(), then we need an intermediate bitmap to read back the 296 // frame buffer into. This seems to happen when CSS styles are 297 // used to resize the Canvas. 298 SkBitmap m_resizingBitmap; 299#endif 300 301#if USE(CG) 302 unsigned char* m_renderOutput; 303#endif 304 305 void initializeExtensions(); 306}; 307 308} // namespace WebCore 309 310#endif // GraphicsContext3D_h 311