egl.cpp revision 83e7c8c431ec8b578b6f778811837632e3798768
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>
335f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian#include <ui/ANativeObjectBase.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.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
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
515f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian// ----------------------------------------------------------------------------
524b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
534b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
544b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height);
554b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
585f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
882076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    if (error == 0) {
892076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // The TLS key has been created by another thread, but the value for
902076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // this thread has not been initialized.
912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        return EGL_SUCCESS;
922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    }
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1520696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1530696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() const = 0;
154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
157cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
158e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
167df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1860696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
187e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1880696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1890696a572294bbaa977245afb630065de3278473bMathias Agopian}
1900696a572294bbaa977245afb630065de3278473bMathias Agopian
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
206df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
207df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
208df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
214076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
2194b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            ANativeWindow* window);
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2210696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2230696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
227cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
228e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
229cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
230cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2368d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
238697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr);
239697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    status_t unlock(ANativeWindowBuffer* buf);
2404b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    ANativeWindow*   nativeWindow;
241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer*   buffer;
242697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer*   previousBuffer;
2430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
245076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
246e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
2669d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("%s { %5d, %5d, w=%5d, h=%5d }",
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
278240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
279240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
280240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
291df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
308240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
312240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
330697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev            ANativeWindowBuffer* dst, void* dst_vaddr,
331697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev            ANativeWindowBuffer* src, void const* src_vaddr,
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
333df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
334df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
335df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
3414b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn        ANativeWindow* window)
3420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
3449cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    bits(NULL)
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
34669e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    hw_module_t const* pModule;
34769e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
34869e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
34969e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian
350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
352df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
354cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
355cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
356cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
359cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
366cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
367cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
368cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3705221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3715221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3725221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3735221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
374df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
375cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
376cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
377cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
378df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
379df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
388cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
392df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
394df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
3950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
396e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
398df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
399df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
400e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("connect() failed to lock buffer %p (%ux%u)",
401df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
402cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
403df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
404df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
405cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
406e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
407e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
408e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
409e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4109648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
411e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
412e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
413e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
414cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
415cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
416cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
417cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
418cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
419cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
420cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
421cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
422cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
423cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
425076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4260926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
427697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* buf, int usage, void** vaddr)
4280926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
429bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err;
430695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
431695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->lock(module, buf->handle,
432695b66f082033d618ce19ee289d858130bd5420bMathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
433695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
437697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf)
4380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
439cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
440bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err = NO_ERROR;
441695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
442695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->unlock(module, buf->handle);
443695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
447df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
448697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* dst, void* dst_vaddr,
449697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* src, void const* src_vaddr,
450240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
453df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4549cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    Region::const_iterator cur = clip.begin();
4559cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    Region::const_iterator end = clip.end();
4569cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4579cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t bpp = pixelFormatTable[src->format].size;
4589cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t dbpr = dst->stride * bpp;
4599cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t sbpr = src->stride * bpp;
4609cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4619cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    while (cur != end) {
4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        const Rect& r(*cur++);
4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        ssize_t w = r.right - r.left;
4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        ssize_t h = r.bottom - r.top;
4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        if (w <= 0 || h<=0) continue;
4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        size_t size = w * bpp;
4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        if (dbpr==sbpr && size==sbpr) {
4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            size *= h;
4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            h = 1;
475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        do {
4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            memcpy(d, s, size);
4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            d += dbpr;
4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            s += sbpr;
4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        } while (--h > 0);
481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
486cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
487cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
488cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
489cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
490df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
491df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
492df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
493df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
494df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
495df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
496df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
49772c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // This was const Region copyBack, but that causes an
49872c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // internal compile error on simulator builds
49972c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
501df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
502df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
507df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
512076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
517076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5180926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
524031213e5b31c317135f603271333949dda89e01eMathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) {
525031213e5b31c317135f603271333949dda89e01eMathias Agopian
526031213e5b31c317135f603271333949dda89e01eMathias Agopian        // TODO: lockBuffer should rather be executed when the very first
527031213e5b31c317135f603271333949dda89e01eMathias Agopian        // direct rendering occurs.
528031213e5b31c317135f603271333949dda89e01eMathias Agopian        nativeWindow->lockBuffer(nativeWindow, buffer);
529031213e5b31c317135f603271333949dda89e01eMathias Agopian
530031213e5b31c317135f603271333949dda89e01eMathias Agopian        // reallocate the depth-buffer if needed
531031213e5b31c317135f603271333949dda89e01eMathias Agopian        if ((width != buffer->width) || (height != buffer->height)) {
532031213e5b31c317135f603271333949dda89e01eMathias Agopian            // TODO: we probably should reset the swap rect here
533031213e5b31c317135f603271333949dda89e01eMathias Agopian            // if the window size has changed
534031213e5b31c317135f603271333949dda89e01eMathias Agopian            width = buffer->width;
535031213e5b31c317135f603271333949dda89e01eMathias Agopian            height = buffer->height;
536031213e5b31c317135f603271333949dda89e01eMathias Agopian            if (depth.data) {
537031213e5b31c317135f603271333949dda89e01eMathias Agopian                free(depth.data);
538031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.width   = width;
539031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.height  = height;
540031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.stride  = buffer->stride;
541031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
542031213e5b31c317135f603271333949dda89e01eMathias Agopian                if (depth.data == 0) {
543031213e5b31c317135f603271333949dda89e01eMathias Agopian                    setError(EGL_BAD_ALLOC, EGL_FALSE);
544031213e5b31c317135f603271333949dda89e01eMathias Agopian                    return EGL_FALSE;
545031213e5b31c317135f603271333949dda89e01eMathias Agopian                }
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
549031213e5b31c317135f603271333949dda89e01eMathias Agopian        // keep a reference on the buffer
550031213e5b31c317135f603271333949dda89e01eMathias Agopian        buffer->common.incRef(&buffer->common);
551031213e5b31c317135f603271333949dda89e01eMathias Agopian
552031213e5b31c317135f603271333949dda89e01eMathias Agopian        // finally pin the buffer down
553031213e5b31c317135f603271333949dda89e01eMathias Agopian        if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
554031213e5b31c317135f603271333949dda89e01eMathias Agopian                GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
555e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
556031213e5b31c317135f603271333949dda89e01eMathias Agopian                    buffer, buffer->width, buffer->height);
557031213e5b31c317135f603271333949dda89e01eMathias Agopian            return setError(EGL_BAD_ACCESS, EGL_FALSE);
558031213e5b31c317135f603271333949dda89e01eMathias Agopian            // FIXME: we should make sure we're not accessing the buffer anymore
559031213e5b31c317135f603271333949dda89e01eMathias Agopian        }
560031213e5b31c317135f603271333949dda89e01eMathias Agopian    } else {
561031213e5b31c317135f603271333949dda89e01eMathias Agopian        return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
567df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
568df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
570df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
581e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
5860a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
596e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
611df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
612df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
623df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6400696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7030696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
724e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("incompatible pixel format for pbuffer (format=%d)", f);
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
786639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    static bool ignore(GLint reqValue, GLint confValue) {
787639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        return true;
788639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    }
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
796141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.2.0";
797cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString  = "OpenGL_ES";
798076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
79983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        "EGL_KHR_fence_sync "
800e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
803df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8508d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
8518d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
8528d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
8538d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
85483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglCreateSyncKHR",
85583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR },
85683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglDestroySyncKHR",
85783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR },
85883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglClientWaitSyncKHR",
85983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR },
86083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglGetSyncAttribKHR",
86183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR },
8628d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
8638d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
89256fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
8930985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
8940985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
8950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
89656fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
8970985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 0                                 }
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
912d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
924d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,       0 },
9368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        6 },
937d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9398b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
9428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
9438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9478b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,      16 },
9488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        7 },
949d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9508b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9518b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs
9548b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
9558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
9626af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9668b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
974d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs
9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
987d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
9996af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
10118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1025639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::ignore   },
1026639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::ignore   },
1027639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::ignore   },
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1029639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_NATIVE_VISUAL_ID,           config_management_t::ignore   },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10420985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
10430985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
10440985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
10450985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
10460985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10490985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10510985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // attributes that are not specified are simply ignored, if a particular
10520985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // one needs not be ignored, it must be specified here, eg:
10530985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10588b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
10598b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
10608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{
10618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    switch(configID) {
10628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 0:
10638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10668b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 1:
10678b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 2:
10718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
10728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 3:
10758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
10768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 4:
10798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
10808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 5:
10838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
10848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 6:
10878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 7:
10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    default:
10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        return NAME_NOT_FOUND;
10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    }
10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    return NO_ERROR;
10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}
10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ----------------------------------------------------------------------------
11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
113997640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell        if (cfgMgtIndex >= 0) {
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12344b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    if (static_cast<ANativeWindow*>(window)->common.magic !=
12350696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12360696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12370696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12380696a572294bbaa977245afb630065de3278473bMathias Agopian
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12574b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            static_cast<ANativeWindow*>(window));
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12590696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12830696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
12840696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
12850696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
12860696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12870696a572294bbaa977245afb630065de3278473bMathias Agopian
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13050696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13480696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1453749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1454749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1455749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1456749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1458749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
145904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        /*
146004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * A NULL attrib_list should be treated as though it was an empty
146104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * one (terminated with EGL_NONE) as defined in
146204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * section 3.4.1 "Querying Configurations" in the EGL specification.
146304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         */
146404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        static const EGLint dummy = EGL_NONE;
146504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        attrib_list = &dummy;
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1467076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
14750985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
14850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
14860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        // see if this attribute was specified, if not, apply its
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1490dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
14930985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1509749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1510749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1511749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1512749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1513749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1514749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1515749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1516749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1517749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1518749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1519749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1520749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1521749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
15680696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1572e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1573e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1574e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1575e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1576e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
15880696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
15890696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
16820696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
16830696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
16840696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
16850696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16860696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
16870696a572294bbaa977245afb630065de3278473bMathias Agopian    }
16880696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
16890696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
16900696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
16910696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16940696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1698076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1714e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1725e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1726e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17270696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17280696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
1729e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1730e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1731e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1732e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1733e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1735e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1736e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1750cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1751cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1752cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1757e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
17699648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1770e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
17749648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1776e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1777e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18510696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18520696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1942551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen    return EGL_TRUE;
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1984076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1998076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
1999076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2001076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2002076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2003076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2005076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2006076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2007076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2009076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2010076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2011076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2015076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2022076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2023076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2024697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer;
2025076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2029697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    if (native_buffer->common.version != sizeof(ANativeWindowBuffer))
2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20318dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
20328dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    switch (native_buffer->format) {
20338dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
20348dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
20358dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
20368dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
20378dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
20388dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_5551:
20398dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_4444:
20408dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            break;
20418dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        default:
20428dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20438dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    }
20448dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2055697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img;
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2060697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    if (native_buffer->common.version != sizeof(ANativeWindowBuffer))
2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2067df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2068df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
206983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync
207083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ----------------------------------------------------------------------------
207183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
207283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE)
207383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
207483e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type,
207583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        const EGLint *attrib_list)
207683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
207783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
207883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR);
207983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
208083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
208183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (type != EGL_SYNC_FENCE_KHR ||
208283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (attrib_list != NULL && attrib_list[0] != EGL_NONE)) {
208383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR);
208483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
208583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
208683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (eglGetCurrentContext() == EGL_NO_CONTEXT) {
208783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
208883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
208983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
209083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    // AGL is synchronous; nothing to do here.
209183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
209283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return FENCE_SYNC_HANDLE;
209383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
209483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
209583e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
209683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
209783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
209883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
209983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
210083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return EGL_TRUE;
210283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
210383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210483e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags,
210583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        EGLTimeKHR timeout)
210683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
210783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
210883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
210983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
211083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
211183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return EGL_CONDITION_SATISFIED_KHR;
211283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
211383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
211483e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync,
211583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        EGLint attribute, EGLint *value)
211683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
211783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
211883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
211983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
212083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
212183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    switch (attribute) {
212283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_TYPE_KHR:
212383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SYNC_FENCE_KHR;
212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_STATUS_KHR:
212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SIGNALED_KHR;
212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
212883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_CONDITION_KHR:
212983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR;
213083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    default:
213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ----------------------------------------------------------------------------
2137df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2138df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2139df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2140df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2141df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2142df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2143df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2144df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2145df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2146df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21470696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21480696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2149df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2150df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2151df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2152df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2153df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2154df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2155df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2156df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2157