5dde45a76100e14c39e1493abab0c0dfe049afd2
[WebKit-https.git] / Source / WebCore / html / canvas / WebGL2RenderingContext.h
1 /*
2  * Copyright (C) 2015 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef WebGL2RenderingContext_h
27 #define WebGL2RenderingContext_h
28
29 #if ENABLE(WEBGL2)
30
31 #include "WebGLRenderingContextBase.h"
32 #include <wtf/Variant.h>
33
34 namespace WebCore {
35
36 class WebGLQuery;
37 class WebGLSampler;
38 class WebGLSync;
39 class WebGLTransformFeedback;
40 class WebGLVertexArrayObject;
41
42 class WebGL2RenderingContext final : public WebGLRenderingContextBase {
43 public:
44     WebGL2RenderingContext(HTMLCanvasElement*, GraphicsContext3D::Attributes);
45     WebGL2RenderingContext(HTMLCanvasElement*, RefPtr<GraphicsContext3D>&&, GraphicsContext3D::Attributes);
46     bool isWebGL2() const override { return true; }
47
48     /* Buffer objects */
49     void bufferData(GC3Denum target, ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length);
50     void bufferSubData(GC3Denum target, long long offset, ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length);
51     void copyBufferSubData(GC3Denum readTarget, GC3Denum writeTarget, GC3Dint64 readOffset, GC3Dint64 writeOffset, GC3Dint64 size);
52     void getBufferSubData(GC3Denum target, GC3Dint64 offset, RefPtr<ArrayBufferView>&& returnedData);
53     void getBufferSubData(GC3Denum target, GC3Dint64 offset, ArrayBuffer* returnedData);
54     
55     /* Framebuffer objects */
56     WebGLGetInfo getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&) override;
57     void blitFramebuffer(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter);
58     void framebufferTextureLayer(GC3Denum target, GC3Denum attachment, GC3Duint texture, GC3Dint level, GC3Dint layer);
59     WebGLGetInfo getInternalformatParameter(GC3Denum target, GC3Denum internalformat, GC3Denum pname);
60     void invalidateFramebuffer(GC3Denum target, Vector<GC3Denum> attachments);
61     void invalidateSubFramebuffer(GC3Denum target, Vector<GC3Denum> attachments, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
62     void readBuffer(GC3Denum src);
63     
64     /* Renderbuffer objects */
65     void renderbufferStorageMultisample(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
66     
67     /* Texture objects */
68     void texStorage2D(GC3Denum target, GC3Dsizei levels, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
69     void texStorage3D(GC3Denum target, GC3Dsizei levels, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth);
70     void texImage3D(GC3Denum target, GC3Dint level, GC3Dint internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Denum format, GC3Denum type, RefPtr<ArrayBufferView>&& pixels);
71
72     void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Denum format, GC3Denum type, RefPtr<ArrayBufferView>&& pixels);
73     using TexImageSource = WTF::Variant<RefPtr<ImageData>, RefPtr<HTMLImageElement>, RefPtr<HTMLCanvasElement>, RefPtr<HTMLVideoElement>>;
74     void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, TexImageSource&&);
75
76     void copyTexSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
77     void compressedTexImage3D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Dsizei imageSize, RefPtr<ArrayBufferView>&& data);
78     void compressedTexSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Denum format, GC3Dsizei imageSize, RefPtr<ArrayBufferView>&& data);
79     
80     /* Programs and shaders */
81     GC3Dint getFragDataLocation(WebGLProgram* program, String name);
82     
83     /* Uniforms and attributes */
84     void uniform1ui(WebGLUniformLocation*, GC3Duint v0);
85     void uniform2ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1);
86     void uniform3ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1, GC3Duint v2);
87     void uniform4ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1, GC3Duint v2, GC3Duint v3);
88     void uniform1uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
89     void uniform2uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
90     void uniform3uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
91     void uniform4uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
92     void uniformMatrix2x3fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
93     void uniformMatrix3x2fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
94     void uniformMatrix2x4fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
95     void uniformMatrix4x2fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
96     void uniformMatrix3x4fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
97     void uniformMatrix4x3fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
98     void vertexAttribI4i(GC3Duint index, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
99     void vertexAttribI4iv(GC3Duint index, RefPtr<Int32Array>&& v);
100     void vertexAttribI4ui(GC3Duint index, GC3Duint x, GC3Duint y, GC3Duint z, GC3Duint w);
101     void vertexAttribI4uiv(GC3Duint index, RefPtr<Uint32Array>&& v);
102     void vertexAttribIPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dsizei stride, GC3Dint64 offset);
103     
104     /* Writing to the drawing buffer */
105     void clear(GC3Dbitfield mask) override;
106     void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
107     void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei instanceCount);
108     void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dint64 offset, GC3Dsizei instanceCount);
109     void drawRangeElements(GC3Denum mode, GC3Duint start, GC3Duint end, GC3Dsizei count, GC3Denum type, GC3Dint64 offset);
110     
111     /* Multiple Render Targets */
112     void drawBuffers(Vector<GC3Denum> buffers);
113     void clearBufferiv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Int32Array>&& value);
114     void clearBufferuiv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Uint32Array>&& value);
115     void clearBufferfv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Float32Array>&& value);
116     void clearBufferfi(GC3Denum buffer, GC3Dint drawbuffer, GC3Dfloat depth, GC3Dint stencil);
117     
118     /* Query Objects */
119     RefPtr<WebGLQuery> createQuery();
120     void deleteQuery(WebGLQuery* query);
121     GC3Dboolean isQuery(WebGLQuery* query);
122     void beginQuery(GC3Denum target, WebGLQuery* query);
123     void endQuery(GC3Denum target);
124     RefPtr<WebGLQuery> getQuery(GC3Denum target, GC3Denum pname);
125     WebGLGetInfo getQueryParameter(WebGLQuery* query, GC3Denum pname);
126     
127     /* Sampler Objects */
128     RefPtr<WebGLSampler> createSampler();
129     void deleteSampler(WebGLSampler* sampler);
130     GC3Dboolean isSampler(WebGLSampler* sampler);
131     void bindSampler(GC3Duint unit, WebGLSampler* sampler);
132     void samplerParameteri(WebGLSampler* sampler, GC3Denum pname, GC3Dint param);
133     void samplerParameterf(WebGLSampler* sampler, GC3Denum pname, GC3Dfloat param);
134     WebGLGetInfo getSamplerParameter(WebGLSampler* sampler, GC3Denum pname);
135     
136     /* Sync objects */
137     RefPtr<WebGLSync> fenceSync(GC3Denum condition, GC3Dbitfield flags);
138     GC3Dboolean isSync(WebGLSync* sync);
139     void deleteSync(WebGLSync* sync);
140     GC3Denum clientWaitSync(WebGLSync* sync, GC3Dbitfield flags, GC3Duint64 timeout);
141     void waitSync(WebGLSync* sync, GC3Dbitfield flags, GC3Duint64 timeout);
142     WebGLGetInfo getSyncParameter(WebGLSync* sync, GC3Denum pname);
143     
144     /* Transform Feedback */
145     RefPtr<WebGLTransformFeedback> createTransformFeedback();
146     void deleteTransformFeedback(WebGLTransformFeedback* id);
147     GC3Dboolean isTransformFeedback(WebGLTransformFeedback* id);
148     void bindTransformFeedback(GC3Denum target, WebGLTransformFeedback* id);
149     void beginTransformFeedback(GC3Denum primitiveMode);
150     void endTransformFeedback();
151     void transformFeedbackVaryings(WebGLProgram*, Vector<String> varyings, GC3Denum bufferMode);
152     RefPtr<WebGLActiveInfo> getTransformFeedbackVarying(WebGLProgram*, GC3Duint index);
153     void pauseTransformFeedback();
154     void resumeTransformFeedback();
155     
156     /* Uniform Buffer Objects and Transform Feedback Buffers */
157     void bindBufferBase(GC3Denum target, GC3Duint index, WebGLBuffer* buffer);
158     void bindBufferRange(GC3Denum target, GC3Duint index, WebGLBuffer* buffer, GC3Dint64 offset, GC3Dint64 size);
159     WebGLGetInfo getIndexedParameter(GC3Denum target, GC3Duint index);
160     Uint32Array* getUniformIndices(WebGLProgram*, Vector<String> uniformNames);
161     Int32Array* getActiveUniforms(WebGLProgram*, RefPtr<Uint32Array>&& uniformIndices, GC3Denum pname);
162     GC3Duint getUniformBlockIndex(WebGLProgram*, String uniformBlockName);
163     WebGLGetInfo getActiveUniformBlockParameter(WebGLProgram*, GC3Duint uniformBlockIndex, GC3Denum pname);
164     WebGLGetInfo getActiveUniformBlockName(WebGLProgram*, GC3Duint uniformBlockIndex);
165     void uniformBlockBinding(WebGLProgram*, GC3Duint uniformBlockIndex, GC3Duint uniformBlockBinding);
166     
167     /* Vertex Array Objects */
168     RefPtr<WebGLVertexArrayObject> createVertexArray();
169     void deleteVertexArray(WebGLVertexArrayObject* vertexArray);
170     GC3Dboolean isVertexArray(WebGLVertexArrayObject* vertexArray);
171     void bindVertexArray(WebGLVertexArrayObject* vertexArray);
172     
173     /* Extensions */
174     WebGLExtension* getExtension(const String&) override;
175     Vector<String> getSupportedExtensions() override;
176     WebGLGetInfo getParameter(GC3Denum pname, ExceptionCode&) override;
177
178     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height) override;
179     void hint(GC3Denum target, GC3Denum mode) override;
180     void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border) override;
181     void texSubImage2DBase(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dsizei width, GC3Dsizei height, GC3Denum internalformat, GC3Denum format, GC3Denum type, const void* pixels, ExceptionCode&) override;
182     void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&) override;
183     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
184         GC3Dsizei width, GC3Dsizei height,
185         GC3Denum format, GC3Denum type, RefPtr<ArrayBufferView>&&, ExceptionCode&) override;
186     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
187         GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&) override;
188     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
189         GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&) override;
190     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
191         GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&) override;
192 #if ENABLE(VIDEO)
193     void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
194         GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&) override;
195 #endif
196
197 protected:
198     void initializeVertexArrayObjects() override;
199     GC3Dint getMaxDrawBuffers() override;
200     GC3Dint getMaxColorAttachments() override;
201     bool validateIndexArrayConservative(GC3Denum type, unsigned& numElementsRequired) override;
202     bool validateBlendEquation(const char* functionName, GC3Denum mode) override;
203     bool validateTexFuncFormatAndType(const char* functionName, GC3Denum internalformat, GC3Denum format, GC3Denum type, GC3Dint level) override;
204     bool validateTexFuncParameters(const char* functionName,
205         TexFuncValidationFunctionType,
206         GC3Denum target, GC3Dint level,
207         GC3Denum internalformat,
208         GC3Dsizei width, GC3Dsizei height, GC3Dint border,
209         GC3Denum format, GC3Denum type) override;
210     bool validateTexFuncData(const char* functionName, GC3Dint level,
211         GC3Dsizei width, GC3Dsizei height,
212         GC3Denum internalformat, GC3Denum format, GC3Denum type,
213         ArrayBufferView* pixels,
214         NullDisposition) override;
215     bool validateCapability(const char* functionName, GC3Denum cap) override;
216     bool validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment) override;
217     
218 private:
219     GC3Denum baseInternalFormatFromInternalFormat(GC3Denum internalformat);
220     bool isIntegerFormat(GC3Denum internalformat);
221     void initializeShaderExtensions();
222 };
223
224 } // namespace WebCore
225
226 SPECIALIZE_TYPE_TRAITS_CANVASRENDERINGCONTEXT(WebCore::WebGL2RenderingContext, isWebGL2())
227
228 #endif // WEBGL2
229
230 #endif