2 * Copyright (C) 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef WebGL2RenderingContext_h
27 #define WebGL2RenderingContext_h
31 #include "WebGLRenderingContextBase.h"
38 class WebGLTransformFeedback;
39 class WebGLVertexArrayObject;
41 class WebGL2RenderingContext final : public WebGLRenderingContextBase {
43 WebGL2RenderingContext(HTMLCanvasElement*, GraphicsContext3D::Attributes);
44 WebGL2RenderingContext(HTMLCanvasElement*, PassRefPtr<GraphicsContext3D>, GraphicsContext3D::Attributes);
45 bool isWebGL2() const override { return true; }
48 void copyBufferSubData(GC3Denum readTarget, GC3Denum writeTarget, GC3Dint64 readOffset, GC3Dint64 writeOffset, GC3Dint64 size);
49 void getBufferSubData(GC3Denum target, GC3Dint64 offset, ArrayBufferView* returnedData);
50 void getBufferSubData(GC3Denum target, GC3Dint64 offset, ArrayBuffer* returnedData);
52 /* Framebuffer objects */
53 WebGLGetInfo getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname, ExceptionCode&) override;
54 void blitFramebuffer(GC3Dint srcX0, GC3Dint srcY0, GC3Dint srcX1, GC3Dint srcY1, GC3Dint dstX0, GC3Dint dstY0, GC3Dint dstX1, GC3Dint dstY1, GC3Dbitfield mask, GC3Denum filter);
55 void framebufferTextureLayer(GC3Denum target, GC3Denum attachment, GC3Duint texture, GC3Dint level, GC3Dint layer);
56 WebGLGetInfo getInternalformatParameter(GC3Denum target, GC3Denum internalformat, GC3Denum pname);
57 void invalidateFramebuffer(GC3Denum target, Vector<GC3Denum> attachments);
58 void invalidateSubFramebuffer(GC3Denum target, Vector<GC3Denum> attachments, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
59 void readBuffer(GC3Denum src);
61 /* Renderbuffer objects */
62 void renderbufferStorageMultisample(GC3Denum target, GC3Dsizei samples, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
65 void texStorage2D(GC3Denum target, GC3Dsizei levels, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height);
66 void texStorage3D(GC3Denum target, GC3Dsizei levels, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth);
67 void texImage3D(GC3Denum target, GC3Dint level, GC3Dint internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Denum format, GC3Denum type, ArrayBufferView* pixels);
68 void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Denum format, GC3Denum type, ArrayBufferView* pixels);
69 void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, ImageData* source);
70 void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, HTMLImageElement* source);
71 void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, HTMLCanvasElement* source);
72 void texSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Denum format, GC3Denum type, HTMLVideoElement* source);
73 void copyTexSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height);
74 void compressedTexImage3D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Dint border, GC3Dsizei imageSize, ArrayBufferView* data);
75 void compressedTexSubImage3D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Dint zoffset, GC3Dsizei width, GC3Dsizei height, GC3Dsizei depth, GC3Denum format, GC3Dsizei imageSize, ArrayBufferView* data);
77 /* Programs and shaders */
78 GC3Dint getFragDataLocation(WebGLProgram* program, String name);
80 /* Uniforms and attributes */
81 void uniform1ui(WebGLUniformLocation* location, GC3Duint v0);
82 void uniform2ui(WebGLUniformLocation* location, GC3Duint v0, GC3Duint v1);
83 void uniform3ui(WebGLUniformLocation* location, GC3Duint v0, GC3Duint v1, GC3Duint v2);
84 void uniform4ui(WebGLUniformLocation* location, GC3Duint v0, GC3Duint v1, GC3Duint v2, GC3Duint v3);
85 void uniform1uiv(WebGLUniformLocation* location, Uint32Array* value);
86 void uniform2uiv(WebGLUniformLocation* location, Uint32Array* value);
87 void uniform3uiv(WebGLUniformLocation* location, Uint32Array* value);
88 void uniform4uiv(WebGLUniformLocation* location, Uint32Array* value);
89 void uniformMatrix2x3fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
90 void uniformMatrix3x2fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
91 void uniformMatrix2x4fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
92 void uniformMatrix4x2fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
93 void uniformMatrix3x4fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
94 void uniformMatrix4x3fv(WebGLUniformLocation* location, GC3Dboolean transpose, Float32Array* value);
95 void vertexAttribI4i(GC3Duint index, GC3Dint x, GC3Dint y, GC3Dint z, GC3Dint w);
96 void vertexAttribI4iv(GC3Duint index, Int32Array* v);
97 void vertexAttribI4ui(GC3Duint index, GC3Duint x, GC3Duint y, GC3Duint z, GC3Duint w);
98 void vertexAttribI4uiv(GC3Duint index, Uint32Array* v);
99 void vertexAttribIPointer(GC3Duint index, GC3Dint size, GC3Denum type, GC3Dsizei stride, GC3Dint64 offset);
101 /* Writing to the drawing buffer */
102 void clear(GC3Dbitfield mask) override;
103 void vertexAttribDivisor(GC3Duint index, GC3Duint divisor);
104 void drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei instanceCount);
105 void drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dint64 offset, GC3Dsizei instanceCount);
106 void drawRangeElements(GC3Denum mode, GC3Duint start, GC3Duint end, GC3Dsizei count, GC3Denum type, GC3Dint64 offset);
108 /* Multiple Render Targets */
109 void drawBuffers(Vector<GC3Denum> buffers);
110 void clearBufferiv(GC3Denum buffer, GC3Dint drawbuffer, Int32Array* value);
111 void clearBufferuiv(GC3Denum buffer, GC3Dint drawbuffer, Uint32Array* value);
112 void clearBufferfv(GC3Denum buffer, GC3Dint drawbuffer, Float32Array* value);
113 void clearBufferfi(GC3Denum buffer, GC3Dint drawbuffer, GC3Dfloat depth, GC3Dint stencil);
116 PassRefPtr<WebGLQuery> createQuery();
117 void deleteQuery(WebGLQuery* query);
118 GC3Dboolean isQuery(WebGLQuery* query);
119 void beginQuery(GC3Denum target, WebGLQuery* query);
120 void endQuery(GC3Denum target);
121 PassRefPtr<WebGLQuery> getQuery(GC3Denum target, GC3Denum pname);
122 WebGLGetInfo getQueryParameter(WebGLQuery* query, GC3Denum pname);
124 /* Sampler Objects */
125 PassRefPtr<WebGLSampler> createSampler();
126 void deleteSampler(WebGLSampler* sampler);
127 GC3Dboolean isSampler(WebGLSampler* sampler);
128 void bindSampler(GC3Duint unit, WebGLSampler* sampler);
129 void samplerParameteri(WebGLSampler* sampler, GC3Denum pname, GC3Dint param);
130 void samplerParameterf(WebGLSampler* sampler, GC3Denum pname, GC3Dfloat param);
131 WebGLGetInfo getSamplerParameter(WebGLSampler* sampler, GC3Denum pname);
134 PassRefPtr<WebGLSync> fenceSync(GC3Denum condition, GC3Dbitfield flags);
135 GC3Dboolean isSync(WebGLSync* sync);
136 void deleteSync(WebGLSync* sync);
137 GC3Denum clientWaitSync(WebGLSync* sync, GC3Dbitfield flags, GC3Duint64 timeout);
138 void waitSync(WebGLSync* sync, GC3Dbitfield flags, GC3Duint64 timeout);
139 WebGLGetInfo getSyncParameter(WebGLSync* sync, GC3Denum pname);
141 /* Transform Feedback */
142 PassRefPtr<WebGLTransformFeedback> createTransformFeedback();
143 void deleteTransformFeedback(WebGLTransformFeedback* id);
144 GC3Dboolean isTransformFeedback(WebGLTransformFeedback* id);
145 void bindTransformFeedback(GC3Denum target, WebGLTransformFeedback* id);
146 void beginTransformFeedback(GC3Denum primitiveMode);
147 void endTransformFeedback();
148 void transformFeedbackVaryings(WebGLProgram* program, Vector<String> varyings, GC3Denum bufferMode);
149 PassRefPtr<WebGLActiveInfo> getTransformFeedbackVarying(WebGLProgram* program, GC3Duint index);
150 void pauseTransformFeedback();
151 void resumeTransformFeedback();
153 /* Uniform Buffer Objects and Transform Feedback Buffers */
154 void bindBufferBase(GC3Denum target, GC3Duint index, WebGLBuffer* buffer);
155 void bindBufferRange(GC3Denum target, GC3Duint index, WebGLBuffer* buffer, GC3Dint64 offset, GC3Dint64 size);
156 WebGLGetInfo getIndexedParameter(GC3Denum target, GC3Duint index);
157 Uint32Array* getUniformIndices(WebGLProgram* program, Vector<String> uniformNames);
158 Int32Array* getActiveUniforms(WebGLProgram* program, Uint32Array* uniformIndices, GC3Denum pname);
159 GC3Duint getUniformBlockIndex(WebGLProgram* program, String uniformBlockName);
160 WebGLGetInfo getActiveUniformBlockParameter(WebGLProgram* program, GC3Duint uniformBlockIndex, GC3Denum pname);
161 WebGLGetInfo getActiveUniformBlockName(WebGLProgram* program, GC3Duint uniformBlockIndex);
162 void uniformBlockBinding(WebGLProgram* program, GC3Duint uniformBlockIndex, GC3Duint uniformBlockBinding);
164 /* Vertex Array Objects */
165 PassRefPtr<WebGLVertexArrayObject> createVertexArray();
166 void deleteVertexArray(WebGLVertexArrayObject* vertexArray);
167 GC3Dboolean isVertexArray(WebGLVertexArrayObject* vertexArray);
168 void bindVertexArray(WebGLVertexArrayObject* vertexArray);
171 WebGLExtension* getExtension(const String&) override;
172 Vector<String> getSupportedExtensions() override;
173 WebGLGetInfo getParameter(GC3Denum pname, ExceptionCode&) override;
175 void renderbufferStorage(GC3Denum target, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height) override;
176 void hint(GC3Denum target, GC3Denum mode) override;
177 void copyTexImage2D(GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dint x, GC3Dint y, GC3Dsizei width, GC3Dsizei height, GC3Dint border) override;
178 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;
179 void texSubImage2DImpl(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset, GC3Denum format, GC3Denum type, Image*, GraphicsContext3D::ImageHtmlDomSource, bool flipY, bool premultiplyAlpha, ExceptionCode&) override;
180 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
181 GC3Dsizei width, GC3Dsizei height,
182 GC3Denum format, GC3Denum type, ArrayBufferView*, ExceptionCode&) override;
183 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
184 GC3Denum format, GC3Denum type, ImageData*, ExceptionCode&) override;
185 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
186 GC3Denum format, GC3Denum type, HTMLImageElement*, ExceptionCode&) override;
187 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
188 GC3Denum format, GC3Denum type, HTMLCanvasElement*, ExceptionCode&) override;
190 void texSubImage2D(GC3Denum target, GC3Dint level, GC3Dint xoffset, GC3Dint yoffset,
191 GC3Denum format, GC3Denum type, HTMLVideoElement*, ExceptionCode&) override;
195 void initializeVertexArrayObjects() override;
196 GC3Dint getMaxDrawBuffers() override;
197 GC3Dint getMaxColorAttachments() override;
198 bool validateIndexArrayConservative(GC3Denum type, unsigned& numElementsRequired) override;
199 bool validateBlendEquation(const char* functionName, GC3Denum mode) override;
200 bool validateTexFuncFormatAndType(const char* functionName, GC3Denum internalformat, GC3Denum format, GC3Denum type, GC3Dint level) override;
201 bool validateTexFuncParameters(const char* functionName,
202 TexFuncValidationFunctionType,
203 GC3Denum target, GC3Dint level,
204 GC3Denum internalformat,
205 GC3Dsizei width, GC3Dsizei height, GC3Dint border,
206 GC3Denum format, GC3Denum type) override;
207 bool validateTexFuncData(const char* functionName, GC3Dint level,
208 GC3Dsizei width, GC3Dsizei height,
209 GC3Denum internalformat, GC3Denum format, GC3Denum type,
210 ArrayBufferView* pixels,
211 NullDisposition) override;
212 bool validateCapability(const char* functionName, GC3Denum cap) override;
213 bool validateFramebufferFuncParameters(const char* functionName, GC3Denum target, GC3Denum attachment) override;
216 GC3Denum baseInternalFormatFromInternalFormat(GC3Denum internalformat);
217 bool isIntegerFormat(GC3Denum internalformat);
218 void initializeShaderExtensions();
221 } // namespace WebCore
223 SPECIALIZE_TYPE_TRAITS_CANVASRENDERINGCONTEXT(WebCore::WebGL2RenderingContext, isWebGL2())