1098070590ae648ede5f2ef846298de178ccd3637Zach Reizner/* 2098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * Copyright (C) 2015 The Android Open Source Project 3098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * 4098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * Licensed under the Apache License, Version 2.0 (the "License"); 5098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * you may not use this file except in compliance with the License. 6098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * You may obtain a copy of the License at 7098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * 8098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * http://www.apache.org/licenses/LICENSE-2.0 9098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * 10098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * Unless required by applicable law or agreed to in writing, software 11098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * distributed under the License is distributed on an "AS IS" BASIS, 12098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * See the License for the specific language governing permissions and 14098070590ae648ede5f2ef846298de178ccd3637Zach Reizner * limitations under the License. 15098070590ae648ede5f2ef846298de178ccd3637Zach Reizner */ 16098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 17098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#ifndef ANDROID_AUTO_GL_H_ 18098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#define ANDROID_AUTO_GL_H_ 19098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 20098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include <memory> 21098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#define EGL_EGLEXT_PROTOTYPES 22098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#define GL_GLEXT_PROTOTYPES 23098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 24098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include <EGL/egl.h> 25098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include <EGL/eglext.h> 26098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include <GLES2/gl2.h> 27098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include <GLES2/gl2ext.h> 28098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 29098070590ae648ede5f2ef846298de178ccd3637Zach Reizner// TODO(zachr): use hwc_drm_bo to turn buffer handles into textures 30098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#ifndef EGL_NATIVE_HANDLE_ANDROID_NVX 31098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#define EGL_NATIVE_HANDLE_ANDROID_NVX 0x322A 32098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#endif 33098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 34098070590ae648ede5f2ef846298de178ccd3637Zach Reiznernamespace android { 35098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 36098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#define AUTO_GL_TYPE(name, type, zero, deleter) \ 37098070590ae648ede5f2ef846298de178ccd3637Zach Reizner struct name##Deleter { \ 38098070590ae648ede5f2ef846298de178ccd3637Zach Reizner typedef type pointer; \ 39098070590ae648ede5f2ef846298de178ccd3637Zach Reizner \ 40098070590ae648ede5f2ef846298de178ccd3637Zach Reizner void operator()(pointer p) const { \ 41098070590ae648ede5f2ef846298de178ccd3637Zach Reizner if (p != zero) { \ 42098070590ae648ede5f2ef846298de178ccd3637Zach Reizner deleter; \ 43098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } \ 44098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } \ 45098070590ae648ede5f2ef846298de178ccd3637Zach Reizner }; \ 46098070590ae648ede5f2ef846298de178ccd3637Zach Reizner typedef std::unique_ptr<type, name##Deleter> name; 47098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 48098070590ae648ede5f2ef846298de178ccd3637Zach ReiznerAUTO_GL_TYPE(AutoGLFramebuffer, GLuint, 0, glDeleteFramebuffers(1, &p)) 49098070590ae648ede5f2ef846298de178ccd3637Zach ReiznerAUTO_GL_TYPE(AutoGLBuffer, GLuint, 0, glDeleteBuffers(1, &p)) 50098070590ae648ede5f2ef846298de178ccd3637Zach ReiznerAUTO_GL_TYPE(AutoGLTexture, GLuint, 0, glDeleteTextures(1, &p)) 51098070590ae648ede5f2ef846298de178ccd3637Zach ReiznerAUTO_GL_TYPE(AutoGLShader, GLint, 0, glDeleteShader(p)) 52098070590ae648ede5f2ef846298de178ccd3637Zach ReiznerAUTO_GL_TYPE(AutoGLProgram, GLint, 0, glDeleteProgram(p)) 53098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 54098070590ae648ede5f2ef846298de178ccd3637Zach Reiznerstruct AutoEGLDisplayImage { 550867992b119b957f16a93ac9582301c5cca80116Zach Reizner AutoEGLDisplayImage() = default; 56098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 57098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage(EGLDisplay display, EGLImageKHR image) 58098070590ae648ede5f2ef846298de178ccd3637Zach Reizner : display_(display), image_(image) { 59098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 60098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 61098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage(const AutoEGLDisplayImage& rhs) = delete; 62098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage(AutoEGLDisplayImage&& rhs) { 63e823f649199c70560357a79c5709b8dd4009b459Season Li display_ = rhs.display_; 64e823f649199c70560357a79c5709b8dd4009b459Season Li image_ = rhs.image_; 65e823f649199c70560357a79c5709b8dd4009b459Season Li rhs.display_ = EGL_NO_DISPLAY; 66e823f649199c70560357a79c5709b8dd4009b459Season Li rhs.image_ = EGL_NO_IMAGE_KHR; 67098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 68098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 69098070590ae648ede5f2ef846298de178ccd3637Zach Reizner ~AutoEGLDisplayImage() { 70098070590ae648ede5f2ef846298de178ccd3637Zach Reizner clear(); 71098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 72098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 73098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage& operator=(const AutoEGLDisplayImage& rhs) = delete; 74098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage& operator=(AutoEGLDisplayImage&& rhs) { 75098070590ae648ede5f2ef846298de178ccd3637Zach Reizner clear(); 76098070590ae648ede5f2ef846298de178ccd3637Zach Reizner std::swap(display_, rhs.display_); 77098070590ae648ede5f2ef846298de178ccd3637Zach Reizner std::swap(image_, rhs.image_); 78098070590ae648ede5f2ef846298de178ccd3637Zach Reizner return *this; 79098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 80098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 81098070590ae648ede5f2ef846298de178ccd3637Zach Reizner void reset(EGLDisplay display, EGLImageKHR image) { 82098070590ae648ede5f2ef846298de178ccd3637Zach Reizner clear(); 83098070590ae648ede5f2ef846298de178ccd3637Zach Reizner display_ = display; 84098070590ae648ede5f2ef846298de178ccd3637Zach Reizner image_ = image; 85098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 86098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 87098070590ae648ede5f2ef846298de178ccd3637Zach Reizner void clear() { 88098070590ae648ede5f2ef846298de178ccd3637Zach Reizner if (image_ != EGL_NO_IMAGE_KHR) { 89098070590ae648ede5f2ef846298de178ccd3637Zach Reizner eglDestroyImageKHR(display_, image_); 90098070590ae648ede5f2ef846298de178ccd3637Zach Reizner display_ = EGL_NO_DISPLAY; 91098070590ae648ede5f2ef846298de178ccd3637Zach Reizner image_ = EGL_NO_IMAGE_KHR; 92098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 93098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 94098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 95098070590ae648ede5f2ef846298de178ccd3637Zach Reizner EGLImageKHR image() const { 96098070590ae648ede5f2ef846298de178ccd3637Zach Reizner return image_; 97098070590ae648ede5f2ef846298de178ccd3637Zach Reizner } 98098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 99098070590ae648ede5f2ef846298de178ccd3637Zach Reizner private: 1000867992b119b957f16a93ac9582301c5cca80116Zach Reizner EGLDisplay display_ = EGL_NO_DISPLAY; 1010867992b119b957f16a93ac9582301c5cca80116Zach Reizner EGLImageKHR image_ = EGL_NO_IMAGE_KHR; 102098070590ae648ede5f2ef846298de178ccd3637Zach Reizner}; 103098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 104098070590ae648ede5f2ef846298de178ccd3637Zach Reiznerstruct AutoEGLImageAndGLTexture { 105098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoEGLDisplayImage image; 106098070590ae648ede5f2ef846298de178ccd3637Zach Reizner AutoGLTexture texture; 107098070590ae648ede5f2ef846298de178ccd3637Zach Reizner}; 108098070590ae648ede5f2ef846298de178ccd3637Zach Reizner} 109098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 110098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#endif 111