| /* | |
| * Copyright (C) 2014 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef GLUTILS_H | |
| #define GLUTILS_H | |
| #include "Debug.h" | |
| #include <log/log.h> | |
| #include <EGL/egl.h> | |
| #include <EGL/eglext.h> | |
| #include <GLES2/gl2.h> | |
| #include <GLES2/gl2ext.h> | |
| #include <GLES3/gl3.h> | |
| namespace android { | |
| namespace uirenderer { | |
| #if DEBUG_OPENGL | |
| #define GL_CHECKPOINT(LEVEL) \ | |
| do { \ | |
| if (DEBUG_OPENGL >= DEBUG_LEVEL_##LEVEL) { \ | |
| LOG_ALWAYS_FATAL_IF(android::uirenderer::GLUtils::dumpGLErrors(), "GL errors! %s:%d", \ | |
| __FILE__, __LINE__); \ | |
| } \ | |
| } while (0) | |
| #else | |
| #define GL_CHECKPOINT(LEVEL) | |
| #endif | |
| class GLUtils { | |
| public: | |
| /** | |
| * Print out any GL errors with ALOGE, returns true if any errors were found. | |
| * You probably want to use GL_CHECKPOINT(LEVEL) instead of calling this directly | |
| */ | |
| static bool dumpGLErrors(); | |
| static const char* getGLFramebufferError(); | |
| }; // class GLUtils | |
| class AutoEglImage { | |
| public: | |
| AutoEglImage(EGLDisplay display, EGLClientBuffer clientBuffer) : mDisplay(display) { | |
| EGLint imageAttrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; | |
| image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, | |
| imageAttrs); | |
| } | |
| ~AutoEglImage() { | |
| if (image != EGL_NO_IMAGE_KHR) { | |
| eglDestroyImageKHR(mDisplay, image); | |
| } | |
| } | |
| EGLImageKHR image = EGL_NO_IMAGE_KHR; | |
| private: | |
| EGLDisplay mDisplay = EGL_NO_DISPLAY; | |
| }; | |
| class AutoSkiaGlTexture { | |
| public: | |
| AutoSkiaGlTexture() { | |
| glGenTextures(1, &mTexture); | |
| glBindTexture(GL_TEXTURE_2D, mTexture); | |
| } | |
| ~AutoSkiaGlTexture() { glDeleteTextures(1, &mTexture); } | |
| GLuint mTexture = 0; | |
| }; | |
| class AutoGLFramebuffer { | |
| public: | |
| AutoGLFramebuffer() { | |
| glGenFramebuffers(1, &mFb); | |
| glBindFramebuffer(GL_FRAMEBUFFER, mFb); | |
| } | |
| ~AutoGLFramebuffer() { glDeleteFramebuffers(1, &mFb); } | |
| GLuint mFb; | |
| }; | |
| } /* namespace uirenderer */ | |
| } /* namespace android */ | |
| #endif /* GLUTILS_H */ |