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