egl.cpp revision 36432ccc13f6d3db7af35661683c33ffa3406d85
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>
43ac2523b161df2bb507cc88906bb070878266770dMathias Agopian
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "context.h"
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "state.h"
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "texture.h"
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "matrix.h"
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#include "gralloc_priv.h"
511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef NELEM
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace gl {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpthread_key_t gGLKey = -1;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace gl
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gEGLErrorKey == -1)
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnValue;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLint getError() {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_SUCCESS;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return error;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_display_t
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NativeDisplayType   type;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile int32_t    initialized;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_context_t {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IS_CURRENT      =   0x00010000,
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NEVER_CURRENT   =   0x00020000
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            flags;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          read;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          draw;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_surface_t
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PAGE_FLIP = 0x00000001,
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MAGIC     = 0x31415265
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            magic;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext          ctx;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     ~egl_surface_t();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool    isValid() 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;
150430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        connect() {}
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);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface              depth;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat)
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.version = sizeof(GGLSurface);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.data = 0;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.format = depthFormat;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::~egl_surface_t()
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    magic = 0;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(depth.data);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_BUFFER_PRESERVED;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1942e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
1952e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
1962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
1972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_FALSE;
1982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_window_surface_v2_t(
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
2071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            android_native_window_t* window);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian     ~egl_window_surface_v2_t();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
215430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        connect();
216430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        disconnect();
2171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     EGLint      getWidth() const    { return buffer->width;  }
2181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     EGLint      getHeight() const   { return buffer->height; }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
2232e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
224430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
226430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
227dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    status_t unlock(android_native_buffer_t* buf);
2281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_window_t*   nativeWindow;
2291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t*   buffer;
2302e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    android_native_buffer_t*   previousBuffer;
231dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    gralloc_module_t const*    module;
2321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int width;
2331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int height;
234430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    void* bits;
2352e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    GGLFormat const* pixelFormatTable;
2362e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2372e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Rect {
2382e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect() { };
2392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t w, int32_t h)
2402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(0), top(0), right(w), bottom(h) { }
2412e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
2422e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(l), top(t), right(r), bottom(b) { }
2432e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect& andSelf(const Rect& r) {
2442e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            left   = max(left, r.left);
2452e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            top    = max(top, r.top);
2462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            right  = min(right, r.right);
2472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            bottom = min(bottom, r.bottom);
2482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return *this;
2492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
2512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return (left>=right || top>=bottom);
2522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        void dump(char const* what) {
2542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
2552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    what, left, top, right-left, bottom-top);
2562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t left;
2592e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t top;
2602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t right;
2612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t bottom;
2622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
2632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Region {
2652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Region() : count(0) { }
2662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
2672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Region reg;
2682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Rect* storage = reg.storage;
2692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!lhs.isEmpty()) {
2702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.top < rhs.top) { // top rect
2712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
2722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = lhs.top;
2732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
2742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = max(lhs.top, rhs.top);
2752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
2772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.left < rhs.left) { // left-side rect
2782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
2792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = max(lhs.top, rhs.top);
2802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = max(lhs.left, rhs.left);
2812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = min(lhs.bottom, rhs.bottom);
2822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
2842e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.right > rhs.right) { // right-side rect
2852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = min(lhs.right, rhs.right);
2862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = max(lhs.top, rhs.top);
2872e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
2882e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = min(lhs.bottom, rhs.bottom);
2892e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2902e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
2912e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
2922e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
2932e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = min(lhs.bottom, rhs.bottom);
2942e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
2952e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = lhs.bottom;
2962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
2982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                reg.count = storage - reg.storage;
2992e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
3002e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return reg;
3012e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
3032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return count<=0;
3042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t getRects(Rect const* * rects) const {
3062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            *rects = storage;
3072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return count;
3082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    private:
3102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect storage[4];
3112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t count;
3122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
3132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    void copyBlt(
3152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
3162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
3172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            const Rect* reg, ssize_t count);
3182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3192e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect dirtyRegion;
3202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect oldDirtyRegion;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
3261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        android_native_window_t* window)
327dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    : egl_surface_t(dpy, config, depthFormat),
3282e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
3292e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    bits(NULL)
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
331dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_module_t const* pModule;
332dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
333dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
334dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
3352e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
3362e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3372e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the window
3381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
3391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a buffer
3411473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
3422e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3432e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // allocate a corresponding depth-buffer
3441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    width = buffer->width;
3451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    height = buffer->height;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
3471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.width   = width;
3481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.height  = height;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
3581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer->common.incRef(&buffer->common);
359430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian}
3601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
3622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (buffer) {
3632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        buffer->common.decRef(&buffer->common);
3642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
3652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (previousBuffer) {
3662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
3672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
3682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
3692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
3702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
371430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopianvoid egl_window_surface_v2_t::connect()
372430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian{
373dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    // Lock the buffer
374430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
3752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // pin the buffer down
3762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
3772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
3782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
3792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
3802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        setError(EGL_BAD_ACCESS, EGL_NO_SURFACE);
3812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
3822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
383430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian}
384430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
385430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
386430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian{
38736432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian    if (buffer && bits) {
388430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        bits = NULL;
389430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        unlock(buffer);
390430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
393dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::lock(
394430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
395dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
396e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian    int err = module->lock(module, buf->handle,
397430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
398dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
399dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
400dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
401dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
402dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
403e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian    int err = module->unlock(module, buf->handle);
404dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
405dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
406dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
4072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopianvoid egl_window_surface_v2_t::copyBlt(
4082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
4092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
4102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        const Rect* reg, ssize_t count)
4112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
4122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // FIXME: use copybit if possible
4132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // NOTE: dst and src must be the same format
4142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
4152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect r;
4162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    const size_t bpp = pixelFormatTable[src->format].size;
4172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    const size_t dbpr = dst->stride * bpp;
4182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    const size_t sbpr = src->stride * bpp;
419dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
4202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
4212e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
4222e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
4232e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    for (int i= 0 ; i<count ; i++) {
4242e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        const Rect& r(reg[i]);
4252e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t w = r.right - r.left;
4262e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t h = r.bottom - r.top;
4272e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        if (w <= 0 || h<=0) continue;
4282e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        size_t size = w * bpp;
4292e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
4302e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
4312e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        if (dbpr==sbpr && size==sbpr) {
4322e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            size *= h;
4332e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            h = 1;
4342e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
4352e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        do {
4362e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            memcpy(d, s, size);
4372e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            d += dbpr;
4382e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            s += sbpr;
4392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        } while (--h > 0);
4401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4431473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4452e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
4462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * Handle eglSetSwapRectangleANDROID()
4472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * We copyback from the front buffer
4482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
4492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (!dirtyRegion.isEmpty()) {
4502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
4512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        if (previousBuffer) {
4522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
4532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!copyBack.isEmpty()) {
4542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                Rect const* list;
4552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                ssize_t count = copyBack.getRects(&list);
4562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                // copy from previousBuffer to buffer
4572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                void* prevBits;
4582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lock(previousBuffer,
4592e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR)
4602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                {
4612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, list, count);
4622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    unlock(previousBuffer);
4632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
4642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
4652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
4662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        oldDirtyRegion = dirtyRegion;
4672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
4681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (previousBuffer) {
4702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
4712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer = 0;
4722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
4731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
474dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    unlock(buffer);
4752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    previousBuffer = buffer;
4761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
4772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer = 0;
4781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a new buffer
4801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
4812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
4821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
4831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // direct rendering occurs.
4841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
4851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // reallocate the depth-buffer if needed
4871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: we probably should reset the swap rect here
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the window size has changed
4901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        width = buffer->width;
4911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        height = buffer->height;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data) {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            free(depth.data);
4941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.width   = width;
4951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.height  = height;
4961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.stride  = buffer->stride;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (depth.data == 0) {
4992e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return EGL_FALSE;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
5062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer->common.incRef(&buffer->common);
5072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // finally pin the buffer down
5092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
5102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
5112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
5122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
5132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        setError(EGL_BAD_ACCESS, EGL_NO_SURFACE);
5142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
5152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
5182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
5192e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
5212e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
5222e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
5232e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
5281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
5301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // Hardware supported and no destination alpha
5311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    switch (format) {
5321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
5331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
5341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
5351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return true;
5361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    default:
5371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return false;
5381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
5391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
5401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
5411473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5421473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
5461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
5471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
5481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
549430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits;
5501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
5541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
5551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    gl->copybits.drawSurfaceFd = -1;
5561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (supportedCopybitsDestinationFormat(buffer.format)) {
557e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian        buffer_handle_t handle = this->buffer->handle;
5581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        if (handle != NULL) {
5591473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            private_handle_t* hand = private_handle_t::dynamicCast(handle);
5601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            if (hand != NULL) {
5611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian                if (hand->usesPhysicallyContiguousMemory()) {
5621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian                    gl->copybits.drawSurfaceFd = hand->fd;
5631473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian                }
5641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            }
5651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        }
5661473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
5671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5701473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
5741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
5751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
5761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
577430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
5781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5821473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5851473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5881473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
5891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5912e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
5922e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
5932e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
5942e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
5952e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * the content of the swapped buffer.
5962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
5972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
5982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
5992e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
6002e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
6012e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * is, everything outside of this area is preserved.
6022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * This implementation of EGL assumes the later case.
6042e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
6062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_BUFFER_DESTROYED;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pixmap_surface_t(
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_native_pixmap_t const * pixmap);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_native_pixmap_t const * pixmap)
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pixmap->width;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pixmap->height;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
6561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
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);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pbuffer_surface_t(
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t w, int32_t h, int32_t f);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface  pbuffer;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config, int32_t depthFormat,
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t w, int32_t h, int32_t f)
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t size = w*h;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (f) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pbuffer.data = 0;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.width   = w;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.height  = h;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.stride  = w;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.format  = f;
7151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pbuffer.width;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pbuffer.height;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(pbuffer.data);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_pair_t {
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint value;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct configs_t {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const config_pair_t* array;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                  size;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_management_t {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (confValue & reqValue) == reqValue;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MAJOR 1
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MINOR 2
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
7761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic char const * const gExtensionsString =
777927d37cb788670b91af0f1a7a93c68046a838d23Mathias Agopian        "EGL_KHR_image_base "
7781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        // "KHR_image_pixmap "
7791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        "EGL_ANDROID_image_native_buffer "
7802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        "EGL_ANDROID_swap_rectangle "
7811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct extention_map_t {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char * const name;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
7911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsOES",
7921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
7931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexiOES",
7941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
7951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfOES",
7961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
7971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxOES",
7981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
7991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsvOES",
8001473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
8011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexivOES",
8021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
8031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfvOES",
8041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
8051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxvOES",
8061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
8071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glQueryMatrixxOES",
8081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
8091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetTexture2DOES",
8101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
8111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
8121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
8131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanef",
8141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
8151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanex",
8161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
8171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBindBuffer",
8181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
8191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferData",
8201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
8211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferSubData",
8221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
8231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDeleteBuffers",
8241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
8251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glGenBuffers",
8261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian/*
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In the lists below, attributes names MUST be sorted.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additionally, all configs must be sorted according to
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the EGL specification.
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      0                                 },
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
8401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These configs can override the base attribute list
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        0 },
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        1 },
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        2 },
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        3 },
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        4 },
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        5 },
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic configs_t const gConfigs[] = {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   while (first <= last) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       int mid = (first + last) / 2;
9771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       if (key > sortedArray[mid].key) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           first = mid + 1;
9791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       } else if (key < sortedArray[mid].key) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           last = mid - 1;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } else {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           return mid;
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   return -1;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // look for the attribute in all of our configs
9911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = binarySearch<config_pair_t>(
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[i].array,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[i].size-1,
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attr);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index < 0) {
9971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        configFound = config_base_attribute_list;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index = binarySearch<config_pair_t>(
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_base_attribute_list,
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index >= 0) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attribute found, check if this config could match
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gConfigManagement,
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(gConfigManagement)-1,
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index >= 0) {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val, configFound[index].value);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (match) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this config matches
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 1;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // attribute not found. this should NEVER happen.
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // error, this attribute doesn't exist
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gl) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current != gl) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is an error to set a context current, if it's already
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // current to another thread
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current) {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // mark the current context as not current, and flush
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                glFlush();
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The context is not current, make it current!
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setGlThreadSpecific(gl);
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (current) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark the current context as not current, and flush
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            glFlush();
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this thread has no context attached to it
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = (int)config;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(index) >= numConfigs)
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int attrIndex;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[index].array,
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[index].size-1,
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            config_base_attribute_list,
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (window == 0)
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
11111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
11121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
11161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
11201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
11241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
11281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
11321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // (it's possible that the surface is not fully initialized)
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // maybe this should be done after the page-flip
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_surface_t* surface;
11461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
11471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            static_cast<android_native_window_t*>(window));
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap == 0)
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
11801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
11811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
11851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
11891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
11931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
11971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
12011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap->format != pixelFormat)
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const EGLint *attrib_list)
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
12331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
12441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
12451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
12491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
12531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
12571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
12611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
12651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t w = 0;
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t h = 0;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (attrib_list[0]) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attrib_list+=2;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Initialization
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // this just needs to be done once
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gGLKey == -1) {
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gGLKey == -1)
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d.type = display;
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dpy;
13181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_NO_DISPLAY;
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
13261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
13291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initialize stuff here if needed
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res == EGL_TRUE) {
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// configuration
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs,
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint config_size, EGLint *num_config)
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!configs) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = numConfigs;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint i;
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *configs++ = (EGLConfig)i;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = i;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint *num_config)
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_FALSE);
13881badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich
13891badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(num_config==0)) {
13901badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
13911badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    }
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13931badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = 0;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numAttributes = 0;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        numAttributes++;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attr = *attrib_list++;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint val  = *attrib_list++;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(possibleMatch & (1<<i)))
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                possibleMatch &= ~(1<<i);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // now, handle the attributes which have a useful default value
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // see if this attribute was specified, if not apply its
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // default value
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (binarySearch<config_pair_t>(
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (config_pair_t const*)attrib_list,
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, numAttributes,
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_defaults[j].key) < 0)
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(possibleMatch & (1<<i)))
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (isAttributeMatching(i,
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].key,
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].value) == 0)
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    possibleMatch &= ~(1<<i);
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // return the configurations found
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int n=0;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (possibleMatch) {
14391badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        if (configs) {
14401badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
14411badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
14421badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    *configs++ = (EGLConfig)i;
14431badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    config_size--;
14441badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
14451badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
14461badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            }
14471badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        } else {
14481badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
14491badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
14501badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
14511badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = n;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     return EGL_TRUE;
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// surfaces
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativeWindowType window,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativePixmapType pixmap,
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface->dpy != dpy)
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1502430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        if (surface->ctx) {
1503430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // FIXME: this surface is current check what the spec says
1504430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->disconnect();
1505430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->ctx = 0;
1506430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        }
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (surface->dpy != dpy)
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_WIDTH:
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getWidth();
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HEIGHT:
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHeight();
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_LARGEST_PBUFFER:
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // not modified for a window or pixmap surface
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_FORMAT:
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_TARGET:
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_FALSE;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_LEVEL:
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = 0;
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_RENDER_BUFFER:
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_BACK_BUFFER;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHorizontalResolution();
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getVerticalResolution();
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wr = surface->getHorizontalResolution();
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int hr = surface->getVerticalResolution();
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
15661473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            *value = surface->getSwapBehavior();
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ret;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->dpy = dpy;
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->config = config;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->read = 0;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->draw = 0;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)gl;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLSurface read, EGLContext ctx)
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (draw) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s->dpy != dpy)
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: check that draw and read are compatible with the context
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
16161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if we're detaching, we need the current context
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1632430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // one of the surface is bound to a context in another thread
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (makeCurrent(gl) == 0) {
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctx) {
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1643430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
1644430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->draw) {
1645430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                reinterpret_cast<egl_surface_t*>(c->draw)->disconnect();
1646430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1647430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->read) {
1648430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1649430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1650430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->draw = draw;
1652430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            c->read = read;
1653430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint w = 0;
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint h = 0;
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (draw) {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w = d->getWidth();
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    h = d->getHeight();
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d) {
1667430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                d->connect();
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->ctx = ctx;
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->bindDrawSurface(gl);
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (r) {
1672430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: lock/connect the read surface too
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->ctx = ctx;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->bindReadSurface(gl);
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if surfaces were bound to the context bound to this thread
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark then as unbound.
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current_ctx) {
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1683430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (d) {
168436432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->draw = 0;
1685430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1686430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->disconnect();
1687430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
1688430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (r) {
168936432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->read = 0;
1690430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1691430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1692430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // EGL_NO_CONTEXT is returned.
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (readdraw == EGL_READ) {
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->read;
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->draw;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->dpy;
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // respect to which the context was created
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitGL(void)
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->dpy != dpy)
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // post the surface
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d->swapBuffers();
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if it's bound to a context, update the buffer
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if this surface is also the read surface of the context
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The EGL spec is a little unclear about this.
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->read == draw) {
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            NativePixmapType target)
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCopyBuffers()
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint eglGetError(void)
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getError();
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (name) {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VENDOR:
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVendorString;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERSION:
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVersionString;
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_EXTENSIONS:
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gExtensionsString;
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CLIENT_APIS:
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gClientApiString;
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.1
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSurfaceAttrib()
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindTexImage(
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglBindTexImage()
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseTexImage()
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSwapInterval()
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.2
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLenum eglQueryAPI(void)
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_OPENGL_ES_API;
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitClient(void)
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    glFinish();
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseThread()
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// EGL_EGLEXT_VERSION 3
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return map[i].address;
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19111473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
19121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        const EGLint *attrib_list)
19131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
19141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
19151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
19161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
19171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19181473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
19191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
19201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
19211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
19221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
19231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19241473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
19251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
19261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
19271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
19281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
19291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
19301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
19311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
19321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
19331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
19341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
19351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
19361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
19381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
19401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
19411473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19421473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
19431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1944af9a515299b24031c7aa77bf163d0985cc862069Mathias Agopian
19451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
19461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (EGLImageKHR)native_buffer;
19471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
19481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19491473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
19501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
19511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
19521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
19541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
19561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
19581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19591473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
19611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19631473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
19641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
19651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_TRUE;
19661473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
19672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
19682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
19692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ANDROID extensions
19702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
19712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
19722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
19732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
19742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
19752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
19782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
19792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (d->dpy != dpy)
19802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
19822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // post the surface
19832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    d->setSwapRectangle(left, top, width, height);
19842e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
19852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
19862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
1987