Unreviewed, rolling out r111207.
[WebKit-https.git] / Source / WebKit / chromium / src / GraphicsContext3DPrivate.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 GraphicsContext3DPrivate_h
27 #define GraphicsContext3DPrivate_h
28
29 #include "Extensions3DChromium.h"
30 #include "GraphicsContext3D.h"
31 #include <wtf/HashSet.h>
32 #include <wtf/OwnArrayPtr.h>
33 #include <wtf/OwnPtr.h>
34 #if USE(SKIA)
35 #include "SkBitmap.h"
36 #endif
37
38 #if USE(SKIA)
39 class GrContext;
40 #endif
41
42 namespace WebKit {
43 class WebGraphicsContext3D;
44 }
45
46 namespace WebCore {
47
48 class DrawingBuffer;
49 class Extensions3DChromium;
50 class GraphicsContextLostCallbackAdapter;
51 class GraphicsContext3DSwapBuffersCompleteCallbackAdapter;
52 class GraphicsErrorMessageCallbackAdapter;
53 class GraphicsContext3DMemoryAllocationChangedCallbackAdapter;
54
55 class GraphicsContext3DPrivate {
56 public:
57     // Callers must make the context current before using it AND check that the context was created successfully
58     // via ContextLost before using the context in any way. Once made current on a thread, the context cannot
59     // be used on any other thread.
60     static PassRefPtr<GraphicsContext3D> createGraphicsContextFromWebContext(PassOwnPtr<WebKit::WebGraphicsContext3D>, GraphicsContext3D::RenderStyle, bool preserveDrawingBuffer = false);
61
62     ~GraphicsContext3DPrivate();
63
64     // Helper function to provide access to the lower-level WebGraphicsContext3D,
65     // which is needed for subordinate contexts like WebGL's to share resources
66     // with the compositor's context.
67     static WebKit::WebGraphicsContext3D* extractWebGraphicsContext3D(GraphicsContext3D*);
68
69     PlatformGraphicsContext3D platformGraphicsContext3D() const;
70     Platform3DObject platformTexture() const;
71 #if USE(SKIA)
72     GrContext* grContext();
73 #endif
74
75     bool makeContextCurrent();
76
77     void reshape(int width, int height);
78     IntSize getInternalFramebufferSize() const;
79     bool isResourceSafe();
80
81     void markContextChanged();
82     bool layerComposited() const;
83     void markLayerComposited();
84
85     void paintRenderingResultsToCanvas(CanvasRenderingContext*, DrawingBuffer*);
86     void paintFramebufferToCanvas(int framebuffer, int width, int height, bool premultiplyAlpha, ImageBuffer*);
87     PassRefPtr<ImageData> paintRenderingResultsToImageData(DrawingBuffer*);
88     bool paintCompositedResultsToCanvas(CanvasRenderingContext*);
89
90     void prepareTexture();
91
92     // CHROMIUM_post_sub_buffer
93     void postSubBufferCHROMIUM(int x, int y, int width, int height);
94
95     bool isGLES2Compliant() const;
96
97     void releaseShaderCompiler();
98     bool isContextLost();
99
100     //----------------------------------------------------------------------
101     // Entry points for WebGL.
102     //
103     void activeTexture(GC3Denum texture);
104     void attachShader(Platform3DObject program, Platform3DObject shader);
105     void bindAttribLocation(Platform3DObject, GC3Duint index, const String& name);
106     void bindBuffer(GC3Denum target, Platform3DObject);
107     void bindFramebuffer(GC3Denum target, Platform3DObject);
108     void bindRenderbuffer(GC3Denum target, Platform3DObject);
109     void bindTexture(GC3Denum target, Platform3DObject);
110     void blendColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
111     void blendEquation(GC3Denum mode);
112     void blendEquationSeparate(GC3Denum modeRGB, GC3Denum modeAlpha);
113     void blendFunc(GC3Denum sfactor, GC3Denum dfactor);
114     void blendFuncSeparate(GC3Denum srcRGB, GC3Denum dstRGB, GC3Denum srcAlpha, GC3Denum dstAlpha);
115
116     void bufferData(GC3Denum target, GC3Dsizeiptr, GC3Denum usage);
117     void bufferData(GC3Denum target, GC3Dsizeiptr, const void* data, GC3Denum usage);
118     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr, const void* data);
119
120     GC3Denum checkFramebufferStatus(GC3Denum target);
121     void clear(GC3Dbitfield mask);
122     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
123     void clearDepth(GC3Dclampf depth);
124     void clearStencil(GC3Dint s);
125     void colorMask(GC3Dboolean red, GC3Dboolean green, GC3Dboolean blue, GC3Dboolean alpha);
126     void compileShader(Platform3DObject);
127
128     void compressedTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Dsizei imageSize, const void* data);
129     void compressedTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Dsizei imageSize, const void* data);
130     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border);
131     void copyTexSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
132     void cullFace(GC3Denum mode);
133     void depthFunc(GC3Denum func);
134     void depthMask(GC3Dboolean flag);
135     void depthRange(GC3Dclampf zNear, GC3Dclampf zFar);
136     void detachShader(Platform3DObject, Platform3DObject);
137     void disable(GC3Denum cap);
138     void disableVertexAttribArray(GC3Duint index);
139     void drawArrays(GC3Denum mode, GC3Dint first, GC3Dsizei count);
140     void drawElements(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset);
141
142     void enable(GC3Denum cap);
143     void enableVertexAttribArray(GC3Duint index);
144     void finish();
145     void flush();
146     void framebufferRenderbuffer(GC3Denum target, GC3Denum attachment, GC3Denum renderbuffertarget, Platform3DObject);
147     void framebufferTexture2D(GC3Denum target, GC3Denum attachment, GC3Denum textarget, Platform3DObject, GC3Dint level);
148     void frontFace(GC3Denum mode);
149     void generateMipmap(GC3Denum target);
150
151     bool getActiveAttrib(Platform3DObject program, GC3Duint index, ActiveInfo&);
152     bool getActiveUniform(Platform3DObject program, GC3Duint index, ActiveInfo&);
153     void getAttachedShaders(Platform3DObject program, GC3Dsizei maxCount, GC3Dsizei* count, Platform3DObject* shaders);
154     GC3Dint getAttribLocation(Platform3DObject, const String& name);
155     void getBooleanv(GC3Denum pname, GC3Dboolean* value);
156     void getBufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
157     GraphicsContext3D::Attributes getContextAttributes();
158     GC3Denum getError();
159     void getFloatv(GC3Denum pname, GC3Dfloat* value);
160     void getFramebufferAttachmentParameteriv(GC3Denum target, GC3Denum attachment, GC3Denum pname, GC3Dint* value);
161     void getIntegerv(GC3Denum pname, GC3Dint* value);
162     void getProgramiv(Platform3DObject program, GC3Denum pname, GC3Dint* value);
163     String getProgramInfoLog(Platform3DObject);
164     void getRenderbufferParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
165     void getShaderiv(Platform3DObject, GC3Denum pname, GC3Dint* value);
166     String getShaderInfoLog(Platform3DObject);
167
168     String getShaderSource(Platform3DObject);
169     String getString(GC3Denum name);
170     void getTexParameterfv(GC3Denum target, GC3Denum pname, GC3Dfloat* value);
171     void getTexParameteriv(GC3Denum target, GC3Denum pname, GC3Dint* value);
172     void getUniformfv(Platform3DObject program, GC3Dint location, GC3Dfloat* value);
173     void getUniformiv(Platform3DObject program, GC3Dint location, GC3Dint* value);
174     GC3Dint getUniformLocation(Platform3DObject, const String& name);
175     void getVertexAttribfv(GC3Duint index, GC3Denum pname, GC3Dfloat* value);
176     void getVertexAttribiv(GC3Duint index, GC3Denum pname, GC3Dint* value);
177     GC3Dsizeiptr getVertexAttribOffset(GC3Duint index, GC3Denum pname);
178
179     void hint(GC3Denum target, GC3Denum mode);
180     GC3Dboolean isBuffer(Platform3DObject);
181     GC3Dboolean isEnabled(GC3Denum cap);
182     GC3Dboolean isFramebuffer(Platform3DObject);
183     GC3Dboolean isProgram(Platform3DObject);
184     GC3Dboolean isRenderbuffer(Platform3DObject);
185     GC3Dboolean isShader(Platform3DObject);
186     GC3Dboolean isTexture(Platform3DObject);
187     void lineWidth(GC3Dfloat);
188     void linkProgram(Platform3DObject);
189     void pixelStorei(GC3Denum pname, GC3Dint param);
190     void polygonOffset(GC3Dfloat factor, GC3Dfloat units);
191
192     void readPixels(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, void* data);
193
194     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
195     void sampleCoverage(GC3Dclampf value, GC3Dboolean invert);
196     void scissor(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
197     void shaderSource(Platform3DObject, const String&);
198     void stencilFunc(GC3Denum func, GC3Dint ref, GC3Duint mask);
199     void stencilFuncSeparate(GC3Denum face, GC3Denum func, GC3Dint ref, GC3Duint mask);
200     void stencilMask(GC3Duint mask);
201     void stencilMaskSeparate(GC3Denum face, GC3Duint mask);
202     void stencilOp(GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
203     void stencilOpSeparate(GC3Denum face, GC3Denum fail, GC3Denum zfail, GC3Denum zpass);
204
205     // texImage2D return false on any error rather than using an ExceptionCode.
206     bool texImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, const void* pixels);
207     void texParameterf(GC3Denum target, GC3Denum pname, GC3Dfloat param);
208     void texParameteri(GC3Denum target, GC3Denum pname, GC3Dint param);
209     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, const void* pixels);
210
211     void uniform1f(GC3Dint location, GC3Dfloat x);
212     void uniform1fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
213     void uniform1i(GC3Dint location, GC3Dint x);
214     void uniform1iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
215     void uniform2f(GC3Dint location, GC3Dfloat x, float y);
216     void uniform2fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
217     void uniform2i(GC3Dint location, GC3Dint x, GC3Dint y);
218     void uniform2iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
219     void uniform3f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
220     void uniform3fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
221     void uniform3i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z);
222     void uniform3iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
223     void uniform4f(GC3Dint location, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
224     void uniform4fv(GC3Dint location, GC3Dsizei, GC3Dfloat* v);
225     void uniform4i(GC3Dint location, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
226     void uniform4iv(GC3Dint location, GC3Dsizei, GC3Dint* v);
227     void uniformMatrix2fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
228     void uniformMatrix3fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
229     void uniformMatrix4fv(GC3Dint location, GC3Dsizei, GC3Dboolean transpose, GC3Dfloat* value);
230
231     void useProgram(Platform3DObject);
232     void validateProgram(Platform3DObject);
233
234     void vertexAttrib1f(GC3Duint index, GC3Dfloat x);
235     void vertexAttrib1fv(GC3Duint index, GC3Dfloat* values);
236     void vertexAttrib2f(GC3Duint index, GC3Dfloat x, GC3Dfloat y);
237     void vertexAttrib2fv(GC3Duint index, GC3Dfloat* values);
238     void vertexAttrib3f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z);
239     void vertexAttrib3fv(GC3Duint index, GC3Dfloat* values);
240     void vertexAttrib4f(GC3Duint index, GC3Dfloat x, GC3Dfloat y, GC3Dfloat z, GC3Dfloat w);
241     void vertexAttrib4fv(GC3Duint index, GC3Dfloat* values);
242     void vertexAttribPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dboolean normalized,
243                              GC3Dsizei stride, GC3Dintptr offset);
244
245     void viewport(GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
246
247     Platform3DObject createBuffer();
248     Platform3DObject createFramebuffer();
249     Platform3DObject createProgram();
250     Platform3DObject createRenderbuffer();
251     Platform3DObject createShader(GC3Denum);
252     Platform3DObject createTexture();
253
254     void deleteBuffer(Platform3DObject);
255     void deleteFramebuffer(Platform3DObject);
256     void deleteProgram(Platform3DObject);
257     void deleteRenderbuffer(Platform3DObject);
258     void deleteShader(Platform3DObject);
259     void deleteTexture(Platform3DObject);
260
261     void synthesizeGLError(GC3Denum error);
262
263     void setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback>);
264     void setErrorMessageCallback(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback>);
265
266     // Extensions3D support.
267     Extensions3D* getExtensions();
268     bool supportsExtension(const String& name);
269     bool ensureExtensionEnabled(const String& name);
270     bool isExtensionEnabled(const String& name);
271
272     // EXT_texture_format_BGRA8888
273     bool supportsBGRA();
274
275     // GL_CHROMIUM_map_sub
276     bool supportsMapSubCHROMIUM();
277     void* mapBufferSubDataCHROMIUM(GC3Denum target, GC3Dsizeiptr offset, GC3Dsizei, GC3Denum access);
278     void unmapBufferSubDataCHROMIUM(const void*);
279     void* mapTexSubImage2DCHROMIUM(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum format, GC3Denum type, GC3Denum access);
280     void unmapTexSubImage2DCHROMIUM(const void*);
281
282     // GL_CHROMIUM_set_visibility
283     void setVisibilityCHROMIUM(bool);
284
285     // GL_CHROMIUM_gpu_memory_manager
286     void setGpuMemoryAllocationChangedCallbackCHROMIUM(PassOwnPtr<Extensions3DChromium::GpuMemoryAllocationChangedCallbackCHROMIUM>);
287
288     // GL_CHROMIUM_framebuffer_multisample
289     void blitFramebufferCHROMIUM(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter);
290     void renderbufferStorageMultisampleCHROMIUM(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
291
292     // GL_CHROMIUM_swapbuffers_complete_callback
293     void setSwapBuffersCompleteCallbackCHROMIUM(PassOwnPtr<Extensions3DChromium::SwapBuffersCompleteCallbackCHROMIUM>);
294
295     // GL_CHROMIUM_rate_limit_offscreen_context
296     void rateLimitOffscreenContextCHROMIUM();
297
298     // GL_ARB_robustness
299     GC3Denum getGraphicsResetStatusARB();
300
301     // GL_ANGLE_translated_shader_source
302     String getTranslatedShaderSourceANGLE(Platform3DObject shader);
303
304     // GL_CHROMIUM_iosurface
305     void texImageIOSurface2DCHROMIUM(GC3Denum target, GC3Dint width, GC3Dint height, GC3Duint ioSurfaceId, GC3Duint plane);
306
307     // GL_EXT_texture_storage
308     void texStorage2DEXT(GC3Denum target, GC3Dint levels, GC3Duint internalformat, GC3Dint width, GC3Dint height);
309
310 private:
311     GraphicsContext3DPrivate(PassOwnPtr<WebKit::WebGraphicsContext3D>, bool preserveDrawingBuffer);
312
313     OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
314     OwnPtr<Extensions3DChromium> m_extensions;
315     OwnPtr<GraphicsContextLostCallbackAdapter> m_contextLostCallbackAdapter;
316     OwnPtr<GraphicsErrorMessageCallbackAdapter> m_errorMessageCallbackAdapter;
317     OwnPtr<GraphicsContext3DSwapBuffersCompleteCallbackAdapter> m_swapBuffersCompleteCallbackAdapter;
318     OwnPtr<GraphicsContext3DMemoryAllocationChangedCallbackAdapter> m_memoryAllocationChangedCallbackAdapter;
319     bool m_initializedAvailableExtensions;
320     HashSet<String> m_enabledExtensions;
321     HashSet<String> m_requestableExtensions;
322     bool m_layerComposited;
323     bool m_preserveDrawingBuffer;
324
325     enum ResourceSafety {
326         ResourceSafetyUnknown,
327         ResourceSafe,
328         ResourceUnsafe
329     };
330     ResourceSafety m_resourceSafety;
331
332 #if USE(SKIA)
333     // If the width and height of the Canvas's backing store don't
334     // match those that we were given in the most recent call to
335     // reshape(), then we need an intermediate bitmap to read back the
336     // frame buffer into. This seems to happen when CSS styles are
337     // used to resize the Canvas.
338     SkBitmap m_resizingBitmap;
339
340     GrContext* m_grContext;
341 #endif
342
343 #if USE(CG)
344     OwnArrayPtr<unsigned char> m_renderOutput;
345     size_t m_renderOutputSize;
346 #endif
347
348     void initializeExtensions();
349 };
350
351 } // namespace WebCore
352
353 #endif // GraphicsContext3DPrivate_h