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