egl.cpp revision 8d2e83b9f44c7f2207a312fcfda8eb3a4c26745f
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h"
51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
52076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
98076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool    isValid() const = 0;
147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        connect() {}
151e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
1618d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer getRenderBuffer() const;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const {
2018d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return 0;
2028d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            android_native_window_t* window);
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     ~egl_window_surface_v2_t();
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
219e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        connect();
220e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getWidth() const    { return buffer->width;  }
222076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getHeight() const   { return buffer->height; }
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
227df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2288d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer  getRenderBuffer() const;
2298d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
231e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t*   nativeWindow;
234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
239e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = max(lhs.top, rhs.top);
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.left < rhs.left) { // left-side rect
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = max(lhs.top, rhs.top);
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = max(lhs.left, rhs.left);
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = min(lhs.bottom, rhs.bottom);
287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.right > rhs.right) { // right-side rect
290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = min(lhs.right, rhs.right);
291df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = max(lhs.top, rhs.top);
292df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
293df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = min(lhs.bottom, rhs.bottom);
294df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
295df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
296df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
297df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
298df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = min(lhs.bottom, rhs.bottom);
299df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
300df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
302df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
306df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t getRects(Rect const* * rects) const {
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            *rects = storage;
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count;
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            const Rect* reg, ssize_t count);
323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window)
3320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
333df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
334df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    bits(NULL)
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
340df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
342df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
346076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
348df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
349076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
350076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
361076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
362df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
364e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
367df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (buffer) {
368df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        buffer->common.decRef(&buffer->common);
369df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
370df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
371df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
372df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
373df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
374df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
375df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
376e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::connect()
377e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
3780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
379e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
380df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
381df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
382df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
383df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
384df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
385df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        setError(EGL_BAD_ACCESS, EGL_NO_SURFACE);
386df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
387df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
388e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
389e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
390e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
391e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
3929648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
393e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
394e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
395e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
397076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
3980926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
399e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4000926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
40121c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->lock(module, buf->handle,
402e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
4030926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4040926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4050926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4060926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4070926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
40821c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->unlock(module, buf->handle);
4090926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4100926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4110926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        const Rect* reg, ssize_t count)
416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
419df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect r;
421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    const size_t bpp = pixelFormatTable[src->format].size;
422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    const size_t dbpr = dst->stride * bpp;
423df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    const size_t sbpr = src->stride * bpp;
4240926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
425df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
426df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
427df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
428df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    for (int i= 0 ; i<count ; i++) {
429df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        const Rect& r(reg[i]);
430df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t w = r.right - r.left;
431df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t h = r.bottom - r.top;
432df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (w <= 0 || h<=0) continue;
433df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        size_t size = w * bpp;
434df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
435df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
436df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (dbpr==sbpr && size==sbpr) {
437df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            size *= h;
438df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            h = 1;
439df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
440df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        do {
441df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            memcpy(d, s, size);
442df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            d += dbpr;
443df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            s += sbpr;
444df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        } while (--h > 0);
445076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
448076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
450df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
453df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
454df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
457df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
458df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
459df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                Rect const* list;
460df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                ssize_t count = copyBack.getRects(&list);
461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                // copy from previousBuffer to buffer
462df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
463df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
464df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR)
465df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                {
466df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, list, count);
467df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
468df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
469df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
470df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
473076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
474df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
476df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
478076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4790926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
480df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
482df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
484df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
486df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
488076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
490076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
491df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // reallocate the depth-buffer if needed
492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        width = buffer->width;
496076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        height = buffer->height;
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
499076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.width   = width;
500076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.height  = height;
501076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.stride  = buffer->stride;
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer->common.incRef(&buffer->common);
512df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // finally pin the buffer down
514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
517df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        setError(EGL_BAD_ACCESS, EGL_NO_SURFACE);
519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
526df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
528df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5328d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
5338d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
5348d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return buffer;
5358d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
5368d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
5408d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // Hardware supported
541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (format) {
542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
5438d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_8888:
5448d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_4444:
5458d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_5551:
5468d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_BGRA_8888:
547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return true;
548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
5498d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return false;
550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
551076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
553076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
557076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
560e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
5650a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
5670a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian    gl->copybits.drawSurfaceBuffer = 0;
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (supportedCopybitsDestinationFormat(buffer.format)) {
56921c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian        buffer_handle_t handle = this->buffer->handle;
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (handle != NULL) {
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            private_handle_t* hand = private_handle_t::dynamicCast(handle);
5720a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian            if (hand != NULL && hand->usesPhysicallyContiguousMemory()) {
5730a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian                gl->copybits.drawSurfaceBuffer = handle;
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
5780a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
588e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
602df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
603df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
604df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
605df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
606df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
607df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
608df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
609df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
611df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
612df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
696076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
787076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
788e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
789076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
791df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
7928d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        "EGL_ANDROID_get_render_buffer "
793076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
805076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
807076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
808076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
809076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
810076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
811076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8398d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
8408d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
8418d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
8428d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
8438d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
8448d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
8458d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglGetRenderBufferANDROID",
8468d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
999076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1011076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1136076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1140076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1165076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1166076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
1167076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            static_cast<android_native_window_t*>(window));
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1205076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1269076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1281076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1285076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1346076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1349076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1408749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1409749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1410749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1411749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1413749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, numAttributes,
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1459749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1460749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1461749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1462749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1463749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1464749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1465749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1466749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1467749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1468749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1469749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1470749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1471749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1511076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1522e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1523e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1524e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1525e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1526e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: check that draw and read are compatible with the context
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1652e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1663e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1664e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
1665e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                reinterpret_cast<egl_surface_t*>(c->draw)->disconnect();
1666e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1667e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1668e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1669e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1670e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1672e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1673e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1687e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                d->connect();
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1692e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1703e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
17049648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1705e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1706e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1707e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1708e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
17099648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1710e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1711e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1712e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1784076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1917076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1930076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1931076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
1932076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
1933076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1934076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1935076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1936076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1937076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1938076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
1939076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1940076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1941076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1942076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1943076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1944076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1945076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
1946076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1947076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1948076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
1949076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1950076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
1951076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1952076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1953076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
1954076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1955076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1956076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1957076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
1958076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1959076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1960076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1961076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1962076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1963076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
19648b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
1965076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
1966076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
1967076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1968076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1969076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
1970076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1971076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1972076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1973076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1974076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1975076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
1976076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1977076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1978076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1979076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1980076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1981076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1982076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1983076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
1984076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1985076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
1986076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1987df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
1988df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
1989df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
1990df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
1991df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
1992df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
1993df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
1994df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
1995df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1996df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1997df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
1998df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1999df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2000df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2001df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2002df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2003df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2004df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2005df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2006df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
20078d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20088d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
20098d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
20108d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
20118d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
20128d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20138d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
20148d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (d->dpy != dpy)
20158d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
20168d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20178d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // post the surface
20188d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return d->getRenderBuffer();
20198d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
2020