egl.cpp revision 141550bc18f670f7e7ec65fc25363da3dd35d52e
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>
43bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian#include <private/ui/sw_gralloc_handle.h>
447189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h>
46240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1450696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1460696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() const = 0;
147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
150cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
151e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1790696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
1800696a572294bbaa977245afb630065de3278473bMathias Agopian    LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1810696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1820696a572294bbaa977245afb630065de3278473bMathias Agopian}
1830696a572294bbaa977245afb630065de3278473bMathias Agopian
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
2124b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            ANativeWindow* window);
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2140696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2160696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
220cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
221e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
222cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
223cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
228df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2298d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
231e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
2334b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    ANativeWindow*   nativeWindow;
234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
237240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t*          blitengine;
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
240e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
272240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
273240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
274240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
283240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
286240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
323240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    struct region_iterator : public copybit_region_t {
324240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator(const Region& region)
325240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            : b(region.begin()), e(region.end()) {
326240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            this->next = iterate;
327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    private:
329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (me->b != me->e) {
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                return 1;
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            return 0;
336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        mutable Region::const_iterator b;
338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator const e;
339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    };
340240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
342df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
344240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
350076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
3534b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn        ANativeWindow* window)
3540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
355df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
356240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    blitengine(0), bits(NULL)
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
362240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
363240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_open(pModule, &blitengine);
364240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
365240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
367df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
368df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
370cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
371cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
372cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (blitengine) {
383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        copybit_close(blitengine);
384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
387cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
388cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3905221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3915221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3925221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
393df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
394cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
395cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
396cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
398df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
399076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
400076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
401cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
407cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
412076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4140926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
415e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
419240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
421cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
423df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
424cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
425e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
426e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
427e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
428e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4299648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
431e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
432e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
435cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
436cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
442cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
444076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
446e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4470926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
448bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err;
449bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    if (sw_gralloc_handle_t::validate(buf->handle) < 0) {
450bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian        err = module->lock(module, buf->handle,
451bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian                usage, 0, 0, buf->width, buf->height, vaddr);
452bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    } else {
453bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian        sw_gralloc_handle_t const* hnd =
454bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian                reinterpret_cast<sw_gralloc_handle_t const*>(buf->handle);
455bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian        *vaddr = (void*)hnd->base;
456bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian        err = NO_ERROR;
457bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    }
4580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
463cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
464bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err = NO_ERROR;
465bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    if (sw_gralloc_handle_t::validate(buf->handle) < 0) {
466bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian        err = module->unlock(module, buf->handle);
467bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    }
4680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
473df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
476df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
478df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    status_t err = NO_ERROR;
480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t* const copybit = blitengine;
481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (copybit)  {
482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t simg;
483240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.w = src->width;
484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.h = src->height;
485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.format = src->format;
486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t dimg;
489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.w = dst->width;
490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.h = dst->height;
491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.format = dst->format;
492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator it(clip);
498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        if (err != NO_ERROR) {
500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            LOGE("copybit failed (%s)", strerror(err));
501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
5030926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (!copybit || err) {
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator cur = clip.begin();
506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator end = clip.end();
507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t dbpr = dst->stride * bpp;
510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t sbpr = src->stride * bpp;
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        while (cur != end) {
516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Rect& r(*cur++);
517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t w = r.right - r.left;
518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t h = r.bottom - r.top;
519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (w <= 0 || h<=0) continue;
520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            size_t size = w * bpp;
521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (dbpr==sbpr && size==sbpr) {
524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                size *= h;
525240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                h = 1;
526240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
527240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            do {
528240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                memcpy(d, s, size);
529240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                d += dbpr;
530240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                s += sbpr;
531240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            } while (--h > 0);
532df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
533076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
538cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
539cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
540cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
541cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
543df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
544df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
545df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
546df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
549df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
550df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
551df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
553240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
554240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
555240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
557df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
559df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
560df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
571df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
573df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
574031213e5b31c317135f603271333949dda89e01eMathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) {
575031213e5b31c317135f603271333949dda89e01eMathias Agopian
576031213e5b31c317135f603271333949dda89e01eMathias Agopian        // TODO: lockBuffer should rather be executed when the very first
577031213e5b31c317135f603271333949dda89e01eMathias Agopian        // direct rendering occurs.
578031213e5b31c317135f603271333949dda89e01eMathias Agopian        nativeWindow->lockBuffer(nativeWindow, buffer);
579031213e5b31c317135f603271333949dda89e01eMathias Agopian
580031213e5b31c317135f603271333949dda89e01eMathias Agopian        // reallocate the depth-buffer if needed
581031213e5b31c317135f603271333949dda89e01eMathias Agopian        if ((width != buffer->width) || (height != buffer->height)) {
582031213e5b31c317135f603271333949dda89e01eMathias Agopian            // TODO: we probably should reset the swap rect here
583031213e5b31c317135f603271333949dda89e01eMathias Agopian            // if the window size has changed
584031213e5b31c317135f603271333949dda89e01eMathias Agopian            width = buffer->width;
585031213e5b31c317135f603271333949dda89e01eMathias Agopian            height = buffer->height;
586031213e5b31c317135f603271333949dda89e01eMathias Agopian            if (depth.data) {
587031213e5b31c317135f603271333949dda89e01eMathias Agopian                free(depth.data);
588031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.width   = width;
589031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.height  = height;
590031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.stride  = buffer->stride;
591031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
592031213e5b31c317135f603271333949dda89e01eMathias Agopian                if (depth.data == 0) {
593031213e5b31c317135f603271333949dda89e01eMathias Agopian                    setError(EGL_BAD_ALLOC, EGL_FALSE);
594031213e5b31c317135f603271333949dda89e01eMathias Agopian                    return EGL_FALSE;
595031213e5b31c317135f603271333949dda89e01eMathias Agopian                }
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
598df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
599031213e5b31c317135f603271333949dda89e01eMathias Agopian        // keep a reference on the buffer
600031213e5b31c317135f603271333949dda89e01eMathias Agopian        buffer->common.incRef(&buffer->common);
601031213e5b31c317135f603271333949dda89e01eMathias Agopian
602031213e5b31c317135f603271333949dda89e01eMathias Agopian        // finally pin the buffer down
603031213e5b31c317135f603271333949dda89e01eMathias Agopian        if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
604031213e5b31c317135f603271333949dda89e01eMathias Agopian                GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
605031213e5b31c317135f603271333949dda89e01eMathias Agopian            LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
606031213e5b31c317135f603271333949dda89e01eMathias Agopian                    buffer, buffer->width, buffer->height);
607031213e5b31c317135f603271333949dda89e01eMathias Agopian            return setError(EGL_BAD_ACCESS, EGL_FALSE);
608031213e5b31c317135f603271333949dda89e01eMathias Agopian            // FIXME: we should make sure we're not accessing the buffer anymore
609031213e5b31c317135f603271333949dda89e01eMathias Agopian        }
610031213e5b31c317135f603271333949dda89e01eMathias Agopian    } else {
611031213e5b31c317135f603271333949dda89e01eMathias Agopian        return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
612df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
631e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
6360a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
646e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
651076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
654076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
660df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
661df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
662df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
663df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
664df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
665df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
666df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
667df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
668df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
669df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
670df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
671df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
672df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
673df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
674df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
675df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
676076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6900696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
724076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7530696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
784076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
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
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
843141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.2.0";
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
846e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
849df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
862076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
863076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8968d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
8978d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
8988d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
8998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
9008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
9018d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
904076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
915076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
93056fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
9310985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
9320985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
9330985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
93456fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
9350985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 0                                 }
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
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 },
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9678b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,       0 },
9728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        6 },
9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,      16 },
9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        7 },
9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs
9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs
10118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
10418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10720985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
10730985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
10740985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
10750985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
10760985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10790985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10810985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // attributes that are not specified are simply ignored, if a particular
10820985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // one needs not be ignored, it must be specified here, eg:
10830985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{
10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    switch(configID) {
10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 0:
10938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 1:
10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 2:
11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 3:
11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 4:
11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 5:
11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 6:
11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 7:
11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    default:
11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        return NAME_NOT_FOUND;
11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    }
11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    return NO_ERROR;
11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}
11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ----------------------------------------------------------------------------
11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1137076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1139076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
116997640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell        if (cfgMgtIndex >= 0) {
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12644b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    if (static_cast<ANativeWindow*>(window)->common.magic !=
12650696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12660696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12670696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12680696a572294bbaa977245afb630065de3278473bMathias Agopian
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1285076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1286076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12874b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            static_cast<ANativeWindow*>(window));
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12890696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13130696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
13140696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
13150696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
13160696a572294bbaa977245afb630065de3278473bMathias Agopian    }
13170696a572294bbaa977245afb630065de3278473bMathias Agopian
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13350696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13780696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1413076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1421076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1424076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1483749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1484749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1485749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1486749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1488749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
148904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        /*
149004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * A NULL attrib_list should be treated as though it was an empty
149104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * one (terminated with EGL_NONE) as defined in
149204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * section 3.4.1 "Querying Configurations" in the EGL specification.
149304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         */
149404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        static const EGLint dummy = EGL_NONE;
149504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        attrib_list = &dummy;
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1497076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
15050985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
15150985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
15160985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        // see if this attribute was specified, if not, apply its
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1520dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
15230985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1539749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1540749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1541749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1542749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1543749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1544749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1545749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1546749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1547749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1548749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1549749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1550749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
15980696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1602e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1603e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1604e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1605e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1606e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
16180696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
16190696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1668076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
17120696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17130696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
17140696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
17150696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17160696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
17170696a572294bbaa977245afb630065de3278473bMathias Agopian    }
17180696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
17190696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
17200696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17210696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17240696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1728076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1744e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1755e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1756e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17570696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17580696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
1759e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1760e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1761e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1762e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1763e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1765e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1780cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1781cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1782cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1787e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1798e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
17999648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1800e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1801e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1802e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1803e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
18049648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1805e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1806e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1807e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18810696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18820696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2029076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2031076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2033076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20618dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
20628dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    switch (native_buffer->format) {
20638dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
20648dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
20658dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
20668dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
20678dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
20688dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_5551:
20698dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_4444:
20708dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            break;
20718dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        default:
20728dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20738dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    }
20748dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2081076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
2086076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2097df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2098df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2099df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2100df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2101df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2102df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2103df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2104df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2105df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2106df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2107df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2108df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21090696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21100696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2111df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2112df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2113df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2114df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2115df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2116df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2117df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2118df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2119