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