egl.cpp revision 2076f35549c7c04035b9f626d9209e049b6c91f8
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
44240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h>
45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
852076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    if (error == 0) {
862076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // The TLS key has been created by another thread, but the value for
872076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // this thread has not been initialized.
882076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        return EGL_SUCCESS;
892076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    }
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
99076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1490696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1500696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() const = 0;
151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
154cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
155e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
164df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1830696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
1840696a572294bbaa977245afb630065de3278473bMathias Agopian    LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1850696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1860696a572294bbaa977245afb630065de3278473bMathias Agopian}
1870696a572294bbaa977245afb630065de3278473bMathias Agopian
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
204df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
205df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
206df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
207df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
2164b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            ANativeWindow* window);
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2180696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2200696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
224cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
225e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
226cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
227cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
232df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2338d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
235e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
2374b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    ANativeWindow*   nativeWindow;
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
241240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t*          blitengine;
242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
244e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
276240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
277240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
278240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
310240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    struct region_iterator : public copybit_region_t {
328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator(const Region& region)
329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            : b(region.begin()), e(region.end()) {
330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            this->next = iterate;
331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    private:
333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (me->b != me->e) {
336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                return 1;
338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            return 0;
340240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
341240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        mutable Region::const_iterator b;
342240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator const e;
343240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    };
344240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
348240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
349df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
3574b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn        ANativeWindow* window)
3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
359df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
360240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    blitengine(0), bits(NULL)
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
366240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
367240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_open(pModule, &blitengine);
368240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
369240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
370df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
371df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
372df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
377076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (blitengine) {
387cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        copybit_close(blitengine);
388cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
389cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
390cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
391cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
392cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3935221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3945221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3955221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3965221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
398cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
399cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
400cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
401df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
402df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
405cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
406076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
407076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
411cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
414076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
416076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4180926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
419e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
423240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
424df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
425cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
426df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
427df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
428cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
429e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
431e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
432e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4339648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
434e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
435e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
436e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
442cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
443cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
444cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
445cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
446cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
448076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
450e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
452bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err;
453695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
454695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->lock(module, buf->handle,
455695b66f082033d618ce19ee289d858130bd5420bMathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
456695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
462cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
463bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err = NO_ERROR;
464695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
465695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->unlock(module, buf->handle);
466695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
470df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
473240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
474df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
476df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
478240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    status_t err = NO_ERROR;
479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t* const copybit = blitengine;
480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (copybit)  {
481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t simg;
482a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist        simg.w = src->stride;
483240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.h = src->height;
484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.format = src->format;
485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t dimg;
488a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist        dimg.w = dst->stride;
489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.h = dst->height;
490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.format = dst->format;
491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator it(clip);
497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        if (err != NO_ERROR) {
499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            LOGE("copybit failed (%s)", strerror(err));
500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
5020926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (!copybit || err) {
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator cur = clip.begin();
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator end = clip.end();
506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t dbpr = dst->stride * bpp;
509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t sbpr = src->stride * bpp;
510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        while (cur != end) {
515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Rect& r(*cur++);
516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t w = r.right - r.left;
517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t h = r.bottom - r.top;
518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (w <= 0 || h<=0) continue;
519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            size_t size = w * bpp;
520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (dbpr==sbpr && size==sbpr) {
523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                size *= h;
524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                h = 1;
525240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
526240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            do {
527240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                memcpy(d, s, size);
528240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                d += dbpr;
529240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                s += sbpr;
530240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            } while (--h > 0);
531df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
532076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
537cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
538cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
539cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
540cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
541df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
543df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
544df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
545df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
546df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
54872c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // This was const Region copyBack, but that causes an
54972c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // internal compile error on simulator builds
55072c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
551df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
553df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
554240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
555240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
556240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
557df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
559df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
560df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
567df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
570df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
572df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
573076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
574df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
575031213e5b31c317135f603271333949dda89e01eMathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) {
576031213e5b31c317135f603271333949dda89e01eMathias Agopian
577031213e5b31c317135f603271333949dda89e01eMathias Agopian        // TODO: lockBuffer should rather be executed when the very first
578031213e5b31c317135f603271333949dda89e01eMathias Agopian        // direct rendering occurs.
579031213e5b31c317135f603271333949dda89e01eMathias Agopian        nativeWindow->lockBuffer(nativeWindow, buffer);
580031213e5b31c317135f603271333949dda89e01eMathias Agopian
581031213e5b31c317135f603271333949dda89e01eMathias Agopian        // reallocate the depth-buffer if needed
582031213e5b31c317135f603271333949dda89e01eMathias Agopian        if ((width != buffer->width) || (height != buffer->height)) {
583031213e5b31c317135f603271333949dda89e01eMathias Agopian            // TODO: we probably should reset the swap rect here
584031213e5b31c317135f603271333949dda89e01eMathias Agopian            // if the window size has changed
585031213e5b31c317135f603271333949dda89e01eMathias Agopian            width = buffer->width;
586031213e5b31c317135f603271333949dda89e01eMathias Agopian            height = buffer->height;
587031213e5b31c317135f603271333949dda89e01eMathias Agopian            if (depth.data) {
588031213e5b31c317135f603271333949dda89e01eMathias Agopian                free(depth.data);
589031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.width   = width;
590031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.height  = height;
591031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.stride  = buffer->stride;
592031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
593031213e5b31c317135f603271333949dda89e01eMathias Agopian                if (depth.data == 0) {
594031213e5b31c317135f603271333949dda89e01eMathias Agopian                    setError(EGL_BAD_ALLOC, EGL_FALSE);
595031213e5b31c317135f603271333949dda89e01eMathias Agopian                    return EGL_FALSE;
596031213e5b31c317135f603271333949dda89e01eMathias Agopian                }
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
599df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
600031213e5b31c317135f603271333949dda89e01eMathias Agopian        // keep a reference on the buffer
601031213e5b31c317135f603271333949dda89e01eMathias Agopian        buffer->common.incRef(&buffer->common);
602031213e5b31c317135f603271333949dda89e01eMathias Agopian
603031213e5b31c317135f603271333949dda89e01eMathias Agopian        // finally pin the buffer down
604031213e5b31c317135f603271333949dda89e01eMathias Agopian        if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
605031213e5b31c317135f603271333949dda89e01eMathias Agopian                GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
606031213e5b31c317135f603271333949dda89e01eMathias Agopian            LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
607031213e5b31c317135f603271333949dda89e01eMathias Agopian                    buffer, buffer->width, buffer->height);
608031213e5b31c317135f603271333949dda89e01eMathias Agopian            return setError(EGL_BAD_ACCESS, EGL_FALSE);
609031213e5b31c317135f603271333949dda89e01eMathias Agopian            // FIXME: we should make sure we're not accessing the buffer anymore
610031213e5b31c317135f603271333949dda89e01eMathias Agopian        }
611031213e5b31c317135f603271333949dda89e01eMathias Agopian    } else {
612031213e5b31c317135f603271333949dda89e01eMathias Agopian        return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
632e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
6370a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
647e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
648076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
652076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
659076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
661df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
662df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
663df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
664df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
665df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
666df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
667df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
668df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
669df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
670df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
671df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
672df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
673df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
674df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
675df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
676df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
677076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6910696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7540696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
785076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
837639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    static bool ignore(GLint reqValue, GLint confValue) {
838639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        return true;
839639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    }
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
847141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.2.0";
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
850e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
853df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
9008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
9018d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
9028d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
9038d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
9048d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
9058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
908076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
919076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
93456fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
9350985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
9360985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
9370985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
93856fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
9390985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 0                                 }
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
954d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
966d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,       0 },
9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        6 },
979d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
9858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,      16 },
9908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        7 },
991d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs
9968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
9978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
10046af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
1016d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs
10218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
1029d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
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
10338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
10416af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
10538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1067639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::ignore   },
1068639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::ignore   },
1069639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::ignore   },
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1071639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_NATIVE_VISUAL_ID,           config_management_t::ignore   },
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10840985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
10850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
10870985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
10880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10910985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10930985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // attributes that are not specified are simply ignored, if a particular
10940985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // one needs not be ignored, it must be specified here, eg:
10950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{
11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    switch(configID) {
11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 0:
11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 1:
11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 2:
11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 3:
11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 4:
11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 5:
11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 6:
11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 7:
11338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    default:
11378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        return NAME_NOT_FOUND;
11388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    }
11398b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    return NO_ERROR;
11408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}
11418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
11428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ----------------------------------------------------------------------------
11438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1149076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1163076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1169076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
118197640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell        if (cfgMgtIndex >= 0) {
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
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        }
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12764b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    if (static_cast<ANativeWindow*>(window)->common.magic !=
12770696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12780696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12790696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12800696a572294bbaa977245afb630065de3278473bMathias Agopian
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12994b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            static_cast<ANativeWindow*>(window));
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13010696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13250696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
13260696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
13270696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
13280696a572294bbaa977245afb630065de3278473bMathias Agopian    }
13290696a572294bbaa977245afb630065de3278473bMathias Agopian
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13470696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1368076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13900696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1425076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1433076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1436076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1495749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1496749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1497749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1498749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1500749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
150104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        /*
150204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * A NULL attrib_list should be treated as though it was an empty
150304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * one (terminated with EGL_NONE) as defined in
150404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * section 3.4.1 "Querying Configurations" in the EGL specification.
150504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         */
150604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        static const EGLint dummy = EGL_NONE;
150704aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        attrib_list = &dummy;
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1509076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
15170985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
15270985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
15280985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        // see if this attribute was specified, if not, apply its
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1532dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
15350985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1553749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1554749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1555749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1556749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1557749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1558749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1559749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1560749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1561749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1562749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1563749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
16100696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1614e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1615e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1616e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1617e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1618e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
16300696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
16310696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1680076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, 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    egl_context_t* c = egl_context_t::context(ctx);
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
17240696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17250696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
17260696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
17270696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17280696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
17290696a572294bbaa977245afb630065de3278473bMathias Agopian    }
17300696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
17310696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
17320696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17330696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17360696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1740076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1756e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1767e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17690696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17700696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1774e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1777e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1778e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1792cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1793cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1794cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1799e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1810e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
18119648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1813e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1814e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1815e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
18169648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1817e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1818e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1819e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18930696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18940696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1984551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen    return EGL_TRUE;
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20738dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
20748dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    switch (native_buffer->format) {
20758dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
20768dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
20778dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
20788dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
20798dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
20808dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_5551:
20818dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_4444:
20828dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            break;
20838dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        default:
20848dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20858dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    }
20868dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2109df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2110df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2111df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2112df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2113df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2114df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2115df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2116df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2117df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2118df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2119df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2120df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21210696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21220696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2123df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2124df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2125df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2126df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2127df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2128df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2129df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2130df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2131