1 /*
2  * Copyright (C) 2024 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 #include "core/render_opengl_renderer.h"
17 
18 #include "base/math/math_utils.h"
19 #include "effect_log.h"
20 
21 namespace OHOS {
22 namespace Media {
23 namespace Effect {
RenderOpenglRenderer()24 RenderOpenglRenderer::RenderOpenglRenderer() {}
25 
~RenderOpenglRenderer()26 RenderOpenglRenderer::~RenderOpenglRenderer() {}
27 
Draw(GLuint texId,RenderMesh * mesh,RenderGeneralProgram * shader,RenderFrameBuffer * frameBuffer,RenderViewport * viewport)28 void RenderOpenglRenderer::Draw(GLuint texId, RenderMesh *mesh, RenderGeneralProgram *shader,
29     RenderFrameBuffer *frameBuffer, RenderViewport *viewport)
30 {
31     CHECK_AND_RETURN_LOG(frameBuffer != nullptr, "RenderOpenglRenderer Draw failed! Framebuffer is null");
32     CHECK_AND_RETURN_LOG(viewport != nullptr, "RenderOpenglRenderer Draw failed! Viewport is null");
33     CHECK_AND_RETURN_LOG(shader != nullptr, "RenderOpenglRenderer Draw failed! Shader is null");
34     CHECK_AND_RETURN_LOG(mesh != nullptr, "RenderOpenglRenderer Draw failed! Mesh is null");
35     frameBuffer->Bind();
36     glViewport(viewport->leftBottomX_, viewport->leftBottomY_, viewport->width_, viewport->height_);
37     shader->Bind();
38     mesh->Bind(shader);
39     glActiveTexture(GL_TEXTURE0);
40     glBindTexture(GL_TEXTURE_2D, texId);
41     glDrawArrays(mesh->primitiveType_, mesh->startVertex_, mesh->vertexNum_);
42     shader->Unbind();
43     frameBuffer->UnBind();
44     GLUtils::CheckError(__FILE_NAME__, __LINE__);
45 }
46 
Draw(GLuint texId,GLuint fbo,RenderMesh * mesh,RenderGeneralProgram * shader,RenderViewport * viewport,GLenum target)47 void RenderOpenglRenderer::Draw(GLuint texId, GLuint fbo, RenderMesh *mesh, RenderGeneralProgram *shader,
48     RenderViewport *viewport, GLenum target)
49 {
50     CHECK_AND_RETURN_LOG(viewport != nullptr, "RenderOpenglRenderer Draw failed! Viewport is null");
51     CHECK_AND_RETURN_LOG(shader != nullptr, "RenderOpenglRenderer Draw failed! Shader is null");
52     CHECK_AND_RETURN_LOG(mesh != nullptr, "RenderOpenglRenderer Draw failed! Mesh is null");
53     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
54     glViewport(viewport->leftBottomX_, viewport->leftBottomY_, viewport->width_, viewport->height_);
55     shader->Bind();
56     mesh->Bind(shader);
57     glActiveTexture(GL_TEXTURE0);
58     glBindTexture(target, texId);
59     glDrawArrays(mesh->primitiveType_, mesh->startVertex_, mesh->vertexNum_);
60     shader->Unbind();
61     glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);
62     GLUtils::CheckError(__FILE_NAME__, __LINE__);
63 }
64 
ProcessTransform(GraphicTransformType type,RenderGeneralProgram * shader)65 void ProcessTransform(GraphicTransformType type, RenderGeneralProgram *shader)
66 {
67     glm::mat4 trans = glm::mat4(1.0f);
68     switch (type) {
69         case GRAPHIC_ROTATE_90:
70             trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
71             shader->SetUniform("transform", MathUtils::NativePtr(trans));
72             break;
73         case GRAPHIC_FLIP_H_ROT90:
74             trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
75             shader->SetUniform("transform", MathUtils::NativePtr(trans));
76             shader->SetUniform("flipH", 1.0f);
77             break;
78         case GRAPHIC_FLIP_V_ROT90:
79             trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
80             shader->SetUniform("transform", MathUtils::NativePtr(trans));
81             shader->SetUniform("flipV", 1.0f);
82             break;
83         case GRAPHIC_ROTATE_180:
84             trans = glm::rotate(trans, glm::radians(180.0f), glm::vec3(0.0, 0.0, 1.0));
85             shader->SetUniform("transform", MathUtils::NativePtr(trans));
86             break;
87         case GRAPHIC_FLIP_H_ROT180:
88             trans = glm::rotate(trans, glm::radians(180.0f), glm::vec3(0.0, 0.0, 1.0));
89             shader->SetUniform("transform", MathUtils::NativePtr(trans));
90             shader->SetUniform("flipH", 1.0f);
91             break;
92         case GRAPHIC_FLIP_V_ROT180:
93             trans = glm::rotate(trans, glm::radians(180.0f), glm::vec3(0.0, 0.0, 1.0));
94             shader->SetUniform("transform", MathUtils::NativePtr(trans));
95             shader->SetUniform("flipV", 1.0f);
96             break;
97         case GRAPHIC_ROTATE_270:
98             trans = glm::rotate(trans, glm::radians(270.0f), glm::vec3(0.0, 0.0, 1.0));
99             shader->SetUniform("transform", MathUtils::NativePtr(trans));
100             break;
101         case GRAPHIC_FLIP_H_ROT270:
102             trans = glm::rotate(trans, glm::radians(270.0f), glm::vec3(0.0, 0.0, 1.0));
103             shader->SetUniform("transform", MathUtils::NativePtr(trans));
104             shader->SetUniform("flipH", 1.0f);
105             break;
106         case GRAPHIC_FLIP_V_ROT270:
107             trans = glm::rotate(trans, glm::radians(270.0f), glm::vec3(0.0, 0.0, 1.0));
108             shader->SetUniform("transform", MathUtils::NativePtr(trans));
109             shader->SetUniform("flipV", 1.0f);
110             break;
111         default:
112             break;
113     }
114 }
115 
DrawOnScreenWithTransform(GLuint texId,RenderMesh * mesh,RenderGeneralProgram * shader,RenderViewport * viewport,GraphicTransformType type,GLenum target)116 void RenderOpenglRenderer::DrawOnScreenWithTransform(GLuint texId, RenderMesh *mesh, RenderGeneralProgram *shader,
117     RenderViewport *viewport, GraphicTransformType type, GLenum target)
118 {
119     glViewport(viewport->leftBottomX_, viewport->leftBottomY_, viewport->width_, viewport->height_);
120     shader->Bind();
121     glActiveTexture(GL_TEXTURE0);
122     glBindTexture(target, texId);
123     ProcessTransform(type, shader);
124     mesh->Bind(shader);
125     glDrawArrays(mesh->primitiveType_, mesh->startVertex_, mesh->vertexNum_);
126     shader->Unbind();
127     GLUtils::CheckError(__FILE_NAME__, __LINE__);
128 }
129 
DrawOnScreen(GLuint texId,RenderMesh * mesh,RenderGeneralProgram * shader,RenderViewport * viewport,const void * trans,GLenum target)130 void RenderOpenglRenderer::DrawOnScreen(GLuint texId, RenderMesh *mesh, RenderGeneralProgram *shader,
131     RenderViewport *viewport, const void *trans, GLenum target)
132 {
133     glViewport(viewport->leftBottomX_, viewport->leftBottomY_, viewport->width_, viewport->height_);
134     shader->Bind();
135     glActiveTexture(GL_TEXTURE0);
136     glBindTexture(target, texId);
137     shader->SetUniform("inputTexture", (int)0);
138     shader->SetUniform("transform", trans);
139     mesh->Bind(shader);
140     glDrawArrays(mesh->primitiveType_, mesh->startVertex_, mesh->vertexNum_);
141     shader->Unbind();
142     GLUtils::CheckError(__FILE_NAME__, __LINE__);
143 }
144 } // namespace Effect
145 } // namespace Media
146 } // namespace OHOS