egl.cpp revision e71212ba5397387100a578d23b15862518a7a859
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>
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/android_natives.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h"
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool    isValid() const = 0;
146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
149e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        connect() {}
150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() 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::getRefreshRate() const {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            android_native_window_t* window);
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     ~egl_window_surface_v2_t();
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
208e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        connect();
209e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getWidth() const    { return buffer->width;  }
211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getHeight() const   { return buffer->height; }
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
216e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
218e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t*   nativeWindow;
221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
2220926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
223076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
225e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window)
2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
233e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow(window), buffer(0), module(0), bits(NULL)
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
2370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
2380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
240076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
241076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
257e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
258076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
259e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::connect()
260e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
2610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
262e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
263e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, &bits);
264e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
265e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
266e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
267e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
268e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    if (buffer) {
269e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
270e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
271e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
275e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
2760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
2770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    int err;
2780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    buffer_handle_t bufferHandle;
2790926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = buf->getHandle(buf, &bufferHandle);
2800926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    if (err < 0)
2810926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        return err;
2820926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2830926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = module->lock(module, bufferHandle,
284e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
2850926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
2860926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
2870926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2880926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
2890926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
2900926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    int err;
2910926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    buffer_handle_t bufferHandle;
2920926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = buf->getHandle(buf, &bufferHandle);
2930926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    if (err < 0)
2940926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        return err;
2950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2960926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = module->unlock(module, bufferHandle);
2970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
2980926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
2990926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
3000926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
301076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (buffer) {
303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffer->common.decRef(&buffer->common);
304076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
305076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
308076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
310076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: this is roughly the code needed for preserving the back buffer
311076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // efficiently. dirty is the area that has been modified.
312076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //Region newDirty(dirty);
313076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //newDirty.andSelf(Rect(nativeWindow->width, nativeWindow->height));
314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //mDirty = newDirty;
315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //const Region copyback(mDirty.subtract(newDirty));
316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //mDisplaySurface->copyFrontToBack(copyback);
317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
3190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.decRef(&buffer->common); buffer = 0;
322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
328e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* vaddr;
329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
330e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, &bits);
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
335076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        width = buffer->width;
336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        height = buffer->height;
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
339076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.width   = width;
340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.height  = height;
341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.stride  = buffer->stride;
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // Hardware supported and no destination alpha
356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (format) {
357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
358076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return true;
361076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    default:
362076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return false;
363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
364076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
366076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
374e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
375076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
379076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    gl->copybits.drawSurfaceFd = -1;
381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (supportedCopybitsDestinationFormat(buffer.format)) {
382076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffer_handle_t handle;
383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        this->buffer->getHandle(this->buffer, &handle);
384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (handle != NULL) {
385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            private_handle_t* hand = private_handle_t::dynamicCast(handle);
386076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            if (hand != NULL) {
387076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                if (hand->usesPhysicallyContiguousMemory()) {
388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    gl->copybits.drawSurfaceFd = hand->fd;
389076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                }
390076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
396076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
400076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
403e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
408076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
411076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
414076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
415076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const {
418076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //uint32_t flags = nativeWindow->flags;
419076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //if (flags & SURFACE_FLAG_PRESERVE_CONTENT)
420076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //    return EGL_BUFFER_PRESERVED;
421076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // This is now a feature of EGL, currently we don't preserve
422076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // the content of the buffers.
423076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
437076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
472076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
501076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "KHR_image_base "
594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
794076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
926076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
927076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
931076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
935076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
939076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
943076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
947076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
960076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
961076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
962076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            static_cast<android_native_window_t*>(window));
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
995076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
996076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1133076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
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_FALSE);
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1203749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1204749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1205749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1206749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1208749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1212076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, numAttributes,
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1254749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1255749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1256749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1257749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1258749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1259749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1260749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1261749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1262749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1263749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1264749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1265749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1266749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1306076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1317e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1318e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1319e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1320e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1321e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: check that draw and read are compatible with the context
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1431076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1447e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1458e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1459e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
1460e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                reinterpret_cast<egl_surface_t*>(c->draw)->disconnect();
1461e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1462e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1463e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1464e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1465e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1467e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1468e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1482e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                d->connect();
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1487e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1498e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
1499e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1500e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1501e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1502e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
1503e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1504e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1505e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1710076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1723076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1724076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
1725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
1726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1727076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1728076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1729076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1730076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1731076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
1732076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1733076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1736076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1737076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
1739076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1740076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1741076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
1742076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
1744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
1747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
1751076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1752076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1753076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1755076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
17578b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
1758076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
1759076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
1760076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1761076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1762076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
1763076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1764076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1765076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1766076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1767076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1768076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
1769076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1770076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1771076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1772076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1773076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1775076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1776076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
1777076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
1779076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1780