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