xref: /aosp_15_r20/frameworks/base/libs/hwui/utils/GLUtils.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker #ifndef GLUTILS_H
17*d57664e9SAndroid Build Coastguard Worker #define GLUTILS_H
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include "Debug.h"
20*d57664e9SAndroid Build Coastguard Worker 
21*d57664e9SAndroid Build Coastguard Worker #include <log/log.h>
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker #include <EGL/egl.h>
24*d57664e9SAndroid Build Coastguard Worker #include <EGL/eglext.h>
25*d57664e9SAndroid Build Coastguard Worker #include <GLES2/gl2.h>
26*d57664e9SAndroid Build Coastguard Worker #include <GLES2/gl2ext.h>
27*d57664e9SAndroid Build Coastguard Worker #include <GLES3/gl3.h>
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker namespace android {
30*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker #if DEBUG_OPENGL
33*d57664e9SAndroid Build Coastguard Worker #define GL_CHECKPOINT(LEVEL)                                                                      \
34*d57664e9SAndroid Build Coastguard Worker     do {                                                                                          \
35*d57664e9SAndroid Build Coastguard Worker         if (DEBUG_OPENGL >= DEBUG_LEVEL_##LEVEL) {                                                \
36*d57664e9SAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL_IF(android::uirenderer::GLUtils::dumpGLErrors(), "GL errors! %s:%d", \
37*d57664e9SAndroid Build Coastguard Worker                                 __FILE__, __LINE__);                                              \
38*d57664e9SAndroid Build Coastguard Worker         }                                                                                         \
39*d57664e9SAndroid Build Coastguard Worker     } while (0)
40*d57664e9SAndroid Build Coastguard Worker #else
41*d57664e9SAndroid Build Coastguard Worker #define GL_CHECKPOINT(LEVEL)
42*d57664e9SAndroid Build Coastguard Worker #endif
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker class GLUtils {
45*d57664e9SAndroid Build Coastguard Worker public:
46*d57664e9SAndroid Build Coastguard Worker     /**
47*d57664e9SAndroid Build Coastguard Worker      * Print out any GL errors with ALOGE, returns true if any errors were found.
48*d57664e9SAndroid Build Coastguard Worker      * You probably want to use GL_CHECKPOINT(LEVEL) instead of calling this directly
49*d57664e9SAndroid Build Coastguard Worker      */
50*d57664e9SAndroid Build Coastguard Worker     static bool dumpGLErrors();
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker     static const char* getGLFramebufferError();
53*d57664e9SAndroid Build Coastguard Worker };  // class GLUtils
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker class AutoEglImage {
56*d57664e9SAndroid Build Coastguard Worker public:
AutoEglImage(EGLDisplay display,EGLClientBuffer clientBuffer)57*d57664e9SAndroid Build Coastguard Worker     AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer) : mDisplay(display) {
58*d57664e9SAndroid Build Coastguard Worker         EGLint imageAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
59*d57664e9SAndroid Build Coastguard Worker         image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer,
60*d57664e9SAndroid Build Coastguard Worker                                   imageAttrs);
61*d57664e9SAndroid Build Coastguard Worker     }
62*d57664e9SAndroid Build Coastguard Worker 
~AutoEglImage()63*d57664e9SAndroid Build Coastguard Worker     ~AutoEglImage() {
64*d57664e9SAndroid Build Coastguard Worker         if (image != EGL_NO_IMAGE_KHR) {
65*d57664e9SAndroid Build Coastguard Worker             eglDestroyImageKHR(mDisplay, image);
66*d57664e9SAndroid Build Coastguard Worker         }
67*d57664e9SAndroid Build Coastguard Worker     }
68*d57664e9SAndroid Build Coastguard Worker 
69*d57664e9SAndroid Build Coastguard Worker     EGLImageKHR image = EGL_NO_IMAGE_KHR;
70*d57664e9SAndroid Build Coastguard Worker 
71*d57664e9SAndroid Build Coastguard Worker private:
72*d57664e9SAndroid Build Coastguard Worker     EGLDisplay mDisplay = EGL_NO_DISPLAY;
73*d57664e9SAndroid Build Coastguard Worker };
74*d57664e9SAndroid Build Coastguard Worker 
75*d57664e9SAndroid Build Coastguard Worker class AutoSkiaGlTexture {
76*d57664e9SAndroid Build Coastguard Worker public:
AutoSkiaGlTexture()77*d57664e9SAndroid Build Coastguard Worker     AutoSkiaGlTexture() {
78*d57664e9SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
79*d57664e9SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTexture);
80*d57664e9SAndroid Build Coastguard Worker     }
81*d57664e9SAndroid Build Coastguard Worker 
~AutoSkiaGlTexture()82*d57664e9SAndroid Build Coastguard Worker     ~AutoSkiaGlTexture() { glDeleteTextures(1, &mTexture); }
83*d57664e9SAndroid Build Coastguard Worker 
84*d57664e9SAndroid Build Coastguard Worker     GLuint mTexture = 0;
85*d57664e9SAndroid Build Coastguard Worker };
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker class AutoGLFramebuffer {
88*d57664e9SAndroid Build Coastguard Worker public:
AutoGLFramebuffer()89*d57664e9SAndroid Build Coastguard Worker     AutoGLFramebuffer() {
90*d57664e9SAndroid Build Coastguard Worker         glGenFramebuffers(1, &mFb);
91*d57664e9SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFb);
92*d57664e9SAndroid Build Coastguard Worker     }
93*d57664e9SAndroid Build Coastguard Worker 
~AutoGLFramebuffer()94*d57664e9SAndroid Build Coastguard Worker     ~AutoGLFramebuffer() { glDeleteFramebuffers(1, &mFb); }
95*d57664e9SAndroid Build Coastguard Worker 
96*d57664e9SAndroid Build Coastguard Worker     GLuint mFb;
97*d57664e9SAndroid Build Coastguard Worker };
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
100*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker #endif /* GLUTILS_H */
103