egl.cpp revision 695b66f082033d618ce19ee289d858130bd5420b
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
44240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h>
45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1440696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1450696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() 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;
149cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
159df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1780696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
1790696a572294bbaa977245afb630065de3278473bMathias Agopian    LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1800696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1810696a572294bbaa977245afb630065de3278473bMathias Agopian}
1820696a572294bbaa977245afb630065de3278473bMathias Agopian
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
2114b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            ANativeWindow* window);
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2130696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2150696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
219cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
220e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
221cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
222cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
227df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2288d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
230e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
2324b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    ANativeWindow*   nativeWindow;
233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
234df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
236240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t*          blitengine;
237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
239e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
271240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
272240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
273240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
282240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
285240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
286240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
302df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
306df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
322240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    struct region_iterator : public copybit_region_t {
323240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator(const Region& region)
324240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            : b(region.begin()), e(region.end()) {
325240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            this->next = iterate;
326240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    private:
328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (me->b != me->e) {
331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                return 1;
333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            return 0;
335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        mutable Region::const_iterator b;
337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator const e;
338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    };
339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
340df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
342df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
343240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
344df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
349076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
3524b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn        ANativeWindow* window)
3530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
354df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
355240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    blitengine(0), bits(NULL)
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
361240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
362240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_open(pModule, &blitengine);
363240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
364240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
365df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
367df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
368076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
370cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
371cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
373cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (blitengine) {
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        copybit_close(blitengine);
383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
386cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
387cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3885221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3905221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3915221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
392df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
393cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
394cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
395cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
396df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
398076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
399076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
400cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
406cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
409076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
411076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4130926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
414e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
418240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
419df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
420cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
423cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
425e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
426e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
427e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4289648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
429e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
431e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
435cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
436cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
443076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
445e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
447bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err;
448695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
449695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->lock(module, buf->handle,
450695b66f082033d618ce19ee289d858130bd5420bMathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
451695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4550926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
457cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
458bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err = NO_ERROR;
459695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
460695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->unlock(module, buf->handle);
461695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
465df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
466df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
467df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
468240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
469df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
470df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
473240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    status_t err = NO_ERROR;
474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t* const copybit = blitengine;
475240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (copybit)  {
476240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t simg;
477a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist        simg.w = src->stride;
478240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.h = src->height;
479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.format = src->format;
480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t dimg;
483a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist        dimg.w = dst->stride;
484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.h = dst->height;
485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.format = dst->format;
486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator it(clip);
492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        if (err != NO_ERROR) {
494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            LOGE("copybit failed (%s)", strerror(err));
495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
4970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (!copybit || err) {
499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator cur = clip.begin();
500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator end = clip.end();
501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t dbpr = dst->stride * bpp;
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t sbpr = src->stride * bpp;
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        while (cur != end) {
510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Rect& r(*cur++);
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t w = r.right - r.left;
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t h = r.bottom - r.top;
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (w <= 0 || h<=0) continue;
514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            size_t size = w * bpp;
515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (dbpr==sbpr && size==sbpr) {
518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                size *= h;
519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                h = 1;
520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            do {
522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                memcpy(d, s, size);
523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                d += dbpr;
524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                s += sbpr;
525240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            } while (--h > 0);
526df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
527076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
532cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
533cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
534cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
535cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
536df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
537df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
538df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
539df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
540df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
541df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
54372c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // This was const Region copyBack, but that causes an
54472c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // internal compile error on simulator builds
54572c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
546df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
549240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
550240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
551240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
553df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
554df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
555df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
557df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
559df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
560df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
567df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
570031213e5b31c317135f603271333949dda89e01eMathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) {
571031213e5b31c317135f603271333949dda89e01eMathias Agopian
572031213e5b31c317135f603271333949dda89e01eMathias Agopian        // TODO: lockBuffer should rather be executed when the very first
573031213e5b31c317135f603271333949dda89e01eMathias Agopian        // direct rendering occurs.
574031213e5b31c317135f603271333949dda89e01eMathias Agopian        nativeWindow->lockBuffer(nativeWindow, buffer);
575031213e5b31c317135f603271333949dda89e01eMathias Agopian
576031213e5b31c317135f603271333949dda89e01eMathias Agopian        // reallocate the depth-buffer if needed
577031213e5b31c317135f603271333949dda89e01eMathias Agopian        if ((width != buffer->width) || (height != buffer->height)) {
578031213e5b31c317135f603271333949dda89e01eMathias Agopian            // TODO: we probably should reset the swap rect here
579031213e5b31c317135f603271333949dda89e01eMathias Agopian            // if the window size has changed
580031213e5b31c317135f603271333949dda89e01eMathias Agopian            width = buffer->width;
581031213e5b31c317135f603271333949dda89e01eMathias Agopian            height = buffer->height;
582031213e5b31c317135f603271333949dda89e01eMathias Agopian            if (depth.data) {
583031213e5b31c317135f603271333949dda89e01eMathias Agopian                free(depth.data);
584031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.width   = width;
585031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.height  = height;
586031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.stride  = buffer->stride;
587031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
588031213e5b31c317135f603271333949dda89e01eMathias Agopian                if (depth.data == 0) {
589031213e5b31c317135f603271333949dda89e01eMathias Agopian                    setError(EGL_BAD_ALLOC, EGL_FALSE);
590031213e5b31c317135f603271333949dda89e01eMathias Agopian                    return EGL_FALSE;
591031213e5b31c317135f603271333949dda89e01eMathias Agopian                }
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
594df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
595031213e5b31c317135f603271333949dda89e01eMathias Agopian        // keep a reference on the buffer
596031213e5b31c317135f603271333949dda89e01eMathias Agopian        buffer->common.incRef(&buffer->common);
597031213e5b31c317135f603271333949dda89e01eMathias Agopian
598031213e5b31c317135f603271333949dda89e01eMathias Agopian        // finally pin the buffer down
599031213e5b31c317135f603271333949dda89e01eMathias Agopian        if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
600031213e5b31c317135f603271333949dda89e01eMathias Agopian                GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
601031213e5b31c317135f603271333949dda89e01eMathias Agopian            LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
602031213e5b31c317135f603271333949dda89e01eMathias Agopian                    buffer, buffer->width, buffer->height);
603031213e5b31c317135f603271333949dda89e01eMathias Agopian            return setError(EGL_BAD_ACCESS, EGL_FALSE);
604031213e5b31c317135f603271333949dda89e01eMathias Agopian            // FIXME: we should make sure we're not accessing the buffer anymore
605031213e5b31c317135f603271333949dda89e01eMathias Agopian        }
606031213e5b31c317135f603271333949dda89e01eMathias Agopian    } else {
607031213e5b31c317135f603271333949dda89e01eMathias Agopian        return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
608df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
609df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
611df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
612df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
627e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
6320a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
642e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
650076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
653076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
654076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
656df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
657df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
658df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
659df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
660df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
661df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
662df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
663df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
664df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
665df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
666df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
667df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
668df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
669df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
670df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
671df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
672076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6860696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
720076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7490696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
780076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
832639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    static bool ignore(GLint reqValue, GLint confValue) {
833639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        return true;
834639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    }
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
842141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.2.0";
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
845e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
848df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
862076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
863076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8958d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
8968d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
8978d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
8988d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
8998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
9008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
914076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
92956fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
9300985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
9310985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
9320985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
93356fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
9340985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 0                                 }
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
949d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
961d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,       0 },
9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        6 },
974d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,      16 },
9858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        7 },
986d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs
9918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
9928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
9996af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
1011d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs
10168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
1024d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
10366af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10478b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
10488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1062639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::ignore   },
1063639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::ignore   },
1064639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::ignore   },
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1066639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_NATIVE_VISUAL_ID,           config_management_t::ignore   },
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10790985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
10800985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
10810985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
10820985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
10830985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // attributes that are not specified are simply ignored, if a particular
10890985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // one needs not be ignored, it must be specified here, eg:
10900985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{
10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    switch(configID) {
10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 0:
11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 1:
11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 2:
11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 3:
11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 4:
11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 5:
11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 6:
11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 7:
11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    default:
11328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        return NAME_NOT_FOUND;
11338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    }
11348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    return NO_ERROR;
11358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}
11368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
11378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ----------------------------------------------------------------------------
11388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
117697640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell        if (cfgMgtIndex >= 0) {
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12714b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    if (static_cast<ANativeWindow*>(window)->common.magic !=
12720696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12730696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12740696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12750696a572294bbaa977245afb630065de3278473bMathias Agopian
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12944b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            static_cast<ANativeWindow*>(window));
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12960696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13200696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
13210696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
13220696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
13230696a572294bbaa977245afb630065de3278473bMathias Agopian    }
13240696a572294bbaa977245afb630065de3278473bMathias Agopian
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13420696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13850696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1420076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1428076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1431076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1490749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1491749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1492749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1493749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1495749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
149604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        /*
149704aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * A NULL attrib_list should be treated as though it was an empty
149804aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * one (terminated with EGL_NONE) as defined in
149904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * section 3.4.1 "Querying Configurations" in the EGL specification.
150004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         */
150104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        static const EGLint dummy = EGL_NONE;
150204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        attrib_list = &dummy;
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1504076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
15120985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
15220985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
15230985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        // see if this attribute was specified, if not, apply its
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1527dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
15300985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1546749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1547749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1548749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1549749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1550749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1553749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1554749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1555749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1556749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1557749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1558749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1598076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
16050696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1609e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1610e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1611e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1612e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1613e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
16250696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
16260696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1675076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
17190696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17200696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
17210696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
17220696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17230696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
17240696a572294bbaa977245afb630065de3278473bMathias Agopian    }
17250696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
17260696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
17270696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17280696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17310696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1751e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1762e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1763e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17640696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17650696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1767e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1769e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1770e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1787cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1788cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1789cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1794e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1805e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
18069648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1807e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1808e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1809e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1810e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
18119648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1813e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1814e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18880696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18890696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1979551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen    return EGL_TRUE;
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20688dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
20698dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    switch (native_buffer->format) {
20708dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
20718dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
20728dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
20738dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
20748dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
20758dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_5551:
20768dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_4444:
20778dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            break;
20788dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        default:
20798dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20808dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    }
20818dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2086076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2104df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2105df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2106df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2107df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2108df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2109df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2110df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2111df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2112df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2113df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2114df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2115df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21160696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21170696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2118df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2119df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2120df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2121df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2122df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2123df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2124df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2125df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2126