11473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007 The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
51473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** Licensed under the Apache License Version 2.0(the "License");
61473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** you may not use this file except in compliance with the License.
71473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
91473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** Unless required by applicable law or agreed to in writing software
121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS
131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/ioctl.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/mman.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/log.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/atomic.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/egl.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/eglext.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h>
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pixelflinger/format.h>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pixelflinger/pixelflinger.h>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42b51e18d59b6f8e44a5d3516fc3359c54fa913331Mathias Agopian#include <private/ui/android_natives_priv.h>
43bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian#include <private/ui/sw_gralloc_handle.h>
44ac2523b161df2bb507cc88906bb070878266770dMathias Agopian
4568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian#include <hardware/copybit.h>
4668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "context.h"
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "state.h"
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "texture.h"
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "matrix.h"
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef NELEM
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace gl {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpthread_key_t gGLKey = -1;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace gl
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gEGLErrorKey == -1)
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnValue;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLint getError() {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_SUCCESS;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return error;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_display_t
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NativeDisplayType   type;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile int32_t    initialized;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_context_t {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IS_CURRENT      =   0x00010000,
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NEVER_CURRENT   =   0x00020000
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            flags;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          read;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          draw;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_surface_t
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PAGE_FLIP = 0x00000001,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MAGIC     = 0x31415265
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            magic;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext          ctx;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     ~egl_surface_t();
145ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian                bool    isValid() const;
146ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    virtual     bool    initCheck() const = 0;
1471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
150abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
151430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        disconnect() {}
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
1602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
161c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    virtual     EGLClientBuffer getRenderBuffer() const;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface              depth;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat)
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.version = sizeof(GGLSurface);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.data = 0;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.format = depthFormat;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::~egl_surface_t()
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    magic = 0;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(depth.data);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
180ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopianbool egl_surface_t::isValid() const {
181ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this);
182ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    return magic == MAGIC;
183ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian}
184ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_BUFFER_PRESERVED;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2002e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
2012e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
2022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
2032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_FALSE;
2042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
205c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const {
206c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return 0;
207c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_window_surface_v2_t(
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
2161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            android_native_window_t* window);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
218ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    ~egl_window_surface_v2_t();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    virtual     bool        initCheck() const { return true; } // TODO: report failure if ctor fails
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
224abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    virtual     EGLBoolean  connect();
225430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        disconnect();
2265b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
2275b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    virtual     EGLint      getHeight() const   { return height; }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
2322e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
233c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    virtual     EGLClientBuffer  getRenderBuffer() const;
234c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
236430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
237dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    status_t unlock(android_native_buffer_t* buf);
2381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_window_t*   nativeWindow;
2391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t*   buffer;
2402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    android_native_buffer_t*   previousBuffer;
241dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    gralloc_module_t const*    module;
24268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    copybit_device_t*          blitengine;
2431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int width;
2441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int height;
245430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    void* bits;
2462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    GGLFormat const* pixelFormatTable;
2472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Rect {
2492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect() { };
2502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t w, int32_t h)
2512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(0), top(0), right(w), bottom(h) { }
2522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
2532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(l), top(t), right(r), bottom(b) { }
2542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect& andSelf(const Rect& r) {
2552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            left   = max(left, r.left);
2562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            top    = max(top, r.top);
2572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            right  = min(right, r.right);
2582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            bottom = min(bottom, r.bottom);
2592e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return *this;
2602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
2622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return (left>=right || top>=bottom);
2632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        void dump(char const* what) {
2652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
2662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    what, left, top, right-left, bottom-top);
2672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t left;
2702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t top;
2712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t right;
2722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t bottom;
2732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
2742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Region {
2762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Region() : count(0) { }
27768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        typedef Rect const* const_iterator;
27868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const_iterator begin() const { return storage; }
27968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const_iterator end() const { return storage+count; }
2802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
2812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Region reg;
2822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Rect* storage = reg.storage;
2832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!lhs.isEmpty()) {
2842e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.top < rhs.top) { // top rect
2852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
2862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = lhs.top;
2872e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
28868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    storage->bottom = rhs.top;
2892e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2902e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
29168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                const int32_t top = max(lhs.top, rhs.top);
29268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
29368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                if (top < bot) {
29468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
29568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->left   = lhs.left;
29668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->top    = top;
29768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->right  = rhs.left;
29868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->bottom = bot;
29968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage++;
30068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    }
30168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
30268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->left   = rhs.right;
30368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->top    = top;
30468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->right  = lhs.right;
30568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->bottom = bot;
30668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage++;
30768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    }
3082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
3092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
3102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
31168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    storage->top    = rhs.bottom;
3122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
3132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = lhs.bottom;
3142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
3152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
3162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                reg.count = storage - reg.storage;
3172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
3182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return reg;
3192e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
3212e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return count<=0;
3222e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3232e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    private:
3242e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect storage[4];
3252e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t count;
3262e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
3272e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
32868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    struct region_iterator : public copybit_region_t {
32968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        region_iterator(const Region& region)
33068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            : b(region.begin()), e(region.end()) {
33168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            this->next = iterate;
33268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
33368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    private:
33468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
33568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
33668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (me->b != me->e) {
33768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
33868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                return 1;
33968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            }
34068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            return 0;
34168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
34268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        mutable Region::const_iterator b;
34368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator const e;
34468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    };
34568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
3462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    void copyBlt(
3472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
3482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
34968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            const Region& clip);
3502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect dirtyRegion;
3522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect oldDirtyRegion;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
3581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        android_native_window_t* window)
359dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    : egl_surface_t(dpy, config, depthFormat),
3602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
36168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    blitengine(0), bits(NULL)
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
363dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_module_t const* pModule;
364dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
365dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
366dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
36768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
36868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_open(pModule, &blitengine);
36968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    }
37068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
3712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
3722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the window
3741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
3755b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
3765b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
3775b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian}
3781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3795b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
3805b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (buffer) {
3815b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer->common.decRef(&buffer->common);
3825b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3835b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (previousBuffer) {
3845b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
3855b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3865b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
3875b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (blitengine) {
3885b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        copybit_close(blitengine);
3895b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3905b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian}
3915b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian
392abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
3935b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian{
3945cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian    // we're intending to do software rendering
3955cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian    native_window_set_usage(nativeWindow,
3965cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3975cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian
3982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a buffer
399abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
400abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
401abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    }
4022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
4032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // allocate a corresponding depth-buffer
4041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    width = buffer->width;
4051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    height = buffer->height;
4065b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (depth.format) {
4071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.width   = width;
4081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.height  = height;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
412abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
4171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer->common.incRef(&buffer->common);
4182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
419dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    // Lock the buffer
420430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
4212e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // pin the buffer down
4222e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
4232e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
42468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
4252e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
426abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
4272e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
4282e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
429abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    return EGL_TRUE;
430430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian}
431430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
432430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
433430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian{
43436432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian    if (buffer && bits) {
435430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        bits = NULL;
436430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        unlock(buffer);
437430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    }
4385b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    // enqueue the last frame
4395b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
4405b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (buffer) {
4415b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer->common.decRef(&buffer->common);
4425b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer = 0;
4435b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
4445b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (previousBuffer) {
4455b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
4465b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer = 0;
4475b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
450dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::lock(
451430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
452dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
453bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    int err;
454bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    if (sw_gralloc_handle_t::validate(buf->handle) < 0) {
455bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian        err = module->lock(module, buf->handle,
456bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian                usage, 0, 0, buf->width, buf->height, vaddr);
457bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    } else {
458bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian        sw_gralloc_handle_t const* hnd =
459bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian                reinterpret_cast<sw_gralloc_handle_t const*>(buf->handle);
460bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian        *vaddr = (void*)hnd->base;
461bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian        err = NO_ERROR;
462bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    }
463dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
464dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
465dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
466dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
467dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
468abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (!buf) return BAD_VALUE;
469bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    int err = NO_ERROR;
470bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    if (sw_gralloc_handle_t::validate(buf->handle) < 0) {
471bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian        err = module->unlock(module, buf->handle);
472bbf945f3c0324b5bedd95aa7e436f0a6dc50aa7fMathias Agopian    }
473dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
474dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
475dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
4762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopianvoid egl_window_surface_v2_t::copyBlt(
4772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
4782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
47968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const Region& clip)
4802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
4812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // FIXME: use copybit if possible
4822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // NOTE: dst and src must be the same format
4832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
48468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    status_t err = NO_ERROR;
48568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    copybit_device_t* const copybit = blitengine;
48668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (copybit)  {
48768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_image_t simg;
48868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.w = src->width;
48968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.h = src->height;
49068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.format = src->format;
49168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
49268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
49368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_image_t dimg;
49468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.w = dst->width;
49568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.h = dst->height;
49668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.format = dst->format;
49768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
49868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
49968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
50068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
50168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
50268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        region_iterator it(clip);
50368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
50468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        if (err != NO_ERROR) {
50568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            LOGE("copybit failed (%s)", strerror(err));
50668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
50768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    }
508dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
50968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (!copybit || err) {
51068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator cur = clip.begin();
51168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator end = clip.end();
51268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
51368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
51468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t dbpr = dst->stride * bpp;
51568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t sbpr = src->stride * bpp;
51668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
51768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
51868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
51968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
52068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        while (cur != end) {
52168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            const Rect& r(*cur++);
52268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            ssize_t w = r.right - r.left;
52368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            ssize_t h = r.bottom - r.top;
52468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (w <= 0 || h<=0) continue;
52568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            size_t size = w * bpp;
52668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
52768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
52868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (dbpr==sbpr && size==sbpr) {
52968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                size *= h;
53068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                h = 1;
53168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            }
53268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            do {
53368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                memcpy(d, s, size);
53468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                d += dbpr;
53568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                s += sbpr;
53668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            } while (--h > 0);
5372e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
5381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5411473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
543abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (!buffer) {
544abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
545abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    }
546abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian
5472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
5482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * Handle eglSetSwapRectangleANDROID()
5492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * We copyback from the front buffer
5502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
5512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (!dirtyRegion.isEmpty()) {
5522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
5532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        if (previousBuffer) {
5542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
5552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!copyBack.isEmpty()) {
5562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                void* prevBits;
5572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lock(previousBuffer,
55868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
55968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    // copy from previousBuffer to buffer
56068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
5612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    unlock(previousBuffer);
5622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
5632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
5642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
5652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        oldDirtyRegion = dirtyRegion;
5662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (previousBuffer) {
5692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
5702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer = 0;
5712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
573dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    unlock(buffer);
5742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    previousBuffer = buffer;
5751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
5762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer = 0;
5771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a new buffer
5791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
5802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
5821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // direct rendering occurs.
5831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
5841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // reallocate the depth-buffer if needed
5861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: we probably should reset the swap rect here
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the window size has changed
5891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        width = buffer->width;
5901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        height = buffer->height;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            free(depth.data);
5931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.width   = width;
5941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.height  = height;
5951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.stride  = buffer->stride;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (depth.data == 0) {
5982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return EGL_FALSE;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
6052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer->common.incRef(&buffer->common);
6062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // finally pin the buffer down
6082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
6092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
6102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
6112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
612abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
6132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
6142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
6152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
6172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
6182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6192e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
6202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
6212e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
6222e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
626c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
627c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian{
628c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return buffer;
629c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
630c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
6311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
6321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
634c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    // Hardware supported
6351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    switch (format) {
6361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
637c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_8888:
63836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case HAL_PIXEL_FORMAT_RGBX_8888:
639c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_4444:
640c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_5551:
641c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_BGRA_8888:
6421473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return true;
6431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
644c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return false;
6451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
6461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
6471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6481473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
6531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
6541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
655430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits;
6561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
660350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian
6611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
662350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian    gl->copybits.drawSurfaceBuffer = 0;
663a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian    if (gl->copybits.blitEngine != NULL) {
664a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian        if (supportedCopybitsDestinationFormat(buffer.format)) {
665a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian            buffer_handle_t handle = this->buffer->handle;
666a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian            if (handle != NULL) {
66736d0184e089831b74de6005f01da9e7b26679bb9Mathias Agopian                gl->copybits.drawSurfaceBuffer = this->buffer;
6681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            }
6691473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        }
6701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
6711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
672350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6751473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
6801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
6811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
682430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
6831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6871473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6901473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6931473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
6941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
6972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
6982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
6992e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
7002e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * the content of the swapped buffer.
7012e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
7022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
7032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
7042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
7052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
7062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * is, everything outside of this area is preserved.
7072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
7082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * This implementation of EGL assumes the later case.
7092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
7102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
7112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
7121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_BUFFER_DESTROYED;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pixmap_surface_t(
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_native_pixmap_t const * pixmap);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
726ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    virtual     bool        initCheck() const { return !depth.format || depth.data!=0; }
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_native_pixmap_t const * pixmap)
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pixmap->width;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pixmap->height;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
7601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pbuffer_surface_t(
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t w, int32_t h, int32_t f);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    virtual     bool        initCheck() const   { return pbuffer.data != 0; }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface  pbuffer;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config, int32_t depthFormat,
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t w, int32_t h, int32_t f)
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t size = w*h;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (f) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
80836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        case GGL_PIXEL_FORMAT_RGBX_8888:    size *= 4; break;
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pbuffer.data = 0;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.width   = w;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.height  = h;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.stride  = w;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.format  = f;
8201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pbuffer.width;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pbuffer.height;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(pbuffer.data);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_pair_t {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint value;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct configs_t {
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const config_pair_t* array;
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                  size;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_management_t {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (confValue & reqValue) == reqValue;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MAJOR 1
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MINOR 2
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
879cf3350982f63d918e8e4a1de31ea54829ffc0b67Mathias Agopianstatic char const * const gVersionString    = "1.2 Android Driver 1.1.0";
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
8811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic char const * const gExtensionsString =
882927d37cb788670b91af0f1a7a93c68046a838d23Mathias Agopian        "EGL_KHR_image_base "
8831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        // "KHR_image_pixmap "
8841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        "EGL_ANDROID_image_native_buffer "
8852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        "EGL_ANDROID_swap_rectangle "
886c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        "EGL_ANDROID_get_render_buffer "
8871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct extention_map_t {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char * const name;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
8971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsOES",
8981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
8991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexiOES",
9001473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
9011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfOES",
9021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
9031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxOES",
9041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
9051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsvOES",
9061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
9071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexivOES",
9081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
9091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfvOES",
9101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
9111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxvOES",
9121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
9131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glQueryMatrixxOES",
9141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
9151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetTexture2DOES",
9161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
9171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
9181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
9191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanef",
9201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
9211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanex",
9221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
9231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBindBuffer",
9241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
9251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferData",
9261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
9271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferSubData",
9281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
9291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDeleteBuffers",
9301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
9311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glGenBuffers",
9321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
933c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglCreateImageKHR",
934c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
935c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglDestroyImageKHR",
936c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
937c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglSetSwapRectangleANDROID",
938c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
939c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglGetRenderBufferANDROID",
940c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian/*
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In the lists below, attributes names MUST be sorted.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additionally, all configs must be sorted according to
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the EGL specification.
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      0                                 },
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
9541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
969594d02e54a34fdbf1992391dbbc5f9a1be21b046Mathias Agopian        { EGL_MAX_SWAP_INTERVAL,          1                                 },
9700953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_LUMINANCE_SIZE,             0                                 },
9710953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_ALPHA_MASK_SIZE,            0                                 },
9720953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          EGL_RGB_BUFFER                    },
973594d02e54a34fdbf1992391dbbc5f9a1be21b046Mathias Agopian        { EGL_RENDERABLE_TYPE,            EGL_OPENGL_ES_BIT                 },
9740953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_CONFORMANT,                 0                                 }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These configs can override the base attribute list
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
98036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian// 565 configs
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        0 },
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        1 },
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
100336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian// RGB 888 configs
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
100636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_ALPHA_SIZE,       0 },
100736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_BLUE_SIZE,        8 },
100836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_GREEN_SIZE,       8 },
100936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_RED_SIZE,         8 },
101036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_DEPTH_SIZE,       0 },
101136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_CONFIG_ID,        6 },
101236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
101336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian};
101436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian
101536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic config_pair_t const config_3_attribute_list[] = {
101636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_BUFFER_SIZE,     32 },
101736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_ALPHA_SIZE,       0 },
101836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_BLUE_SIZE,        8 },
101936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_GREEN_SIZE,       8 },
102036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_RED_SIZE,         8 },
102136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_DEPTH_SIZE,      16 },
102236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_CONFIG_ID,        7 },
102336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
102436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian};
102536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian
102636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian// 8888 configs
102736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic config_pair_t const config_4_attribute_list[] = {
102836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { EGL_BUFFER_SIZE,     32 },
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        2 },
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic config_pair_t const config_5_attribute_list[] = {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        3 },
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian// A8 configs
105036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic config_pair_t const config_6_attribute_list[] = {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        4 },
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic config_pair_t const config_7_attribute_list[] = {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        5 },
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic configs_t const gConfigs[] = {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
107936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { config_6_attribute_list, NELEM(config_6_attribute_list) },
108036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        { config_7_attribute_list, NELEM(config_7_attribute_list) },
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
11110953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_LUMINANCE_SIZE,             config_management_t::atLeast },
11120953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_ALPHA_MASK_SIZE,            config_management_t::atLeast },
11130953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_COLOR_BUFFER_TYPE,          config_management_t::exact   },
11140953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_RENDERABLE_TYPE,            config_management_t::mask    },
11150953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        { EGL_CONFORMANT,                 config_management_t::mask    }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11180953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
11200953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian    // attributes that are not specified are simply ignored, if a particular
11210953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian    // one needs not be ignored, it must be specified here, eg:
11220953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian    // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT },
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
112736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopianstatic status_t getConfigFormatInfo(EGLint configID,
112836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        int32_t& pixelFormat, int32_t& depthFormat)
112936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian{
113036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    switch(configID) {
113136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 0:
113236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
113336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = 0;
113436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
113536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 1:
113636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
113736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
113836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
113936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 2:
114036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
114136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = 0;
114236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
114336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 3:
114436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888;
114536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
114636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
114736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 4:
114836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
114936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = 0;
115036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
115136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 5:
115236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
115336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
115436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
115536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 6:
115636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
115736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = 0;
115836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
115936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    case 7:
116036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
116136fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        depthFormat = GGL_PIXEL_FORMAT_Z_16;
116236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        break;
116336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    default:
116436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian        return NAME_NOT_FOUND;
116536fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    }
116636fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    return NO_ERROR;
116736fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian}
116836fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian
116936fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian// ----------------------------------------------------------------------------
117036fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   while (first <= last) {
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       int mid = (first + last) / 2;
11761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       if (key > sortedArray[mid].key) {
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           first = mid + 1;
11781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       } else if (key < sortedArray[mid].key) {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           last = mid - 1;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } else {
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           return mid;
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   return -1;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // look for the attribute in all of our configs
11901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = binarySearch<config_pair_t>(
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[i].array,
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[i].size-1,
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attr);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index < 0) {
11961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        configFound = config_base_attribute_list;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index = binarySearch<config_pair_t>(
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_base_attribute_list,
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index >= 0) {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attribute found, check if this config could match
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gConfigManagement,
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(gConfigManagement)-1,
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
12084a783af6ecab54050d1675ccd041045a69d4fe8aChristoffer Gurell        if (cfgMgtIndex >= 0) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val, configFound[index].value);
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (match) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this config matches
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 1;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // attribute not found. this should NEVER happen.
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // error, this attribute doesn't exist
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gl) {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current != gl) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is an error to set a context current, if it's already
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // current to another thread
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // mark the current context as not current, and flush
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                glFlush();
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The context is not current, make it current!
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setGlThreadSpecific(gl);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (current) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark the current context as not current, and flush
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            glFlush();
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this thread has no context attached to it
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = (int)config;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(index) >= numConfigs)
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int attrIndex;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[index].array,
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[index].size-1,
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            config_base_attribute_list,
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (window == 0)
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1303ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (static_cast<android_native_window_t*>(window)->common.magic !=
1304ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian            ANDROID_NATIVE_WINDOW_MAGIC) {
1305ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
1306ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    }
1307ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
131436fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // (it's possible that the surface is not fully initialized)
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // maybe this should be done after the page-flip
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_surface_t* surface;
13251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
13261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            static_cast<android_native_window_t*>(window));
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1328ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!surface->initCheck()) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap == 0)
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1352ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (static_cast<egl_native_pixmap_t*>(pixmap)->version !=
1353ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian            sizeof(egl_native_pixmap_t)) {
1354ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
1355ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    }
1356ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
136336fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap->format != pixelFormat)
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1374ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!surface->initCheck()) {
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const EGLint *attrib_list)
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
140236fe3eeaa056ff13455c0df73b495b2bae8c1469Mathias Agopian    if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t w = 0;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t h = 0;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (attrib_list[0]) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attrib_list+=2;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1417ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!surface->initCheck()) {
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Initialization
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // this just needs to be done once
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gGLKey == -1) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gGLKey == -1)
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d.type = display;
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dpy;
14521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_NO_DISPLAY;
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
14631473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initialize stuff here if needed
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res == EGL_TRUE) {
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// configuration
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs,
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint config_size, EGLint *num_config)
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!configs) {
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = numConfigs;
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint i;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *configs++ = (EGLConfig)i;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = i;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint *num_config)
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15221badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich
15231badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(num_config==0)) {
15241badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
15251badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15271badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = 0;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numAttributes = 0;
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        numAttributes++;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attr = *attrib_list++;
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint val  = *attrib_list++;
15390953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(possibleMatch & (1<<i)))
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                possibleMatch &= ~(1<<i);
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // now, handle the attributes which have a useful default value
15490953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian    for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) {
15500953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian        // see if this attribute was specified, if not, apply its
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // default value
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (binarySearch<config_pair_t>(
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (config_pair_t const*)attrib_list,
1554ab1cf3efd3b884a90170a82744f7ae508d51cf6eMathias Agopian                0, numAttributes-1,
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_defaults[j].key) < 0)
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
15570953c1d5e1c295c84fa02237bf70c779e45c83aeMathias Agopian            for (int i=0 ; possibleMatch && i<numConfigs ; i++) {
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(possibleMatch & (1<<i)))
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (isAttributeMatching(i,
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].key,
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].value) == 0)
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    possibleMatch &= ~(1<<i);
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // return the configurations found
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int n=0;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (possibleMatch) {
15731badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        if (configs) {
15741badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
15751badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
15761badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    *configs++ = (EGLConfig)i;
15771badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    config_size--;
15781badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
15791badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
15801badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            }
15811badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        } else {
15821badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
15831badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
15841badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
15851badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = n;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     return EGL_TRUE;
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// surfaces
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativeWindowType window,
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativePixmapType pixmap,
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
1632ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        if (!surface->isValid())
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface->dpy != dpy)
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1636430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        if (surface->ctx) {
1637430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // FIXME: this surface is current check what the spec says
1638430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->disconnect();
1639430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->ctx = 0;
1640430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        }
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
1652ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!surface->isValid())
1653ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (surface->dpy != dpy)
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_WIDTH:
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getWidth();
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HEIGHT:
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHeight();
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_LARGEST_PBUFFER:
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // not modified for a window or pixmap surface
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_FORMAT:
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_TARGET:
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_FALSE;
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_LEVEL:
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = 0;
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_RENDER_BUFFER:
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_BACK_BUFFER;
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHorizontalResolution();
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getVerticalResolution();
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wr = surface->getHorizontalResolution();
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int hr = surface->getVerticalResolution();
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
17021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            *value = surface->getSwapBehavior();
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ret;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->dpy = dpy;
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->config = config;
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->read = 0;
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->draw = 0;
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)gl;
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLSurface read, EGLContext ctx)
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (draw) {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
1746ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        if (!s->isValid())
1747ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
1748ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        if (s->dpy != dpy)
1749ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1750ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        // TODO: check that draw is compatible with the context
1751ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    }
1752ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (read && read!=draw) {
1753ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        egl_surface_t* s = (egl_surface_t*)read;
1754ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        if (!s->isValid())
1755ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian            return setError(EGL_BAD_SURFACE, EGL_FALSE);
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s->dpy != dpy)
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1758ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        // TODO: check that read is compatible with the context
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
17621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if we're detaching, we need the current context
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1778430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // one of the surface is bound to a context in another thread
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (makeCurrent(gl) == 0) {
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctx) {
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1789430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
1790430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->draw) {
1791ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian                egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
1792ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian                s->disconnect();
1793430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1794430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->read) {
1795430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1796430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1797430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->draw = draw;
1799430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            c->read = read;
1800430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint w = 0;
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint h = 0;
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (draw) {
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w = d->getWidth();
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    h = d->getHeight();
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d) {
1814abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                if (d->connect() == EGL_FALSE) {
1815abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                    return EGL_FALSE;
1816abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                }
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->ctx = ctx;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->bindDrawSurface(gl);
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (r) {
1821430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: lock/connect the read surface too
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->ctx = ctx;
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->bindReadSurface(gl);
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if surfaces were bound to the context bound to this thread
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark then as unbound.
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current_ctx) {
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1832430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (d) {
183336432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->draw = 0;
1834430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1835430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->disconnect();
1836430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
1837430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (r) {
183836432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->read = 0;
1839430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1840430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1841430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // EGL_NO_CONTEXT is returned.
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (readdraw == EGL_READ) {
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->read;
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->draw;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->dpy;
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // respect to which the context was created
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitGL(void)
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
1915ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!d->isValid())
1916ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->dpy != dpy)
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // post the surface
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d->swapBuffers();
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if it's bound to a context, update the buffer
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if this surface is also the read surface of the context
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The EGL spec is a little unclear about this.
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->read == draw) {
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            NativePixmapType target)
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCopyBuffers()
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint eglGetError(void)
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getError();
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (name) {
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VENDOR:
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVendorString;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERSION:
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVersionString;
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_EXTENSIONS:
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gExtensionsString;
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CLIENT_APIS:
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gClientApiString;
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.1
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSurfaceAttrib()
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindTexImage(
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglBindTexImage()
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseTexImage()
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSwapInterval()
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.2
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLenum eglQueryAPI(void)
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_OPENGL_ES_API;
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitClient(void)
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    glFinish();
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseThread()
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
20481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// EGL_EGLEXT_VERSION 3
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return map[i].address;
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20621473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
20631473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        const EGLint *attrib_list)
20641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
20661473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
20671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20691473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
20701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
20721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
20731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20751473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
20761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
20771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
20791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
20801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
20821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
20831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
20851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
20891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
20911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
20941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
209542d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian
209642d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian    switch (native_buffer->format) {
209742d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_8888:
209842d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGBX_8888:
209942d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGB_888:
210042d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGB_565:
210142d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_BGRA_8888:
210242d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_5551:
210342d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        case HAL_PIXEL_FORMAT_RGBA_4444:
210442d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian            break;
210542d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian        default:
210642d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian            return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
210742d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian    }
210842d99d211f547a2b5a4632e62b38ac16a1ad481cMathias Agopian
21091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
21101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (EGLImageKHR)native_buffer;
21111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
21121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21131473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
21141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
21151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
21161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
21171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
21181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
21201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
21221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
21231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
21251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
21261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
21281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
21291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_TRUE;
21301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
21312e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
21322e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
21332e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ANDROID extensions
21342e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
21352e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
21362e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
21372e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
21382e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
21392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
21402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
21412e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
21422e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
2143ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!d->isValid())
2144ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_SURFACE, EGL_FALSE);
21452e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (d->dpy != dpy)
21462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
21472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
21482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // post the surface
21492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    d->setSwapRectangle(left, top, width, height);
21502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
21512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
21522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
2153c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2154c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
2155c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian{
2156c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2157c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
2158c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2159c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
2160ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian    if (!d->isValid())
2161ffbc864329d2659e9a75d2c80d66dc90c1072da1Mathias Agopian        return setError(EGL_BAD_SURFACE, (EGLClientBuffer)0);
2162c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    if (d->dpy != dpy)
2163c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
2164c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2165c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    // post the surface
2166c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return d->getRenderBuffer();
2167c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
2168