2011-03-15 John Bauman <jbauman@chromium.org>
[WebKit-https.git] / Source / WebKit / chromium / src / GraphicsContext3DInternal.h
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
36 namespace WebKit {
37 class WebGraphicsContext3D;
38 class WebViewImpl;
39 } // namespace WebKit
40
41 namespace WebCore {
42
43 class Extensions3DChromium;
44 #if USE(ACCELERATED_COMPOSITING)
45 class WebGLLayerChromium;
46 #endif
47 class GraphicsContextLostCallbackAdapter;
48
49 class GraphicsContext3DInternal {
50 public:
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 paintRenderingResultsToCanvas(CanvasRenderingContext*);
70     PassRefPtr<ImageData> paintRenderingResultsToImageData();
71     bool paintsIntoCanvasBuffer() const;
72
73     void prepareTexture();
74
75 #if USE(ACCELERATED_COMPOSITING)
76     WebGLLayerChromium* platformLayer() const;
77 #endif
78     bool isGLES2Compliant() const;
79
80     void releaseShaderCompiler();
81     bool isContextLost();
82
83     //----------------------------------------------------------------------
84     // Entry points for WebGL.
85     //
86     void activeTexture(GC3Denum texture);
87     void attachShader(Platform3DObject program, Platform3DObject shader);
88     void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
89     void bindBuffer(GC3Denum target, Platform3DObject);
90     void bindFramebuffer(GC3Denum target, Platform3DObject);
91     void bindRenderbuffer(GC3Denum target, Platform3DObject);
92     void bindTexture(GC3Denum target, Platform3DObject);
93     void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
94     void blendEquation(GC3Denum mode);
95     void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
96     void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
97     void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
98
99     void bufferData(GC3Denum target, GC3Dsizeiptr size, GC3Denum usage);
100     void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
101     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
102
103     GC3Denum checkFramebufferStatus(GC3Denum target);
104     void clear(GC3Dbitfield mask);
105     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
106     void clearDepth(GC3Dclampf depth);
107     void clearStencil(GC3Dint s);
108     void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
109     void compileShader(Platform3DObject);
110
111     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
112     void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
113     void cullFace(GC3Denum mode);
114     void depthFunc(GC3Denum func);
115     void depthMask(GC3Dboolean flag);
116     void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
117     void detachShader(Platform3DObject, Platform3DObject);
118     void disable(GC3Denum cap);
119     void disableVertexAttribArray(GC3Duint index);
120     void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
121     void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
122
123     void enable(GC3Denum cap);
124     void enableVertexAttribArray(GC3Duint index);
125     void finish();
126     void flush();
127     void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
128     void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
129     void frontFace(GC3Denum mode);
130     void generateMipmap(GC3Denum target);
131
132     bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
133     bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
134     void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
135     GC3Dint getAttribLocation(Platform3DObject, const String& name);
136     void getBooleanv(GC3Denum pname, GC3Dboolean* value);
137     void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
138     GraphicsContext3D::Attributes getContextAttributes();
139     GC3Denum getError();
140     void getFloatv(GC3Denum pname, GC3Dfloat* value);
141     void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
142     void getIntegerv(GC3Denum pname, GC3Dint* value);
143     void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
144     String getProgramInfoLog(Platform3DObject);
145     void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
146     void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
147     String getShaderInfoLog(Platform3DObject);
148
149     String getShaderSource(Platform3DObject);
150     String getString(GC3Denum name);
151     void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
152     void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
153     void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
154     void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
155     GC3Dint getUniformLocation(Platform3DObject, const String& name);
156     void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
157     void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
158     GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
159
160     void hint(GC3Denum target, GC3Denum mode);
161     GC3Dboolean isBuffer(Platform3DObject);
162     GC3Dboolean isEnabled(GC3Denum cap);
163     GC3Dboolean isFramebuffer(Platform3DObject);
164     GC3Dboolean isProgram(Platform3DObject);
165     GC3Dboolean isRenderbuffer(Platform3DObject);
166     GC3Dboolean isShader(Platform3DObject);
167     GC3Dboolean isTexture(Platform3DObject);
168     void lineWidth(GC3Dfloat);
169     void linkProgram(Platform3DObject);
170     void pixelStorei(GC3Denum pname, GC3Dint param);
171     void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
172
173     void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
174
175     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
176     void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
177     void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
178     void shaderSource(Platform3DObject, const String& string);
179     void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
180     void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
181     void stencilMask(GC3Duint mask);
182     void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
183     void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
184     void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
185
186     // texImage2D return false on any error rather than using an ExceptionCode.
187     bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
188     void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
189     void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
190     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
191
192     void uniform1f(GC3Dint location, GC3Dfloat x);
193     void uniform1fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
194     void uniform1i(GC3Dint location, GC3Dint x);
195     void uniform1iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
196     void uniform2f(GC3Dint location, GC3Dfloat x, float y);
197     void uniform2fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
198     void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
199     void uniform2iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
200     void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
201     void uniform3fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
202     void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
203     void uniform3iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
204     void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
205     void uniform4fv(GC3Dint location, GC3Dfloat* v, GC3Dsizei size);
206     void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
207     void uniform4iv(GC3Dint location, GC3Dint* v, GC3Dsizei size);
208     void uniformMatrix2fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
209     void uniformMatrix3fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
210     void uniformMatrix4fv(GC3Dint location, GC3Dboolean transpose, GC3Dfloat* value, GC3Dsizei size);
211
212     void useProgram(Platform3DObject);
213     void validateProgram(Platform3DObject);
214
215     void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
216     void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
217     void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
218     void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
219     void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
220     void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
221     void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
222     void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
223     void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
224                              GC3Dsizei stride, GC3Dintptr offset);
225
226     void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
227
228     Platform3DObject createBuffer();
229     Platform3DObject createFramebuffer();
230     Platform3DObject createProgram();
231     Platform3DObject createRenderbuffer();
232     Platform3DObject createShader(GC3Denum);
233     Platform3DObject createTexture();
234
235     void deleteBuffer(Platform3DObject);
236     void deleteFramebuffer(Platform3DObject);
237     void deleteProgram(Platform3DObject);
238     void deleteRenderbuffer(Platform3DObject);
239     void deleteShader(Platform3DObject);
240     void deleteTexture(Platform3DObject);
241
242     void synthesizeGLError(GC3Denum error);
243
244     void setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback>);
245
246     // Extensions3D support.
247     Extensions3D* getExtensions();
248     bool supportsExtension(const String& name);
249     bool ensureExtensionEnabled(const String& name);
250
251     // EXT_texture_format_BGRA8888
252     bool supportsBGRA();
253
254     // GL_CHROMIUM_map_sub
255     bool supportsMapSubCHROMIUM();
256     void* mapBufferSubDataCHROMIUM(GC3Denum target, GC3Dsizeiptr offset, GC3Dsizei size, GC3Denum access);
257     void unmapBufferSubDataCHROMIUM(const void*);
258     void* mapTexSubImage2DCHROMIUM(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Denum access);
259     void unmapTexSubImage2DCHROMIUM(const void*);
260
261     // GL_CHROMIUM_copy_texture_to_parent_texture
262     bool supportsCopyTextureToParentTextureCHROMIUM();
263     void copyTextureToParentTextureCHROMIUM(Platform3DObject texture, Platform3DObject parentTexture);
264
265     // GL_CHROMIUM_framebuffer_multisample
266     void blitFramebufferCHROMIUM(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter);
267     void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
268
269 private:
270     OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
271     OwnPtr<Extensions3DChromium> m_extensions;
272     OwnPtr<GraphicsContextLostCallbackAdapter> m_contextLostCallbackAdapter;
273     WebKit::WebViewImpl* m_webViewImpl;
274     bool m_initializedAvailableExtensions;
275     HashSet<String> m_enabledExtensions;
276     HashSet<String> m_requestableExtensions;
277 #if USE(ACCELERATED_COMPOSITING)
278     RefPtr<WebGLLayerChromium> m_compositingLayer;
279 #endif
280 #if USE(SKIA)
281     // If the width and height of the Canvas's backing store don't
282     // match those that we were given in the most recent call to
283     // reshape(), then we need an intermediate bitmap to read back the
284     // frame buffer into. This seems to happen when CSS styles are
285     // used to resize the Canvas.
286     SkBitmap m_resizingBitmap;
287 #endif
288
289 #if PLATFORM(CG)
290     unsigned char* m_renderOutput;
291 #endif
292
293     void initializeExtensions();
294 };
295
296 } // namespace WebCore
297
298 #endif // GraphicsContext3D_h