egl.cpp revision 749c63dbff0ab66223f30af1bad4ca56bd26d5d2
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License Version 2.0(the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 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#define LOG_TAG "EGL"
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool    isValid() const = 0;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const = 0;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_window_surface_t : public egl_surface_t
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_window_surface_t(
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_window_t* window);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     ~egl_window_surface_t();
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool        isValid() const { return nativeWindow->magic == 0x600913; }
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativeWindow->width;  }
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativeWindow->height; }
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_window_t*    nativeWindow;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_window_surface_t::egl_window_surface_t(EGLDisplay dpy,
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_window_t* window)
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativeWindow(window)
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = window->width;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = window->height;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    nativeWindow->incRef(nativeWindow);
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_window_surface_t::~egl_window_surface_t() {
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    nativeWindow->decRef(nativeWindow);
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_window_surface_t::swapBuffers()
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags = nativeWindow->swapBuffers(nativeWindow);
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & EGL_NATIVES_FLAG_SIZE_CHANGED) {
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.width   = nativeWindow->width;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.height  = nativeWindow->height;
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.stride  = nativeWindow->stride;
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_window_surface_t::bindDrawSurface(ogles_context_t* gl)
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativeWindow->width;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativeWindow->height;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativeWindow->stride;
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = (GGLubyte*)nativeWindow->base + nativeWindow->offset;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativeWindow->format;
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_window_surface_t::bindReadSurface(ogles_context_t* gl)
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativeWindow->width;
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativeWindow->height;
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativeWindow->stride;
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = (GGLubyte*)nativeWindow->base + nativeWindow->offset;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativeWindow->format;
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* egl_window_surface_t::getBits() const {
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (GGLubyte*)nativeWindow->base + nativeWindow->offset;
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_window_surface_t::getHorizontalResolution() const {
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_window_surface_t::getVerticalResolution() const {
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_window_surface_t::getRefreshRate() const {
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->fps * EGL_DISPLAY_SCALING);
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_window_surface_t::getSwapBehavior() const {
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t flags = nativeWindow->flags;
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & EGL_NATIVES_FLAG_DESTROY_BACKBUFFER)
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_BUFFER_DESTROYED;
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const     { return nativePixmap.data; }
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool        isValid() const { return pbuffer.data != 0; }
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     void*       getBits() const     { return pbuffer.data; }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gExtensionsString = "";
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexsOES",              (void(*)())&glDrawTexsOES },
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexiOES",              (void(*)())&glDrawTexiOES },
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexfOES",              (void(*)())&glDrawTexfOES },
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexxOES",              (void(*)())&glDrawTexxOES },
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexsvOES",             (void(*)())&glDrawTexsvOES },
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexivOES",             (void(*)())&glDrawTexivOES },
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexfvOES",             (void(*)())&glDrawTexfvOES },
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDrawTexxvOES",             (void(*)())&glDrawTexxvOES },
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glQueryMatrixxOES",          (void(*)())&glQueryMatrixxOES },
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glClipPlanef",               (void(*)())&glClipPlanef },
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glClipPlanex",               (void(*)())&glClipPlanex },
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glBindBuffer",               (void(*)())&glBindBuffer },
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glBufferData",               (void(*)())&glBufferData },
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glBufferSubData",            (void(*)())&glBufferSubData },
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glDeleteBuffers",            (void(*)())&glDeleteBuffers },
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    { "glGenBuffers",               (void(*)())&glGenBuffers },
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       if (key > sortedArray[mid].key) {
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else if (key < sortedArray[mid].key) {
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    config_pair_t const* configFound = gConfigs[i].array;
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        configFound = config_base_attribute_list;
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 0:
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_window_surface_t(dpy, config, depthFormat,
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_window_t*>(window));
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 0:
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 0:
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pixelFormat = GGL_PIXEL_FORMAT_A_8;
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1058749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1059749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1060749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1061749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1063749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, numAttributes,
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1109749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1110749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1111749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1112749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1113749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1114749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1115749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1116749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1117749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1118749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1119749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1120749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1121749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getSwapBehavior();
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: check that draw and read are compatible with the context
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // once of the surface is bound to a context in another thread
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->read = read;
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (d) d->ctx = EGL_NO_CONTEXT;
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (r) r->ctx = EGL_NO_CONTEXT;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Android extensions
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1556