WebGLRenderingContext should implement WebGLRenderingContextBase
[WebKit-https.git] / Source / WebCore / html / canvas / WebGL2RenderingContext.h
1 /*
2  * Copyright (C) 2015-2017 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 #pragma once
27
28 #if ENABLE(WEBGL2)
29
30 #include "WebGLRenderingContextBase.h"
31
32 namespace WebCore {
33
34 class WebGLQuery;
35 class WebGLSampler;
36 class WebGLSync;
37 class WebGLTransformFeedback;
38 class WebGLVertexArrayObject;
39
40 class WebGL2RenderingContext final : public WebGLRenderingContextBase {
41 public:
42     WebGL2RenderingContext(HTMLCanvasElement&, WebGLContextAttributes);
43     WebGL2RenderingContext(HTMLCanvasElement&, Ref<GraphicsContext3D>&&, WebGLContextAttributes);
44
45     // Buffer objects
46     using WebGLRenderingContextBase::bufferData;
47     using WebGLRenderingContextBase::bufferSubData;
48     void bufferData(GC3Denum target, const ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length);
49     void bufferSubData(GC3Denum target, long long offset, const ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length);
50     void copyBufferSubData(GC3Denum readTarget, GC3Denum writeTarget, GC3Dint64 readOffset, GC3Dint64 writeOffset, GC3Dint64 size);
51     void getBufferSubData(GC3Denum target, long long srcByteOffset, RefPtr<ArrayBufferView>&& dstData, GC3Duint dstOffset = 0, GC3Duint length = 0);
52     
53     // Framebuffer objects
54     WebGLAny getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname) final;
55     void blitFramebuffer(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter);
56     void framebufferTextureLayer(GC3Denum target, GC3Denum attachment, GC3Duint texture, GC3Dint level, GC3Dint layer);
57     WebGLAny getInternalformatParameter(GC3Denum target, GC3Denum internalformat, GC3Denum pname);
58     void invalidateFramebuffer(GC3Denum target, const Vector<GC3Denum>& attachments);
59     void invalidateSubFramebuffer(GC3Denum target, const Vector<GC3Denum>& attachments, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
60     void readBuffer(GC3Denum src);
61     
62     // Renderbuffer objects
63     void renderbufferStorageMultisample(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
64     
65     // Texture objects
66     void texStorage2D(GC3Denum target, GC3Dsizei levels, GC3Denum internalFormat, GC3Dsizei width, GC3Dsizei height);
67     void texStorage3D(GC3Denum target, GC3Dsizei levels, GC3Denum internalFormat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth);
68     void texImage3D(GC3Denum target, GC3Dint level, GC3Dint internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Denum format, GC3Denum type, RefPtr<ArrayBufferView>&& pixels);
69
70     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);
71     using TexImageSource = WTF::Variant<RefPtr<ImageData>, RefPtr<HTMLImageElement>, RefPtr<HTMLCanvasElement>, RefPtr<HTMLVideoElement>>;
72     void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, TexImageSource&&);
73
74     void copyTexSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
75     void compressedTexImage3D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Dsizei imageSize, RefPtr<ArrayBufferView>&& data);
76     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);
77     
78     // Programs and shaders
79     GC3Dint getFragDataLocation(WebGLProgram*, const String& name);
80     
81     // Uniforms and attributes
82     void uniform1ui(WebGLUniformLocation*, GC3Duint v0);
83     void uniform2ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1);
84     void uniform3ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1, GC3Duint v2);
85     void uniform4ui(WebGLUniformLocation*, GC3Duint v0, GC3Duint v1, GC3Duint v2, GC3Duint v3);
86     void uniform1uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
87     void uniform2uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
88     void uniform3uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
89     void uniform4uiv(WebGLUniformLocation*, RefPtr<Uint32Array>&& value);
90     void uniformMatrix2x3fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
91     void uniformMatrix3x2fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
92     void uniformMatrix2x4fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
93     void uniformMatrix4x2fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
94     void uniformMatrix3x4fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
95     void uniformMatrix4x3fv(WebGLUniformLocation*, GC3Dboolean transpose, RefPtr<Float32Array>&& value);
96     void vertexAttribI4i(GC3Duint index, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
97     void vertexAttribI4iv(GC3Duint index, RefPtr<Int32Array>&& v);
98     void vertexAttribI4ui(GC3Duint index, GC3Duint x, GC3Duint y, GC3Duint z, GC3Duint w);
99     void vertexAttribI4uiv(GC3Duint index, RefPtr<Uint32Array>&& v);
100     void vertexAttribIPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dsizei stride, GC3Dint64 offset);
101     
102     // Writing to the drawing buffer
103     void clear(GC3Dbitfield mask) final;
104     void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
105     void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei instanceCount);
106     void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dint64 offset, GC3Dsizei instanceCount);
107     void drawRangeElements(GC3Denum mode, GC3Duint start, GC3Duint end, GC3Dsizei count, GC3Denum type, GC3Dint64 offset);
108     
109     // Multiple render targets
110     void drawBuffers(const Vector<GC3Denum>& buffers);
111     void clearBufferiv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Int32Array>&& value);
112     void clearBufferuiv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Uint32Array>&& value);
113     void clearBufferfv(GC3Denum buffer, GC3Dint drawbuffer, RefPtr<Float32Array>&& value);
114     void clearBufferfi(GC3Denum buffer, GC3Dint drawbuffer, GC3Dfloat depth, GC3Dint stencil);
115     
116     // Query objects
117     RefPtr<WebGLQuery> createQuery();
118     void deleteQuery(WebGLQuery*);
119     GC3Dboolean isQuery(WebGLQuery*);
120     void beginQuery(GC3Denum target, WebGLQuery*);
121     void endQuery(GC3Denum target);
122     RefPtr<WebGLQuery> getQuery(GC3Denum target, GC3Denum pname);
123     WebGLAny getQueryParameter(WebGLQuery*, GC3Denum pname);
124     
125     // Sampler objects
126     RefPtr<WebGLSampler> createSampler();
127     void deleteSampler(WebGLSampler*);
128     GC3Dboolean isSampler(WebGLSampler*);
129     void bindSampler(GC3Duint unit, WebGLSampler*);
130     void samplerParameteri(WebGLSampler*, GC3Denum pname, GC3Dint param);
131     void samplerParameterf(WebGLSampler*, GC3Denum pname, GC3Dfloat param);
132     WebGLAny getSamplerParameter(WebGLSampler*, GC3Denum pname);
133     
134     // Sync objects
135     RefPtr<WebGLSync> fenceSync(GC3Denum condition, GC3Dbitfield flags);
136     GC3Dboolean isSync(WebGLSync*);
137     void deleteSync(WebGLSync*);
138     GC3Denum clientWaitSync(WebGLSync*, GC3Dbitfield flags, GC3Duint64 timeout);
139     void waitSync(WebGLSync*, GC3Dbitfield flags, GC3Duint64 timeout);
140     WebGLAny getSyncParameter(WebGLSync*, GC3Denum pname);
141     
142     // Transform feedback
143     RefPtr<WebGLTransformFeedback> createTransformFeedback();
144     void deleteTransformFeedback(WebGLTransformFeedback* id);
145     GC3Dboolean isTransformFeedback(WebGLTransformFeedback* id);
146     void bindTransformFeedback(GC3Denum target, WebGLTransformFeedback* id);
147     void beginTransformFeedback(GC3Denum primitiveMode);
148     void endTransformFeedback();
149     void transformFeedbackVaryings(WebGLProgram*, const Vector<String>& varyings, GC3Denum bufferMode);
150     RefPtr<WebGLActiveInfo> getTransformFeedbackVarying(WebGLProgram*, GC3Duint index);
151     void pauseTransformFeedback();
152     void resumeTransformFeedback();
153     
154     // Uniform buffer objects and transform feedback buffers
155     void bindBufferBase(GC3Denum target, GC3Duint index, WebGLBuffer*);
156     void bindBufferRange(GC3Denum target, GC3Duint index, WebGLBuffer*, GC3Dint64 offset, GC3Dint64 size);
157     WebGLAny getIndexedParameter(GC3Denum target, GC3Duint index);
158     Uint32Array* getUniformIndices(WebGLProgram*, const Vector<String>& uniformNames);
159     Int32Array* getActiveUniforms(WebGLProgram*, RefPtr<Uint32Array>&& uniformIndices, GC3Denum pname);
160     GC3Duint getUniformBlockIndex(WebGLProgram*, const String& uniformBlockName);
161     WebGLAny getActiveUniformBlockParameter(WebGLProgram*, GC3Duint uniformBlockIndex, GC3Denum pname);
162     WebGLAny getActiveUniformBlockName(WebGLProgram*, GC3Duint uniformBlockIndex);
163     void uniformBlockBinding(WebGLProgram*, GC3Duint uniformBlockIndex, GC3Duint uniformBlockBinding);
164     
165     // Vertex array objects
166     RefPtr<WebGLVertexArrayObject> createVertexArray();
167     void deleteVertexArray(WebGLVertexArrayObject* vertexArray);
168     GC3Dboolean isVertexArray(WebGLVertexArrayObject* vertexArray);
169     void bindVertexArray(WebGLVertexArrayObject* vertexArray);
170     
171     WebGLExtension* getExtension(const String&) final;
172     std::optional<Vector<String>> getSupportedExtensions() final;
173     WebGLAny getParameter(GC3Denum pname) final;
174
175     void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height) final;
176     void hint(GC3Denum target, GC3Denum mode) final;
177
178 private:
179     bool isWebGL2() const final { return true; }
180
181     void initializeVertexArrayObjects() final;
182     GC3Dint getMaxDrawBuffers() final;
183     GC3Dint getMaxColorAttachments() final;
184     bool validateIndexArrayConservative(GC3Denum type, unsigned& numElementsRequired) final;
185     bool validateBlendEquation(const char* functionName, GC3Denum mode) final;
186     bool validateCapability(const char* functionName, GC3Denum cap) final;
187     bool validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment) final;
188     
189     GC3Denum baseInternalFormatFromInternalFormat(GC3Denum internalformat);
190     bool isIntegerFormat(GC3Denum internalformat);
191     void initializeShaderExtensions();
192
193     bool validateTexStorageFuncParameters(GC3Denum target, GC3Dsizei levels, GC3Denum internalFormat, GC3Dsizei width, GC3Dsizei height, const char* functionName);
194 };
195
196 } // namespace WebCore
197
198 SPECIALIZE_TYPE_TRAITS_CANVASRENDERINGCONTEXT(WebCore::WebGL2RenderingContext, isWebGL2())
199
200 #endif // WEBGL2