1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef WEBGL2_RENDERING_CONTEXT_IMPL_H
17 #define WEBGL2_RENDERING_CONTEXT_IMPL_H
18 
19 #include "napi/n_exporter.h"
20 #include "webgl/webgl_texture.h"
21 #include "webgl_rendering_context_base_impl.h"
22 
23 namespace OHOS {
24 namespace Rosen {
25 namespace Impl {
26 
27 enum BoundQueryType : uint32_t {
28     ANY_SAMPLES_PASSED,
29     TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,
30     QUERY_MAX
31 };
32 
33 class WebGL2RenderingContextImpl : public WebGLRenderingContextBaseImpl {
34 public:
WebGL2RenderingContextImpl(int32_t version,WebGLRenderingContextBasicBase * base)35     explicit WebGL2RenderingContextImpl(int32_t version, WebGLRenderingContextBasicBase *base)
36         : WebGLRenderingContextBaseImpl(version, base) {}
~WebGL2RenderingContextImpl()37     ~WebGL2RenderingContextImpl() override {}
38 
39     void Init() override;
40 
41     napi_value CreateQuery(napi_env env);
42     napi_value DeleteQuery(napi_env env, napi_value object);
43     napi_value IsQuery(napi_env env, napi_value object);
44     napi_value GetQuery(napi_env env, GLenum target, GLenum pName);
45     napi_value BeginQuery(napi_env env, GLenum target, napi_value object);
46     napi_value EndQuery(napi_env env, GLenum target);
47     napi_value GetQueryParameter(napi_env env, napi_value queryObj, GLenum pName);
48 
49     napi_value CreateSampler(napi_env env);
50     napi_value DeleteSampler(napi_env env, napi_value samplerObj);
51     napi_value IsSampler(napi_env env, napi_value samplerObj);
52     napi_value BindSampler(napi_env env, GLuint unit, napi_value samplerObj);
53     napi_value SamplerParameter(napi_env env, napi_value samplerObj, GLenum pname, bool isFloat, void* param);
54     napi_value GetSamplerParameter(napi_env env, napi_value samplerObj, GLenum pname);
55 
56     napi_value CreateVertexArray(napi_env env);
57     napi_value DeleteVertexArray(napi_env env, napi_value object);
58     napi_value IsVertexArray(napi_env env, napi_value object);
59     napi_value BindVertexArray(napi_env env, napi_value object);
60 
61     napi_value FenceSync(napi_env env, GLenum condition, GLbitfield flags);
62     napi_value IsSync(napi_env env, napi_value syncObj);
63     napi_value DeleteSync(napi_env env, napi_value syncObj);
64     napi_value GetSyncParameter(napi_env env, napi_value syncObj, GLenum pname);
65     napi_value WaitSync(napi_env env, napi_value syncObj, GLbitfield flags, GLint64 timeout);
66     napi_value ClientWaitSync(napi_env env, napi_value syncObj, GLbitfield flags, GLint64 timeout);
67 
68     napi_value CreateTransformFeedback(napi_env env);
69     napi_value DeleteTransformFeedback(napi_env env, napi_value obj);
70     napi_value IsTransformFeedback(napi_env env, napi_value obj);
71     napi_value BindTransformFeedback(napi_env env, napi_value obj, GLenum target);
72     napi_value BeginTransformFeedback(napi_env env, GLenum primitiveMode);
73     napi_value EndTransformFeedback(napi_env env);
74     napi_value GetTransformFeedbackVarying(napi_env env, napi_value programObj, GLuint index);
75 
76     napi_value TexStorage2D(napi_env env, const TexStorageArg& arg);
77     napi_value TexStorage3D(napi_env env, const TexStorageArg& arg);
78     napi_value TexImage3D(napi_env env, const TexImageArg& imgArg, napi_value imageSource);
79     napi_value TexImage3D(napi_env env, const TexImageArg& imgArg, napi_value data, GLuint srcOffset);
80     napi_value TexImage3D(napi_env env, const TexImageArg& imgArg, GLintptr pboOffset);
81     napi_value TexSubImage3D(napi_env env, const TexSubImage3DArg& imgArg, napi_value imageSource);
82     napi_value TexSubImage3D(napi_env env, const TexSubImage3DArg& imgArg, napi_value data, GLuint srcOffset);
83     napi_value TexSubImage3D(napi_env env, const TexSubImage3DArg& imgArg, GLintptr pboOffset);
84     napi_value CopyTexSubImage3D(napi_env env, const CopyTexSubImage3DArg& imgArg);
85     napi_value CompressedTexImage3D(napi_env env, const TexImageArg& imgArg, GLsizei imageSize, GLintptr offset);
86     napi_value CompressedTexImage3D(
87         napi_env env, const TexImageArg& imgArg, napi_value data, GLuint srcOffset, GLuint srcLengthOverride);
88     napi_value CompressedTexSubImage3D(
89         napi_env env, const TexSubImage3DArg& imgArg, GLsizei imageSize, GLintptr offset);
90     napi_value CompressedTexSubImage3D(
91         napi_env env, const TexSubImage3DArg& imgArg, napi_value data, GLuint srcOffset, GLuint srcLengthOverride);
92     napi_value ClearBufferV(
93         napi_env env, GLenum buffer, GLint drawBuffer, napi_value value, int64_t srcOffset, BufferDataType type);
94     napi_value ClearBufferfi(napi_env env, GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
95     napi_value GetIndexedParameter(napi_env env, GLenum target, GLuint index);
96     napi_value GetFragDataLocation(napi_env env, napi_value programObj, const std::string& name);
97 
98     napi_value VertexAttribI4i(napi_env env, GLuint index, GLint* data);
99     napi_value VertexAttribI4ui(napi_env env, GLuint index, GLuint* data);
100     napi_value VertexAttribI4iv(napi_env env, GLuint index, napi_value data);
101     napi_value VertexAttribI4uiv(napi_env env, GLuint index, napi_value data);
102     napi_value VertexAttribIPointer(napi_env env, const VertexAttribArg& vertexInfo);
103     napi_value VertexAttribDivisor(napi_env env, GLuint index, GLuint divisor);
104 
105     napi_value DrawBuffers(napi_env env, napi_value dataObj);
106     napi_value DrawArraysInstanced(napi_env env, GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
107     napi_value DrawElementsInstanced(napi_env env, const DrawElementArg& arg, GLsizei instanceCount);
108     napi_value DrawRangeElements(napi_env env, const DrawElementArg& arg, GLuint start, GLuint end);
109 
110     napi_value CopyBufferSubData(napi_env env,
111         GLenum targets[2], int64_t readOffset, int64_t writeOffset, int64_t size); // 2 read write
112     napi_value GetBufferSubData(napi_env env, GLenum target, int64_t offset, napi_value data, const BufferExt& ext);
113     napi_value BlitFrameBuffer(napi_env env, GLint data[8], GLbitfield mask, GLenum filter);
114     napi_value FrameBufferTextureLayer(
115         napi_env env, GLenum target, GLenum attachment, napi_value textureObj, const TextureLayerArg& layer);
116     napi_value ReadBuffer(napi_env env, GLenum mode);
117     napi_value RenderBufferStorageMultiSample(napi_env env, const TexStorageArg& arg, GLsizei samples);
118     napi_value BindBufferBase(napi_env env, const BufferBaseArg& arg, napi_value bufferObj);
119     napi_value BindBufferRange(
120         napi_env env, const BufferBaseArg& arg, napi_value bufferObj, GLintptr offset, GLsizeiptr size);
121     napi_value InvalidateFrameBuffer(napi_env env, GLenum target, napi_value data);
122     napi_value InvalidateSubFrameBuffer(
123         napi_env env, GLenum target, napi_value data, const BufferPosition& position, const BufferSize& size);
124     napi_value GetInternalFormatParameter(napi_env env, GLenum target, GLenum internalFormat, GLenum pname);
125 
126     napi_value GetUniformBlockIndex(napi_env env, napi_value programObj, const std::string& uniformBlockName);
127     napi_value UniformBlockBinding(
128         napi_env env, napi_value programObj, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
129     napi_value TransformFeedbackVaryings(napi_env env, napi_value programObj, napi_value data, GLenum bufferMode);
130     napi_value GetUniformIndices(napi_env env, napi_value programObj, napi_value data);
131     napi_value GetActiveUniforms(napi_env env, napi_value programObj, napi_value data, GLenum pname);
132     napi_value GetActiveUniformBlockParameter(
133         napi_env env, napi_value programObj, GLuint uniformBlockIndex, GLenum pname);
134     napi_value GetActiveUniformBlockName(napi_env env, napi_value programObj, GLuint uniformBlockIndex);
135 
136     napi_value BindBuffer(napi_env env, GLenum target, napi_value object) override;
137     napi_value DeleteBuffer(napi_env env, napi_value object) override;
138     napi_value GetParameter(napi_env env, GLenum pname) override;
139     napi_value GetTexParameter(napi_env env, GLenum target, GLenum pname) override;
140     napi_value GetFrameBufferAttachmentParameter(napi_env env, GLenum target, GLenum attachment, GLenum pname) override;
141     void DoObjectDelete(int32_t type, WebGLObject *obj) override;
142 private:
143     WebGL2RenderingContextImpl(const WebGL2RenderingContextImpl&) = delete;
144     WebGL2RenderingContextImpl& operator=(const WebGL2RenderingContextImpl&) = delete;
145 
146     napi_value GetFrameBufferAttachmentParameterForDefault(
147         napi_env env, GLenum target, GLenum attachment, GLenum pname);
148     GLenum CheckTexSubImage3D(napi_env env, const TexSubImage3DArg& arg);
149     GLenum CheckTexImage3D(napi_env env, const TexImageArg& info);
150     GLenum CheckTexStorage(napi_env env, const TexStorageArg& arg);
151     GLenum CheckClearBuffer(napi_env env, GLenum buffer, const WebGLReadBufferArg& bufferData);
152 
153     bool CheckGetFrameBufferAttachmentParameter(
154         napi_env env, GLenum target, GLenum attachment, const WebGLFramebuffer* frameBuffer);
155     bool UpdateBaseTargetBoundBuffer(napi_env env, GLenum target, GLuint index, GLuint bufferId);
156     bool CheckBufferTargetCompatibility(napi_env env, GLenum target, WebGLBuffer* buffer);
157     bool CheckBufferBindTarget(GLenum target);
158     bool CheckQueryTarget(napi_env env, GLenum target, uint32_t& index);
159     bool CheckStorageInternalFormat(napi_env env, GLenum internalFormat);
160     bool CheckTransformFeedbackBuffer(GLenum target, WebGLBuffer* buffer);
161     napi_value HandleFrameBufferPname(
162         napi_env env, GLenum target, GLenum attachment, GLenum pname, WebGLAttachment* attachmentObject);
163 
164     GLuint currentQuery_[BoundQueryType::QUERY_MAX] { 0 };
165     GLuint boundReadFrameBuffer_ { 0 };
166     GLuint boundTransformFeedback_ { 0 };
167     GLuint boundVertexArrayId_ { 0 };
168 
169     // TRANSFORM_FEEDBACK_BUFFER
170     std::map<GLint, GLuint> boundIndexedTransformFeedbackBuffers_ {};
171     GLuint maxBoundTransformFeedbackBufferIndex_ { 0 };
172     // UNIFORM_BUFFER
173     std::map<GLint, GLuint> boundIndexedUniformBuffers_ {};
174     GLuint maxBoundUniformBufferIndex_ { 0 };
175 
176     std::vector<GLuint> samplerUnits_ {};
177     GLuint maxSamplerUnit_ {};
178 };
179 } // namespace Impl
180 } // namespace Rosen
181 } // namespace OHOS
182 #endif // WEBGL2_RENDERING_CONTEXT_IMPL_H
183