egl.cpp revision 0696a572294bbaa977245afb630065de3278473b
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
44240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h>
45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
1440696a572294bbaa977245afb630065de3278473bMathias Agopian                bool    isValid() const;
1450696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool    initCheck() const = 0;
146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
149cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
159df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
1608d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer getRenderBuffer() const;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1790696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const {
1800696a572294bbaa977245afb630065de3278473bMathias Agopian    LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
1810696a572294bbaa977245afb630065de3278473bMathias Agopian    return magic == MAGIC;
1820696a572294bbaa977245afb630065de3278473bMathias Agopian}
1830696a572294bbaa977245afb630065de3278473bMathias Agopian
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
2048d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const {
2058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return 0;
2068d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
212076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            android_native_window_t* window);
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2170696a572294bbaa977245afb630065de3278473bMathias Agopian    ~egl_window_surface_v2_t();
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2190696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
223cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
224e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
225cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
226cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
231df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2328d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer  getRenderBuffer() const;
2338d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
235e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t*   nativeWindow;
238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
241240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t*          blitengine;
242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
244e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
276240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
277240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
278240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
310240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    struct region_iterator : public copybit_region_t {
328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator(const Region& region)
329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            : b(region.begin()), e(region.end()) {
330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            this->next = iterate;
331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    private:
333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (me->b != me->e) {
336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                return 1;
338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            return 0;
340240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
341240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        mutable Region::const_iterator b;
342240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator const e;
343240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    };
344240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
348240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
349df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window)
3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
359df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
360240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    blitengine(0), bits(NULL)
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
366240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
367240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_open(pModule, &blitengine);
368240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
369240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
370df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
371df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
372df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
377076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (blitengine) {
387cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        copybit_close(blitengine);
388cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
389cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
390cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
391cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
392cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
3935221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    // we're intending to do software rendering
3945221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    native_window_set_usage(nativeWindow,
3955221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3965221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
398cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
399cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
400cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
401df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
402df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
405cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
406076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
407076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
411cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
414076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
416076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4180926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
419e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
423240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
424df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
425cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
426df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
427df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
428cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
429e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
431e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
432e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4339648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
434e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
435e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
436e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
442cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
443cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
444cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
445cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
446cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
448076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
450e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
45221c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->lock(module, buf->handle,
453e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
4540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4550926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
459cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
46021c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->unlock(module, buf->handle);
4610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
464df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
465df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
466df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
467240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
468df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
469df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
470df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
472240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    status_t err = NO_ERROR;
473240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t* const copybit = blitengine;
474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (copybit)  {
475240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t simg;
476240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.w = src->width;
477240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.h = src->height;
478240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.format = src->format;
479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t dimg;
482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.w = dst->width;
483240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.h = dst->height;
484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.format = dst->format;
485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator it(clip);
491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        if (err != NO_ERROR) {
493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            LOGE("copybit failed (%s)", strerror(err));
494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
4960926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (!copybit || err) {
498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator cur = clip.begin();
499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator end = clip.end();
500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t dbpr = dst->stride * bpp;
503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t sbpr = src->stride * bpp;
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        while (cur != end) {
509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Rect& r(*cur++);
510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t w = r.right - r.left;
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t h = r.bottom - r.top;
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (w <= 0 || h<=0) continue;
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            size_t size = w * bpp;
514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (dbpr==sbpr && size==sbpr) {
517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                size *= h;
518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                h = 1;
519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            do {
521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                memcpy(d, s, size);
522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                d += dbpr;
523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                s += sbpr;
524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            } while (--h > 0);
525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
526076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
529076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
531cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
532cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
533cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
534cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
535df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
536df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
537df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
538df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
539df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
540df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
541df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
543df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
544df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
545df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
546240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
547240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
548240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
549df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
550df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
551df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
553df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
554df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
555076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
557df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
559df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
568df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
573df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // reallocate the depth-buffer if needed
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        width = buffer->width;
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        height = buffer->height;
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.width   = width;
582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.height  = height;
583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.stride  = buffer->stride;
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
586df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
591df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
592df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
593df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer->common.incRef(&buffer->common);
594df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
595df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // finally pin the buffer down
596df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
597df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
598df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
599df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
600cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
601df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
602df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
603df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
604df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
605df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
606df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
607df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
608df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
609df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6148d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
6158d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
6168d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return buffer;
6178d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
6188d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
6228d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // Hardware supported
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (format) {
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
6258d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_8888:
6268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_4444:
6278d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_5551:
6288d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_BGRA_8888:
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return true;
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
6318d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return false;
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
642e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
6470a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
648076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
6490a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian    gl->copybits.drawSurfaceBuffer = 0;
650f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian    if (gl->copybits.blitEngine != NULL) {
651f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian        if (supportedCopybitsDestinationFormat(buffer.format)) {
652f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian            buffer_handle_t handle = this->buffer->handle;
653f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian            if (handle != NULL) {
6540a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian                gl->copybits.drawSurfaceBuffer = handle;
655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
656076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
6590a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
662076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
666076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
668076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
669e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
677076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
680076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
681076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
683df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
684df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
685df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
686df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
687df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
688df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
689df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
690df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
691df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
692df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
693df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
694df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
695df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
696df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
697df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
698df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
699076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7130696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.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 nativePixmap.width;  }
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7760696a572294bbaa977245afb630065de3278473bMathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
868e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
871df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
8728d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        "EGL_ANDROID_get_render_buffer "
873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
900076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
901076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
902076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
904076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
905076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
906076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
907076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
908076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
909076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
910076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
911076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
912076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
913076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
914076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
915076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
916076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
917076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
918076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
9198d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
9208d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
9218d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
9228d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
9238d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
9248d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
9258d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglGetRenderBufferANDROID",
9268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
929076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
940076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12040696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<android_native_window_t*>(window)->common.magic !=
12050696a572294bbaa977245afb630065de3278473bMathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
12060696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
12070696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12080696a572294bbaa977245afb630065de3278473bMathias Agopian
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1229076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1233076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1250076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1251076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
1252076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            static_cast<android_native_window_t*>(window));
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12540696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12780696a572294bbaa977245afb630065de3278473bMathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
12790696a572294bbaa977245afb630065de3278473bMathias Agopian            sizeof(egl_native_pixmap_t)) {
12800696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
12810696a572294bbaa977245afb630065de3278473bMathias Agopian    }
12820696a572294bbaa977245afb630065de3278473bMathias Agopian
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1291076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1295076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1299076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1307076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1311076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13250696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1346076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1375076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13930696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->initCheck()) {
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1428076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1436076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1439076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1498749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1499749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1500749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1501749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1503749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1507076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1530dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1549749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1550749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1553749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1554749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1555749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1556749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1557749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1558749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1559749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1560749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1561749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
16080696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!surface->isValid())
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1612e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1613e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1614e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1615e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1616e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
16280696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!surface->isValid())
16290696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1678076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
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_NO_SURFACE);
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
17220696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17230696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
17240696a572294bbaa977245afb630065de3278473bMathias Agopian        if (s->dpy != dpy)
17250696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17260696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that draw is compatible with the context
17270696a572294bbaa977245afb630065de3278473bMathias Agopian    }
17280696a572294bbaa977245afb630065de3278473bMathias Agopian    if (read && read!=draw) {
17290696a572294bbaa977245afb630065de3278473bMathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
17300696a572294bbaa977245afb630065de3278473bMathias Agopian        if (!s->isValid())
17310696a572294bbaa977245afb630065de3278473bMathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17340696a572294bbaa977245afb630065de3278473bMathias Agopian        // TODO: check that read is compatible with the context
1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1754e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1765e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
17670696a572294bbaa977245afb630065de3278473bMathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
17680696a572294bbaa977245afb630065de3278473bMathias Agopian                s->disconnect();
1769e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1770e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1776e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1790cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1791cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1792cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1797e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1808e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
18099648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1810e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1811e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1813e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
18149648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1815e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1816e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1817e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
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);
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18910696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
18920696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20718b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2074076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2081076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2086076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2094df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2095df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2096df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2097df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2098df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2099df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2100df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2101df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2102df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2103df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2104df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2105df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21060696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21070696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
2108df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2109df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2110df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2111df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2112df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2113df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2114df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2115df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
21168d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
21178d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
21188d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
21198d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
21208d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
21218d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
21228d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
21230696a572294bbaa977245afb630065de3278473bMathias Agopian    if (!d->isValid())
21240696a572294bbaa977245afb630065de3278473bMathias Agopian        return setError(EGL_BAD_SURFACE, (EGLClientBuffer)0);
21258d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (d->dpy != dpy)
21268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
21278d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
21288d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // post the surface
21298d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return d->getRenderBuffer();
21308d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
2131