egl.cpp revision 0926f50664c739eaee60341f8e8c694dc9a4f3eb
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/android_natives.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h"
50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool    isValid() const = 0;
146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const = 0;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
196076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
199076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            android_native_window_t* window);
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     ~egl_window_surface_v2_t();
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getWidth() const    { return buffer->width;  }
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     EGLint      getHeight() const   { return buffer->height; }
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
2150926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t lock(android_native_buffer_t* buf, int usage);
2160926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t*   nativeWindow;
218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
2190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
227076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window)
2280926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
2290926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    nativeWindow(window), buffer(0), module(0)
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
2330926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
2340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
235076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
240076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
251076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
252076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
254076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
2580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
2590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
260076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // FIXME: we need to handle the copy-back if needed, but
261076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // for now we're a "non preserving" implementation.
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
263076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
2650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        android_native_buffer_t* buf, int usage)
2660926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
2670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    int err;
2680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    buffer_handle_t bufferHandle;
2690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = buf->getHandle(buf, &bufferHandle);
2700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    if (err < 0)
2710926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        return err;
2720926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = module->lock(module, bufferHandle,
2740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian            usage, 0, 0, buf->width, buf->height, &buf->bits);
2750926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
2760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
2770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
2790926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
2800926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    int err;
2810926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    buffer_handle_t bufferHandle;
2820926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = buf->getHandle(buf, &bufferHandle);
2830926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    if (err < 0)
2840926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        return err;
2850926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2860926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    err = module->unlock(module, bufferHandle);
2870926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    buf->bits = NULL;
2880926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
2890926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
2900926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
2910926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (buffer) {
2940926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian        unlock(buffer);
295076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffer->common.decRef(&buffer->common);
296076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: this is roughly the code needed for preserving the back buffer
303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // efficiently. dirty is the area that has been modified.
304076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //Region newDirty(dirty);
305076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //newDirty.andSelf(Rect(nativeWindow->width, nativeWindow->height));
306076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //mDirty = newDirty;
307076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //const Region copyback(mDirty.subtract(newDirty));
308076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //mDisplaySurface->copyFrontToBack(copyback);
309076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
310076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
3110926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
312076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
313076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.decRef(&buffer->common); buffer = 0;
314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
319076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
3210926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        width = buffer->width;
328076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        height = buffer->height;
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.width   = width;
332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.height  = height;
333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.stride  = buffer->stride;
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
345076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
346076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
347076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // Hardware supported and no destination alpha
348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (format) {
349076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
350076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
351076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return true;
353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    default:
354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return false;
355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
358076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
364076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
366076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.data    = (GGLubyte*)this->buffer->bits;
367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    gl->copybits.drawSurfaceFd = -1;
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (supportedCopybitsDestinationFormat(buffer.format)) {
374076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        buffer_handle_t handle;
375076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        this->buffer->getHandle(this->buffer, &handle);
376076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        if (handle != NULL) {
377076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            private_handle_t* hand = private_handle_t::dynamicCast(handle);
378076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            if (hand != NULL) {
379076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                if (hand->usesPhysicallyContiguousMemory()) {
380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    gl->copybits.drawSurfaceFd = hand->fd;
381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                }
382076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
395076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.data    = (GGLubyte*)this->buffer->bits;
396076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
400076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid* egl_window_surface_v2_t::getBits() const {
401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (GGLubyte*)buffer->bits;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
406076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
409076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
412076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const {
413076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //uint32_t flags = nativeWindow->flags;
414076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //if (flags & SURFACE_FLAG_PRESERVE_CONTENT)
415076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    //    return EGL_BUFFER_PRESERVED;
416076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // This is now a feature of EGL, currently we don't preserve
417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // the content of the buffers.
418076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
432076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const     { return nativePixmap.data; }
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
468076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
497076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const     { return pbuffer.data; }
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
528076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "KHR_image_base "
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
652076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
789076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
791076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
809076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
923076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
924076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
928076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
932076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
936076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
940076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
944076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
957076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
958076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
959076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            static_cast<android_native_window_t*>(window));
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
992076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
993076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
997076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1001076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1005076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1009076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1138076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1200749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1201749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1202749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1203749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1205749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, numAttributes,
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1251749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1252749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1253749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1254749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1255749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1256749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1257749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1258749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1259749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1260749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1261749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1262749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1263749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: check that draw and read are compatible with the context
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1423076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // once of the surface is bound to a context in another thread
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1444076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: call connect / disconnect on the surface
1445076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->read = read;
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (d) d->ctx = EGL_NO_CONTEXT;
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (r) r->ctx = EGL_NO_CONTEXT;
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1554076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1687076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1700076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1701076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
1702076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
1703076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1704076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1705076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1706076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1707076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1708076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
1709076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1710076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
1711076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
1712076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1713076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1714076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1715076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
1716076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1717076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1718076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
1719076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1720076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
1721076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1722076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1723076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
1724076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1727076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
1728076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1729076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1730076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1731076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1732076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1733076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
17348b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
1735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
1736076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
1737076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1739076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
1740076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
1741076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
1742076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
1746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
1748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
1751076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1752076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1753076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
1754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1755076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
1756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
1757