egl.cpp revision cf81c84e43eb33931b950fa2c9b4c6f51afe7197
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License.
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h>
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h>
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h>
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h>
437189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian
44240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h>
45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h"
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl {
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gEGLErrorKey == -1)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return returnValue;
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() {
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_SUCCESS;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return error;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    NativeDisplayType   type;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile int32_t    initialized;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t {
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        IS_CURRENT      =   0x00010000,
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NEVER_CURRENT   =   0x00020000
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            flags;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          read;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLSurface          draw;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PAGE_FLIP = 0x00000001,
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        MAGIC     = 0x31415265
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t            magic;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLDisplay          dpy;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLConfig           config;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext          ctx;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     ~egl_surface_t();
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     bool    isValid() const = 0;
145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
148cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
149e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect() {}
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
158df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
1598d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer getRenderBuffer() const;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface              depth;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat)
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.version = sizeof(GGLSurface);
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.data = 0;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    depth.format = depthFormat;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t()
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    magic = 0;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(depth.data);
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_BUFFER_PRESERVED;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_FALSE;
197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
1988d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const {
1998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return 0;
2008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
206076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_window_surface_v2_t(
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            android_native_window_t* window);
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     ~egl_window_surface_v2_t();
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
217cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    virtual     EGLBoolean  connect();
218e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    virtual     void        disconnect();
219cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
220cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    virtual     EGLint      getHeight() const   { return height; }
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
225df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
2268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    virtual     EGLClientBuffer  getRenderBuffer() const;
2278d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
229e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
2300926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    status_t unlock(android_native_buffer_t* buf);
231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t*   nativeWindow;
232076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t*   buffer;
233df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    android_native_buffer_t*   previousBuffer;
2340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    gralloc_module_t const*    module;
235240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t*          blitengine;
236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int width;
237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int height;
238e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    void* bits;
239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    GGLFormat const* pixelFormatTable;
240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Rect {
242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect() { };
243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t w, int32_t h)
244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(0), top(0), right(w), bottom(h) { }
245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            : left(l), top(t), right(r), bottom(b) { }
247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect& andSelf(const Rect& r) {
248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            left   = max(left, r.left);
249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            top    = max(top, r.top);
250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            right  = min(right, r.right);
251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            bottom = min(bottom, r.bottom);
252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return *this;
253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return (left>=right || top>=bottom);
256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        void dump(char const* what) {
258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    what, left, top, right-left, bottom-top);
260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t left;
263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t top;
264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t right;
265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        int32_t bottom;
266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    struct Region {
269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        inline Region() : count(0) { }
270240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        typedef Rect const* const_iterator;
271240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator begin() const { return storage; }
272240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const_iterator end() const { return storage+count; }
273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Region reg;
275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            Rect* storage = reg.storage;
276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!lhs.isEmpty()) {
277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.top < rhs.top) { // top rect
278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->top    = lhs.top;
280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
281240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->bottom = rhs.top;
282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
284240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t top = max(lhs.top, rhs.top);
285240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
286240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                if (top < bot) {
287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = lhs.left;
289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = rhs.left;
291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->left   = rhs.right;
296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->top    = top;
297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->right  = lhs.right;
298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage->bottom = bot;
299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        storage++;
300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    }
301df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
302df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->left   = lhs.left;
304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    storage->top    = rhs.bottom;
305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->right  = lhs.right;
306df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage->bottom = lhs.bottom;
307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    storage++;
308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                reg.count = storage - reg.storage;
310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return reg;
312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        bool isEmpty() const {
314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            return count<=0;
315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    private:
317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        Rect storage[4];
318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        ssize_t count;
319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    };
320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
321240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    struct region_iterator : public copybit_region_t {
322240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator(const Region& region)
323240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            : b(region.begin()), e(region.end()) {
324240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            this->next = iterate;
325240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
326240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    private:
327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (me->b != me->e) {
330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                return 1;
332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            return 0;
334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        mutable Region::const_iterator b;
336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator const e;
337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    };
338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
339df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    void copyBlt(
340df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
342240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Region& clip);
343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
344df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect dirtyRegion;
345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    Rect oldDirtyRegion;
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
351076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        android_native_window_t* window)
3520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    : egl_surface_t(dpy, config, depthFormat),
353df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
354240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    blitengine(0), bits(NULL)
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3560926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_module_t const* pModule;
3570926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
360240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
361240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_open(pModule, &blitengine);
362240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
363240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
364df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
365df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the window
367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
368cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
370cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
372cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
373cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (blitengine) {
381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        copybit_close(blitengine);
382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian}
384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
385cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{
387df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a buffer
388cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
389cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
390cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
391df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
392df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // allocate a corresponding depth-buffer
393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    width = buffer->width;
394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    height = buffer->height;
395cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (depth.format) {
396076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.width   = width;
397076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        depth.height  = height;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
401cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
405df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
406076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer->common.incRef(&buffer->common);
407df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
4080926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    // Lock the buffer
409e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // pin the buffer down
411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
413240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
415cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
418cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    return EGL_TRUE;
419e71212ba5397387100a578d23b15862518a7a859Mathias Agopian}
420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
421e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{
4239648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian    if (buffer && bits) {
424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        bits = NULL;
425e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        unlock(buffer);
426e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    }
427cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    // enqueue the last frame
428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (buffer) {
430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer->common.decRef(&buffer->common);
431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        buffer = 0;
432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    if (previousBuffer) {
434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
435cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian        previousBuffer = 0;
436cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
438076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock(
440e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
4410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
44221c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->lock(module, buf->handle,
443e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
4470926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
4480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
449cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buf) return BAD_VALUE;
45021c59d0070fe24a8e04e52ce04d511a924a9932fMathias Agopian    int err = module->unlock(module, buf->handle);
4510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    return err;
4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
4530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
454df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt(
455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
457240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const Region& clip)
458df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
459df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // FIXME: use copybit if possible
460df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // NOTE: dst and src must be the same format
461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
462240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    status_t err = NO_ERROR;
463240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    copybit_device_t* const copybit = blitengine;
464240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (copybit)  {
465240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t simg;
466240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.w = src->width;
467240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.h = src->height;
468240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.format = src->format;
469240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
470240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
471240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit_image_t dimg;
472240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.w = dst->width;
473240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.h = dst->height;
474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.format = dst->format;
475240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
476240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
477240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
478240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        region_iterator it(clip);
481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        if (err != NO_ERROR) {
483240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            LOGE("copybit failed (%s)", strerror(err));
484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        }
485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    }
4860926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian    if (!copybit || err) {
488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator cur = clip.begin();
489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        Region::const_iterator end = clip.end();
490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t dbpr = dst->stride * bpp;
493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        const size_t sbpr = src->stride * bpp;
494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian
498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian        while (cur != end) {
499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            const Rect& r(*cur++);
500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t w = r.right - r.left;
501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            ssize_t h = r.bottom - r.top;
502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (w <= 0 || h<=0) continue;
503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            size_t size = w * bpp;
504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            if (dbpr==sbpr && size==sbpr) {
507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                size *= h;
508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                h = 1;
509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            }
510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            do {
511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                memcpy(d, s, size);
512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                d += dbpr;
513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                s += sbpr;
514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian            } while (--h > 0);
515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
521cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    if (!buffer) {
522cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
523cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian    }
524cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian
525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
526df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * Handle eglSetSwapRectangleANDROID()
527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * We copyback from the front buffer
528df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
529df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (!dirtyRegion.isEmpty()) {
530df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
531df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        if (previousBuffer) {
532df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
533df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            if (!copyBack.isEmpty()) {
534df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                void* prevBits;
535df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                if (lock(previousBuffer,
536240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
537240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    // copy from previousBuffer to buffer
538240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
539df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                    unlock(previousBuffer);
540df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                }
541df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            }
542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        }
543df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        oldDirtyRegion = dirtyRegion;
544df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
545076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
546df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (previousBuffer) {
547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        previousBuffer = 0;
549df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    unlock(buffer);
552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    previousBuffer = buffer;
553076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
554df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer = 0;
555076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // dequeue a new buffer
557076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    // direct rendering occurs.
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // reallocate the depth-buffer if needed
564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: we probably should reset the swap rect here
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the window size has changed
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        width = buffer->width;
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        height = buffer->height;
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data) {
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            free(depth.data);
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.width   = width;
572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.height  = height;
573076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            depth.stride  = buffer->stride;
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (depth.data == 0) {
576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return EGL_FALSE;
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
581df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
582df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // keep a reference on the buffer
583df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    buffer->common.incRef(&buffer->common);
584df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
585df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // finally pin the buffer down
586df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
587df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
588df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
589df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian                buffer, buffer->width, buffer->height);
590cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
591df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
592df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    }
593df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
594df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
595df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
596df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
597df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
598df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
599df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
600df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6048d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
6058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
6068d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return buffer;
6078d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
6088d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
6128d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // Hardware supported
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (format) {
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
6158d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_8888:
6168d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_4444:
6178d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_RGBA_5551:
6188d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    case HAL_PIXEL_FORMAT_BGRA_8888:
619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return true;
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
6218d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return false;
622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
632e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits;
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
6370a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
6390a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian    gl->copybits.drawSurfaceBuffer = 0;
640f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian    if (gl->copybits.blitEngine != NULL) {
641f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian        if (supportedCopybitsDestinationFormat(buffer.format)) {
642f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian            buffer_handle_t handle = this->buffer->handle;
643f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian            if (handle != NULL) {
6440a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian                gl->copybits.drawSurfaceBuffer = handle;
645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
648076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
6490a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
652076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
656076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.width   = this->buffer->width;
657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.height  = this->buffer->height;
658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.stride  = this->buffer->stride;
659e71212ba5397387100a578d23b15862518a7a859Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    buffer.format  = this->buffer->format;
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
664076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
671076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
673df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
674df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
675df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    /*
676df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
677df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * the content of the swapped buffer.
678df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
679df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
680df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
681df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
682df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
683df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * is, everything outside of this area is preserved.
684df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
685df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     * This implementation of EGL assumes the later case.
686df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     *
687df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian     */
688df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
689076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_BUFFER_DESTROYED;
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pixmap_surface_t(
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t depthFormat,
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_native_pixmap_t const * pixmap);
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
703076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config,
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t depthFormat,
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_native_pixmap_t const * pixmap)
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pixmap->width;
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pixmap->height;
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface buffer;
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.version = sizeof(GGLSurface);
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.width   = nativePixmap.width;
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.height  = nativePixmap.height;
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.stride  = nativePixmap.stride;
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.data    = nativePixmap.data;
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    buffer.format  = nativePixmap.format;
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_pbuffer_surface_t(
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int32_t w, int32_t h, int32_t f);
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
767076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GGLSurface  pbuffer;
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLConfig config, int32_t depthFormat,
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t w, int32_t h, int32_t f)
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = w*h;
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (f) {
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pbuffer.data = 0;
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.width   = w;
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.height  = h;
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.stride  = w;
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    pbuffer.format  = f;
797076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depthFormat) {
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.width   = pbuffer.width;
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.height  = pbuffer.height;
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.stride  = depth.width; // use the width here
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (depth.data == 0) {
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    free(pbuffer.data);
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t {
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint value;
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t {
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const config_pair_t* array;
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int                  size;
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t {
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint key;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (confValue & reqValue) == reqValue;
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString =
859e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian        "EGL_KHR_image_base "
860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        // "KHR_image_pixmap "
861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        "EGL_ANDROID_image_native_buffer "
862df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        "EGL_ANDROID_swap_rectangle "
8638d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        "EGL_ANDROID_get_render_buffer "
864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        ;
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t {
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const char * const name;
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsOES",
875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexiOES",
877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfOES",
879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxOES",
881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexsvOES",
883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexivOES",
885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexfvOES",
887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDrawTexxvOES",
889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glQueryMatrixxOES",
891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetTexture2DOES",
893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanef",
897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glClipPlanex",
899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
900076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBindBuffer",
901076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
902076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferData",
903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
904076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glBufferSubData",
905076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
906076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glDeleteBuffers",
907076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
908076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    { "glGenBuffers",
909076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
9108d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglCreateImageKHR",
9118d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
9128d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglDestroyImageKHR",
9138d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
9148d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglSetSwapRectangleANDROID",
9158d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
9168d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    { "eglGetRenderBufferANDROID",
9178d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
920076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted.
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification.
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      0                                 },
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
931076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        0 },
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         5 },
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        1 },
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        2 },
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         8 },
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        3 },
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        4 },
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,         0 },
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,        5 },
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = {
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T>
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   while (first <= last) {
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       int mid = (first + last) / 2;
1068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       if (key > sortedArray[mid].key) {
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           first = mid + 1;
1070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian       } else if (key < sortedArray[mid].key) {
1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           last = mid - 1;
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       } else {
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project           return mid;
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project       }
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   }
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project   return -1;
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // look for the attribute in all of our configs
1082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = binarySearch<config_pair_t>(
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[i].array,
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[i].size-1,
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attr);
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index < 0) {
1088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        configFound = config_base_attribute_list;
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        index = binarySearch<config_pair_t>(
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_base_attribute_list,
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (index >= 0) {
1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // attribute found, check if this config could match
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                gConfigManagement,
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                0, NELEM(gConfigManagement)-1,
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                attr);
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (index >= 0) {
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    val, configFound[index].value);
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (match) {
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // this config matches
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return 1;
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // attribute not found. this should NEVER happen.
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // error, this attribute doesn't exist
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gl) {
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current != gl) {
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // it is an error to set a context current, if it's already
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // current to another thread
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return -1;
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current) {
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // mark the current context as not current, and flush
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                glFlush();
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // The context is not current, make it current!
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            setGlThreadSpecific(gl);
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (current) {
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark the current context as not current, and flush
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glFlush();
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // this thread has no context attached to it
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int index = (int)config;
1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (uint32_t(index) >= numConfigs)
1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int attrIndex;
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gConfigs[index].array,
1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, gConfigs[index].size-1,
1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            config_base_attribute_list,
1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            attribute);
1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (attrIndex>=0) {
1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (window == 0)
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1223076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (it's possible that the surface is not fully initialized)
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // maybe this should be done after the page-flip
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1236076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    egl_surface_t* surface;
1237076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
1238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            static_cast<android_native_window_t*>(window));
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap == 0)
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1271076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1272076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1276076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1280076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1284076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1288076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (pixmap->format != pixelFormat)
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const EGLint *attrib_list)
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint surfaceType;
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLint configID;
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_FALSE;
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t depthFormat;
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t pixelFormat;
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(configID) {
1335076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    case 0:
1336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 1:
1340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 2:
1344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 3:
1348076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 4:
1352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = 0;
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case 5:
1356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t w = 0;
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t h = 0;
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (attrib_list[0]) {
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        attrib_list+=2;
1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface =
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!surface->isValid()) {
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // there was a problem in the ctor, the error
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // flag has been set.
1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        surface = 0;
1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return surface;
1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization
1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS
1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this just needs to be done once
1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (gGLKey == -1) {
1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (gGLKey == -1)
1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif
1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d.type = display;
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return dpy;
1409076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_NO_DISPLAY;
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1420076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // initialize stuff here if needed
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (res == EGL_TRUE) {
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
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
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean res = EGL_TRUE;
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return res;
1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration
1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs,
1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint config_size, EGLint *num_config)
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!configs) {
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = numConfigs;
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLint i;
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *configs++ = (EGLConfig)i;
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = i;
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint *num_config)
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1479749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich
1480749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(num_config==0)) {
1481749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1482749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    }
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1484749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        *num_config = 0;
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1488076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numAttributes = 0;
1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        numAttributes++;
1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attr = *attrib_list++;
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint val  = *attrib_list++;
1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!(possibleMatch & (1<<i)))
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                continue;
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                possibleMatch &= ~(1<<i);
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // now, handle the attributes which have a useful default value
1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // see if this attribute was specified, if not apply its
1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // default value
1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (binarySearch<config_pair_t>(
1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (config_pair_t const*)attrib_list,
1511dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian                0, numAttributes-1,
1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                config_defaults[j].key) < 0)
1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (!(possibleMatch & (1<<i)))
1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    continue;
1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isAttributeMatching(i,
1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].key,
1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        config_defaults[j].value) == 0)
1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                {
1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    possibleMatch &= ~(1<<i);
1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // return the configurations found
1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int n=0;
1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (possibleMatch) {
1530749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        if (configs) {
1531749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
1532749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1533749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    *configs++ = (EGLConfig)i;
1534749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    config_size--;
1535749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1536749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1537749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            }
1538749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich        } else {
1539749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
1540749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                if (possibleMatch & (1<<i)) {
1541749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                    n++;
1542749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich                }
1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *num_config = n;
1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     return EGL_TRUE;
1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLint attribute, EGLint *value)
1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces
1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativeWindowType window,
1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    NativePixmapType pixmap,
1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const EGLint *attrib_list)
1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (surface->dpy != dpy)
1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1593e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        if (surface->ctx) {
1594e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // FIXME: this surface is current check what the spec says
1595e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->disconnect();
1596e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            surface->ctx = 0;
1597e71212ba5397387100a578d23b15862518a7a859Mathias Agopian        }
1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        delete surface;
1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (surface->dpy != dpy)
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_WIDTH:
1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getWidth();
1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HEIGHT:
1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHeight();
1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_LARGEST_PBUFFER:
1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // not modified for a window or pixmap surface
1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_FORMAT:
1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_TEXTURE_TARGET:
1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_NO_TEXTURE;
1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_FALSE;
1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_MIPMAP_LEVEL:
1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = 0;
1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_RENDER_BUFFER:
1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = EGL_BACK_BUFFER;
1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getHorizontalResolution();
1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = surface->getVerticalResolution();
1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int wr = surface->getHorizontalResolution();
1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int hr = surface->getVerticalResolution();
1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
1657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            *value = surface->getSwapBehavior();
1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ret;
1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->dpy = dpy;
1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->config = config;
1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->read = 0;
1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->draw = 0;
1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)gl;
1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        setGlThreadSpecific(0);
1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLSurface read, EGLContext ctx)
1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (draw) {
1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (s->dpy != dpy)
1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // TODO: check that draw and read are compatible with the context
1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
1707076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if we're detaching, we need the current context
1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1723e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            // one of the surface is bound to a context in another thread
1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (makeCurrent(gl) == 0) {
1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (ctx) {
1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1734e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1735e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->draw) {
1736e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                reinterpret_cast<egl_surface_t*>(c->draw)->disconnect();
1737e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1738e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            if (c->read) {
1739e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1740e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            }
1741e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            c->draw = draw;
1743e71212ba5397387100a578d23b15862518a7a859Mathias Agopian            c->read = read;
1744e71212ba5397387100a578d23b15862518a7a859Mathias Agopian
1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint w = 0;
1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                GLint h = 0;
1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (draw) {
1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    w = d->getWidth();
1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    h = d->getHeight();
1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (d) {
1758cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                if (d->connect() == EGL_FALSE) {
1759cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                    return EGL_FALSE;
1760cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian                }
1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->ctx = ctx;
1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                d->bindDrawSurface(gl);
1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (r) {
1765e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                // FIXME: lock/connect the read surface too
1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->ctx = ctx;
1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                r->bindReadSurface(gl);
1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // if surfaces were bound to the context bound to this thread
1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // mark then as unbound.
1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (current_ctx) {
1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1776e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (d) {
17779648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->draw = 0;
1778e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1779e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    d->disconnect();
1780e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1781e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                if (r) {
17829648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian                    c->read = 0;
1783e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1784e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1785e71212ba5397387100a578d23b15862518a7a859Mathias Agopian                }
1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return EGL_TRUE;
1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // EGL_NO_CONTEXT is returned.
1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (readdraw == EGL_READ) {
1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->read;
1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return c->draw;
1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return c->dpy;
1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            EGLint attribute, EGLint *value)
1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (attribute) {
1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CONFIG_ID:
1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // respect to which the context was created
1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void)
1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->dpy != dpy)
1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // post the surface
1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    d->swapBuffers();
1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // if it's bound to a context, update the buffer
1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if this surface is also the read surface of the context
1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // The EGL spec is a little unclear about this.
1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (c->read == draw) {
1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            NativePixmapType target)
1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCopyBuffers()
1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_FALSE;
1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void)
1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return getError();
1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (name) {
1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VENDOR:
1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVendorString;
1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_VERSION:
1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gVersionString;
1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_EXTENSIONS:
1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gExtensionsString;
1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case EGL_CLIENT_APIS:
1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return gClientApiString;
1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1
1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSurfaceAttrib()
1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage(
1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglBindTexImage()
1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseTexImage()
1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglSwapInterval()
1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2
1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void)
1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_OPENGL_ES_API;
1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void)
1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glFinish();
1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglReleaseThread()
1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return EGL_TRUE;
1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1990076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3
1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return map[i].address;
1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2003076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
2005076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const EGLint *attrib_list)
2006076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2007076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2009076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2010076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2011076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
2012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLBoolean result = EGL_FALSE;
2014076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return result;
2015076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
2022076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2023076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
2024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
2025076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2029076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
2031076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2033076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20378b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian
2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return (EGLImageKHR)native_buffer;
2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return EGL_TRUE;
2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
2060df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2061df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2062df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions
2063df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ----------------------------------------------------------------------------
2064df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2065df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
2066df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
2067df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{
2068df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2069df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2070df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2071df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
2072df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    if (d->dpy != dpy)
2073df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
2074df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2075df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    // post the surface
2076df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    d->setSwapRectangle(left, top, width, height);
2077df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian
2078df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian    return EGL_TRUE;
2079df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian}
20808d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20818d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
20828d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{
20838d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
20848d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
20858d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20868d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
20878d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    if (d->dpy != dpy)
20888d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
20898d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian
20908d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    // post the surface
20918d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian    return d->getRenderBuffer();
20928d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian}
2093