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