egl.cpp revision 444839b842798497cfa326204285a4f2ca2362af
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
335f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian#include <ui/ANativeObjectBase.h>
34d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis#include <ui/Fence.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
525f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian// ----------------------------------------------------------------------------
534b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
544b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
554b9511c16195a646242eff833b0af212933b6ecaMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height);
564b9511c16195a646242eff833b0af212933b6ecaMathias Agopian
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
595f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
81444839b842798497cfa326204285a4f2ca2362afColin Cross    pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)error);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
88444839b842798497cfa326204285a4f2ca2362afColin Cross    GLint error = (GLint)(uintptr_t)pthread_getspecific(gEGLErrorKey);
892076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    if (error == 0) {
902076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // The TLS key has been created by another thread, but the value for
912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        // this thread has not been initialized.
922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis        return EGL_SUCCESS;
932076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis    }
94444839b842798497cfa326204285a4f2ca2362afColin Cross    pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)EGL_SUCCESS);
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
15078141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall    bool                zombie;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1540696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1550696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() const = 0;
156076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
159cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
160e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
169df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
17778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall    : magic(MAGIC), dpy(dpy), config(config), ctx(0), zombie(false)
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1880696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
189e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1900696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1910696a572294bbaa977245afb630065de3278473bMathias Agopian}
1920696a572294bbaa977245afb630065de3278473bMathias Agopian
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
208df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
211df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
2214b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            ANativeWindow* window);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2230696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2250696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
229cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
230e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
231cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
232cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
237df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2388d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
240697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr);
241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    status_t unlock(ANativeWindowBuffer* buf);
2424b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    ANativeWindow*   nativeWindow;
243697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer*   buffer;
244697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer*   previousBuffer;
2450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
248e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
2689d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block            ALOGD("%s { %5d, %5d, w=%5d, h=%5d }",
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
280240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
281240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
282240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
292df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
293df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
308240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
309240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
310240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
314240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
330df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
331df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
332697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev            ANativeWindowBuffer* dst, void* dst_vaddr,
333697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev            ANativeWindowBuffer* src, void const* src_vaddr,
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
335df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
336df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
337df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
3434b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn        ANativeWindow* window)
3440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
3469cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    bits(NULL)
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
34869e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    hw_module_t const* pModule;
34969e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
35069e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
35169e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian
352df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
353df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
354df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
356cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
357cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
366cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
367cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
368cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
370cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
371cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3725221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3735221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3745221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3755221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
376df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
377d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    int fenceFd = -1;
378d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer,
379d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis            &fenceFd) != NO_ERROR) {
380d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        return setError(EGL_BAD_ALLOC, EGL_FALSE);
381d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    }
382d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis
383d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    // wait for the buffer
384d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    sp<Fence> fence(new Fence(fenceFd));
385d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    if (fence->wait(Fence::TIMEOUT_NEVER) != NO_ERROR) {
386d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd);
387cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
388cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
389df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
390df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
393cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
395076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
399cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
403df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
405df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
406df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
407df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
408df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
409e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        ALOGE("connect() failed to lock buffer %p (%ux%u)",
410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
411cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
414cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
415e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
416e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
417e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
418e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4199648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
421e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
423cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
4245f555569e757d280f707e2587b3d154c9d8c872fJesse Hall        nativeWindow->cancelBuffer(nativeWindow, buffer, -1);
425cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
426cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
427cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
433076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
435697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* buf, int usage, void** vaddr)
4360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
437bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err;
438695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
439695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->lock(module, buf->handle,
440695b66f082033d618ce19ee289d858130bd5420bMathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
441695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
445697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf)
4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
447cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
448bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian    int err = NO_ERROR;
449695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
450695b66f082033d618ce19ee289d858130bd5420bMathias Agopian    err = module->unlock(module, buf->handle);
451695b66f082033d618ce19ee289d858130bd5420bMathias Agopian
4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
456697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* dst, void* dst_vaddr,
457697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev        ANativeWindowBuffer* src, void const* src_vaddr,
458240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
459df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
460df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    Region::const_iterator cur = clip.begin();
4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    Region::const_iterator end = clip.end();
4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t bpp = pixelFormatTable[src->format].size;
4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t dbpr = dst->stride * bpp;
4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    const size_t sbpr = src->stride * bpp;
4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian
4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian    while (cur != end) {
4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        const Rect& r(*cur++);
4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        ssize_t w = r.right - r.left;
4759cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        ssize_t h = r.bottom - r.top;
4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        if (w <= 0 || h<=0) continue;
4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        size_t size = w * bpp;
4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        if (dbpr==sbpr && size==sbpr) {
4819cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            size *= h;
4829cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            h = 1;
483df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
4849cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        do {
4859cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            memcpy(d, s, size);
4869cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            d += dbpr;
4879cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian            s += sbpr;
4889cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian        } while (--h > 0);
489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
494cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
495cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
496cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
497cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
498df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
499df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
501df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
502df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
503df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
50572c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // This was const Region copyBack, but that causes an
50672c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            // internal compile error on simulator builds
50772c384e0a16504638927fea2da36a4731953c8dfKristian Monsen            /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
517df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
525076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5260926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
528d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    nativeWindow->queueBuffer(nativeWindow, buffer, -1);
529df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
531df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
532d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    int fenceFd = -1;
533d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) {
534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        sp<Fence> fence(new Fence(fenceFd));
535d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        if (fence->wait(Fence::TIMEOUT_NEVER)) {
536d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis            nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd);
537d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis            return setError(EGL_BAD_ALLOC, EGL_FALSE);
538d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        }
539031213e5b31c317135f603271333949dda89e01eMathias Agopian
540031213e5b31c317135f603271333949dda89e01eMathias Agopian        // reallocate the depth-buffer if needed
541031213e5b31c317135f603271333949dda89e01eMathias Agopian        if ((width != buffer->width) || (height != buffer->height)) {
542031213e5b31c317135f603271333949dda89e01eMathias Agopian            // TODO: we probably should reset the swap rect here
543031213e5b31c317135f603271333949dda89e01eMathias Agopian            // if the window size has changed
544031213e5b31c317135f603271333949dda89e01eMathias Agopian            width = buffer->width;
545031213e5b31c317135f603271333949dda89e01eMathias Agopian            height = buffer->height;
546031213e5b31c317135f603271333949dda89e01eMathias Agopian            if (depth.data) {
547031213e5b31c317135f603271333949dda89e01eMathias Agopian                free(depth.data);
548031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.width   = width;
549031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.height  = height;
550031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.stride  = buffer->stride;
551031213e5b31c317135f603271333949dda89e01eMathias Agopian                depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
552031213e5b31c317135f603271333949dda89e01eMathias Agopian                if (depth.data == 0) {
553031213e5b31c317135f603271333949dda89e01eMathias Agopian                    setError(EGL_BAD_ALLOC, EGL_FALSE);
554031213e5b31c317135f603271333949dda89e01eMathias Agopian                    return EGL_FALSE;
555031213e5b31c317135f603271333949dda89e01eMathias Agopian                }
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
559031213e5b31c317135f603271333949dda89e01eMathias Agopian        // keep a reference on the buffer
560031213e5b31c317135f603271333949dda89e01eMathias Agopian        buffer->common.incRef(&buffer->common);
561031213e5b31c317135f603271333949dda89e01eMathias Agopian
562031213e5b31c317135f603271333949dda89e01eMathias Agopian        // finally pin the buffer down
563031213e5b31c317135f603271333949dda89e01eMathias Agopian        if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
564031213e5b31c317135f603271333949dda89e01eMathias Agopian                GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
565e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
566031213e5b31c317135f603271333949dda89e01eMathias Agopian                    buffer, buffer->width, buffer->height);
567031213e5b31c317135f603271333949dda89e01eMathias Agopian            return setError(EGL_BAD_ACCESS, EGL_FALSE);
568031213e5b31c317135f603271333949dda89e01eMathias Agopian            // FIXME: we should make sure we're not accessing the buffer anymore
569031213e5b31c317135f603271333949dda89e01eMathias Agopian        }
570031213e5b31c317135f603271333949dda89e01eMathias Agopian    } else {
571031213e5b31c317135f603271333949dda89e01eMathias Agopian        return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
572df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
573df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
574df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
575df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
577df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
579df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
591e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
5960a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
606e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
623df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
626df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
627df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
628df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
629df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
630df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
631df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
632df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
633df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
634df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
635df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6500696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
684076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7130696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
734e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("incompatible pixel format for pbuffer (format=%d)", f);
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
796639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    static bool ignore(GLint reqValue, GLint confValue) {
797639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        return true;
798639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian    }
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
806141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.2.0";
807cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString  = "OpenGL_ES";
808076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
80983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        "EGL_KHR_fence_sync "
810e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
811076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
813df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
856076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8608d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
8618d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
8628d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
8638d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
86483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglCreateSyncKHR",
86583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR },
86683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglDestroySyncKHR",
86783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR },
86883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglClientWaitSyncKHR",
86983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR },
87083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    { "eglGetSyncAttribKHR",
87183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR },
8728d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
8738d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
90256fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
9030985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
9040985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
9050985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
90656fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
9070985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 0                                 }
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
922d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
934d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 },
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,       0 },
9468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        6 },
947d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9498b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9508b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9518b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
9528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
9538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_ALPHA_SIZE,       0 },
9548b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BLUE_SIZE,        8 },
9558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_GREEN_SIZE,       8 },
9568b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_RED_SIZE,         8 },
9578b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_DEPTH_SIZE,      16 },
9588b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_CONFIG_ID,        7 },
959d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 },
9608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian};
9628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
9638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs
9648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { EGL_BUFFER_SIZE,     32 },
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
9726af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
984d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 },
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs
9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
997d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
10096af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian        { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 },
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
10218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1035639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::ignore   },
1036639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::ignore   },
1037639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::ignore   },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1039639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian        { EGL_NATIVE_VISUAL_ID,           config_management_t::ignore   },
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10520985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
10530985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
10540985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
10550985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
10560985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10590985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10610985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // attributes that are not specified are simply ignored, if a particular
10620985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // one needs not be ignored, it must be specified here, eg:
10630985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
10698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
10708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{
10718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    switch(configID) {
10728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 0:
10738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 1:
10778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
10788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 2:
10818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
10828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 3:
10858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
10868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 4:
10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 5:
10938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
10948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 6:
10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = 0;
10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    case 7:
11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        break;
11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    default:
11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian        return NAME_NOT_FOUND;
11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    }
11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    return NO_ERROR;
11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}
11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ----------------------------------------------------------------------------
11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1137076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
114997640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell        if (cfgMgtIndex >= 0) {
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1204444839b842798497cfa326204285a4f2ca2362afColin Cross    int index = (int)(uintptr_t)config;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12444b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn    if (static_cast<ANativeWindow*>(window)->common.magic !=
12450696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12460696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12470696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12480696a572294bbaa977245afb630065de3278473bMathias Agopian
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
12558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1266076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12674b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn            static_cast<ANativeWindow*>(window));
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12690696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12930696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
12940696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
12950696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
12960696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12970696a572294bbaa977245afb630065de3278473bMathias Agopian
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13150696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
13438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13580696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1451444839b842798497cfa326204285a4f2ca2362afColin Cross        *configs++ = (EGLConfig)(uintptr_t)i;
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1463749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1464749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1465749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1466749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1468749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
146904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        /*
147004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * A NULL attrib_list should be treated as though it was an empty
147104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * one (terminated with EGL_NONE) as defined in
147204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         * section 3.4.1 "Querying Configurations" in the EGL specification.
147304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian         */
147404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        static const EGLint dummy = EGL_NONE;
147504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian        attrib_list = &dummy;
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1477076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
14850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
14950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
14960985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian        // see if this attribute was specified, if not, apply its
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1500dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
15030985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1519749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1520749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1521749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1522444839b842798497cfa326204285a4f2ca2362afColin Cross                    *configs++ = (EGLConfig)(uintptr_t)i;
1523749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1524749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1525749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1526749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1527749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1528749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1529749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1530749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1531749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
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    if (eglSurface != EGL_NO_SURFACE) {
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
15780696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1582e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
158378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall            // defer disconnect/delete until no longer current
158478141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall            surface->zombie = true;
158578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall        } else {
1586e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
158778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall            delete surface;
1588e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
15990696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
16000696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
16930696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
16940696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
16950696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
16960696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16970696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
16980696a572294bbaa977245afb630065de3278473bMathias Agopian    }
16990696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
17000696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
17010696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17020696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17050696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1709076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1725e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1736e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1737e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17380696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17390696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
174078141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                s->ctx = EGL_NO_CONTEXT;
174178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                if (s->zombie)
174278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                    delete s;
1743e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1744e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1745e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1746e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1747e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1749e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1750e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1764cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1765cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1766cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1782e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
17839648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1784e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
178578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                    d->ctx = EGL_NO_CONTEXT;
178678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                    if (d->zombie)
178778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall                        delete d;
1788e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1789e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
17909648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1791e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1792e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1793e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18670696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18680696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
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: eglSwapInterval()
1958551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen    return EGL_TRUE;
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2015076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2022076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2023076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2025076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2029076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2031076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2033076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2040697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer;
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2045697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    if (native_buffer->common.version != sizeof(ANativeWindowBuffer))
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20478dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
20488dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    switch (native_buffer->format) {
20498dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
20508dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
20518dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
20528dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
20538dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
20548dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            break;
20558dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian        default:
20568dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20578dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian    }
20588dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2069697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img;
2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2074697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    if (native_buffer->common.version != sizeof(ANativeWindowBuffer))
2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2081df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2082df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
208383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync
208483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ----------------------------------------------------------------------------
208583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
208683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE)
208783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
208883e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type,
208983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        const EGLint *attrib_list)
209083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
209183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
209283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR);
209383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
209483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
209583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (type != EGL_SYNC_FENCE_KHR ||
209683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall            (attrib_list != NULL && attrib_list[0] != EGL_NONE)) {
209783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR);
209883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
209983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (eglGetCurrentContext() == EGL_NO_CONTEXT) {
210183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
210283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
210383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    // AGL is synchronous; nothing to do here.
210583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return FENCE_SYNC_HANDLE;
210783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
210883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
210983e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
211083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
211183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
211283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
211383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
211483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
211583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return EGL_TRUE;
211683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
211783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
211883e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags,
211983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        EGLTimeKHR timeout)
212083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
212183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
212283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
212383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    return EGL_CONDITION_SATISFIED_KHR;
212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
212883e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync,
212983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        EGLint attribute, EGLint *value)
213083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{
213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    if (sync != FENCE_SYNC_HANDLE) {
213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    switch (attribute) {
213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_TYPE_KHR:
213783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SYNC_FENCE_KHR;
213883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
213983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_STATUS_KHR:
214083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SIGNALED_KHR;
214183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
214283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    case EGL_SYNC_CONDITION_KHR:
214383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR;
214483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return EGL_TRUE;
214583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    default:
214683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall        return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
214783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall    }
214883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall}
214983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall
215083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ----------------------------------------------------------------------------
2151df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2152df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2153df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2154df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2155df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2156df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2157df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2158df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2159df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21610696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21620696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2163df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2164df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2165df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2166df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2167df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2168df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2169df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2170df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2171