egl.cpp revision abac01052c1c40f8582fe9f010c2efe6013e25c6
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
4468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian#include <hardware/copybit.h>
4568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "context.h"
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "state.h"
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "texture.h"
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "matrix.h"
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#undef NELEM
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x)))
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace gl {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpthread_key_t gGLKey = -1;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace gl
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic T setError(GLint error, T returnValue) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1)) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gErrorKeyMutex);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gEGLErrorKey == -1)
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gEGLErrorKey, NULL);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gErrorKeyMutex);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)error);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnValue;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic GLint getError() {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ggl_unlikely(gEGLErrorKey == -1))
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_SUCCESS;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint error = (GLint)pthread_getspecific(gEGLErrorKey);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return error;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_display_t
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t() : type(0), initialized(0) { }
941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static egl_display_t& get_display(EGLDisplay dpy);
961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static EGLBoolean is_valid(EGLDisplay dpy) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NativeDisplayType   type;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    volatile int32_t    initialized;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS];
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return gDisplays[uintptr_t(dpy)-1U];
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_context_t {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IS_CURRENT      =   0x00010000,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NEVER_CURRENT   =   0x00020000
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            flags;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          read;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLSurface          draw;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline egl_context_t* context(EGLContext ctx) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return static_cast<egl_context_t*>(gl->rasterizer.base);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_surface_t
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PAGE_FLIP = 0x00000001,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MAGIC     = 0x31415265
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t            magic;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLDisplay          dpy;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLConfig           config;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext          ctx;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     ~egl_surface_t();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     bool    isValid() const = 0;
1451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl) = 0;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl) = 0;
148abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    virtual     EGLBoolean  connect() { return EGL_TRUE; }
149430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        disconnect() {}
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const = 0;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const = 0;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
1582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
159c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    virtual     EGLClientBuffer getRenderBuffer() const;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface              depth;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy,
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat)
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : magic(MAGIC), dpy(dpy), config(config), ctx(0)
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.version = sizeof(GGLSurface);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.data = 0;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    depth.format = depthFormat;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_surface_t::~egl_surface_t()
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    magic = 0;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(depth.data);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (60 * EGL_DISPLAY_SCALING);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_BUFFER_PRESERVED;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1932e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_surface_t::setSwapRectangle(
1942e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
1952e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
1962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_FALSE;
1972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
198c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const {
199c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return 0;
200c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_window_surface_v2_t(
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
2091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            android_native_window_t* window);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian     ~egl_window_surface_v2_t();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  swapBuffers();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
217abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    virtual     EGLBoolean  connect();
218430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    virtual     void        disconnect();
2195b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    virtual     EGLint      getWidth() const    { return width;  }
2205b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    virtual     EGLint      getHeight() const   { return height; }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHorizontalResolution() const;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getVerticalResolution() const;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getRefreshRate() const;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getSwapBehavior() const;
2252e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    virtual     EGLBoolean  setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h);
226c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    virtual     EGLClientBuffer  getRenderBuffer() const;
227c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
229430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    status_t lock(android_native_buffer_t* buf, int usage, void** vaddr);
230dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    status_t unlock(android_native_buffer_t* buf);
2311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_window_t*   nativeWindow;
2321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t*   buffer;
2332e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    android_native_buffer_t*   previousBuffer;
234dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    gralloc_module_t const*    module;
23568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    copybit_device_t*          blitengine;
2361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int width;
2371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    int height;
238430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    void* bits;
2392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    GGLFormat const* pixelFormatTable;
2402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2412e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Rect {
2422e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect() { };
2432e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t w, int32_t h)
2442e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(0), top(0), right(w), bottom(h) { }
2452e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Rect(int32_t l, int32_t t, int32_t r, int32_t b)
2462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            : left(l), top(t), right(r), bottom(b) { }
2472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect& andSelf(const Rect& r) {
2482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            left   = max(left, r.left);
2492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            top    = max(top, r.top);
2502e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            right  = min(right, r.right);
2512e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            bottom = min(bottom, r.bottom);
2522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return *this;
2532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
2552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return (left>=right || top>=bottom);
2562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2572e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        void dump(char const* what) {
2582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            LOGD("%s { %5d, %5d, w=%5d, h=%5d }",
2592e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    what, left, top, right-left, bottom-top);
2602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
2612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t left;
2632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t top;
2642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t right;
2652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        int32_t bottom;
2662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
2672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
2682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    struct Region {
2692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        inline Region() : count(0) { }
27068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        typedef Rect const* const_iterator;
27168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const_iterator begin() const { return storage; }
27268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const_iterator end() const { return storage+count; }
2732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        static Region subtract(const Rect& lhs, const Rect& rhs) {
2742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Region reg;
2752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            Rect* storage = reg.storage;
2762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!lhs.isEmpty()) {
2772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.top < rhs.top) { // top rect
2782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
2792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->top    = lhs.top;
2802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
28168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    storage->bottom = rhs.top;
2822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
2832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
28468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                const int32_t top = max(lhs.top, rhs.top);
28568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                const int32_t bot = min(lhs.bottom, rhs.bottom);
28668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                if (top < bot) {
28768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    if (lhs.left < rhs.left) { // left-side rect
28868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->left   = lhs.left;
28968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->top    = top;
29068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->right  = rhs.left;
29168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->bottom = bot;
29268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage++;
29368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    }
29468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    if (lhs.right > rhs.right) { // right-side rect
29568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->left   = rhs.right;
29668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->top    = top;
29768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->right  = lhs.right;
29868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage->bottom = bot;
29968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        storage++;
30068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    }
3012e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
3022e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lhs.bottom > rhs.bottom) { // bottom rect
3032e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->left   = lhs.left;
30468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    storage->top    = rhs.bottom;
3052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->right  = lhs.right;
3062e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage->bottom = lhs.bottom;
3072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    storage++;
3082e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
3092e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                reg.count = storage - reg.storage;
3102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
3112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return reg;
3122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3132e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        bool isEmpty() const {
3142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            return count<=0;
3152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
3162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    private:
3172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        Rect storage[4];
3182e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        ssize_t count;
3192e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    };
3202e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
32168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    struct region_iterator : public copybit_region_t {
32268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        region_iterator(const Region& region)
32368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            : b(region.begin()), e(region.end()) {
32468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            this->next = iterate;
32568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
32668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    private:
32768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        static int iterate(copybit_region_t const * self, copybit_rect_t* rect) {
32868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            region_iterator const* me = static_cast<region_iterator const*>(self);
32968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (me->b != me->e) {
33068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                *reinterpret_cast<Rect*>(rect) = *me->b++;
33168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                return 1;
33268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            }
33368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            return 0;
33468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
33568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        mutable Region::const_iterator b;
33668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator const e;
33768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    };
33868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
3392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    void copyBlt(
3402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* dst, void* dst_vaddr,
3412e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            android_native_buffer_t* src, void const* src_vaddr,
34268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            const Region& clip);
3432e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3442e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect dirtyRegion;
3452e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    Rect oldDirtyRegion;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy,
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
3511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        android_native_window_t* window)
352dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    : egl_surface_t(dpy, config, depthFormat),
3532e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    nativeWindow(window), buffer(0), previousBuffer(0), module(0),
35468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    blitengine(0), bits(NULL)
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
356dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_module_t const* pModule;
357dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule);
358dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    module = reinterpret_cast<gralloc_module_t const*>(pModule);
359dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
36068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) {
36168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_open(pModule, &blitengine);
36268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    }
36368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
3642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    pixelFormatTable = gglGetPixelFormatTable();
3652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the window
3671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->common.incRef(&nativeWindow->common);
3685b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width);
3695b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height);
3705b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian}
3711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
3725b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() {
3735b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (buffer) {
3745b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer->common.decRef(&buffer->common);
3755b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3765b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (previousBuffer) {
3775b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
3785b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3795b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->common.decRef(&nativeWindow->common);
3805b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (blitengine) {
3815b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        copybit_close(blitengine);
3825b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
3835b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian}
3845b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian
385abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect()
3865b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian{
3872e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a buffer
388abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) {
389abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ALLOC, EGL_FALSE);
390abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    }
3912e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
3922e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // allocate a corresponding depth-buffer
3931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    width = buffer->width;
3941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    height = buffer->height;
3955b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (depth.format) {
3961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.width   = width;
3971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        depth.height  = height;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
401abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian            return setError(EGL_BAD_ALLOC, EGL_FALSE);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
4052e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
4061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer->common.incRef(&buffer->common);
4072e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
408dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    // Lock the buffer
409430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
4102e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // pin the buffer down
4112e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
4122e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
41368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        LOGE("connect() failed to lock buffer %p (%ux%u)",
4142e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
415abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
4162e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
4172e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
418abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    return EGL_TRUE;
419430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian}
420430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
421430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopianvoid egl_window_surface_v2_t::disconnect()
422430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian{
42336432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian    if (buffer && bits) {
424430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        bits = NULL;
425430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        unlock(buffer);
426430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    }
4275b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    // enqueue the last frame
4285b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
4295b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (buffer) {
4305b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer->common.decRef(&buffer->common);
4315b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        buffer = 0;
4325b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
4335b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    if (previousBuffer) {
4345b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
4355b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian        previousBuffer = 0;
4365b5c9144872b4e31ba5a041dce585a8ddbbe495dMathias Agopian    }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
439dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::lock(
440430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        android_native_buffer_t* buf, int usage, void** vaddr)
441dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
442e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian    int err = module->lock(module, buf->handle,
443430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            usage, 0, 0, buf->width, buf->height, vaddr);
444dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
445dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
446dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
447dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf)
448dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian{
449abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (!buf) return BAD_VALUE;
450e633f9339a2556771c79c784b0b23a9aade30485Mathias Agopian    int err = module->unlock(module, buf->handle);
451dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    return err;
452dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian}
453dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
4542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopianvoid egl_window_surface_v2_t::copyBlt(
4552e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* dst, void* dst_vaddr,
4562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        android_native_buffer_t* src, void const* src_vaddr,
45768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const Region& clip)
4582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
4592e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // FIXME: use copybit if possible
4602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // NOTE: dst and src must be the same format
4612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
46268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    status_t err = NO_ERROR;
46368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    copybit_device_t* const copybit = blitengine;
46468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (copybit)  {
46568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_image_t simg;
46668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.w = src->width;
46768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.h = src->height;
46868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.format = src->format;
46968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        simg.handle = const_cast<native_handle_t*>(src->handle);
47068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
47168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit_image_t dimg;
47268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.w = dst->width;
47368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.h = dst->height;
47468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.format = dst->format;
47568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        dimg.handle = const_cast<native_handle_t*>(dst->handle);
47668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
47768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
47868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255);
47968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
48068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        region_iterator it(clip);
48168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        err = copybit->blit(copybit, &dimg, &simg, &it);
48268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        if (err != NO_ERROR) {
48368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            LOGE("copybit failed (%s)", strerror(err));
48468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        }
48568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    }
486dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian
48768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian    if (!copybit || err) {
48868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator cur = clip.begin();
48968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        Region::const_iterator end = clip.end();
49068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
49168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t bpp = pixelFormatTable[src->format].size;
49268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t dbpr = dst->stride * bpp;
49368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        const size_t sbpr = src->stride * bpp;
49468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
49568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        uint8_t const * const src_bits = (uint8_t const *)src_vaddr;
49668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        uint8_t       * const dst_bits = (uint8_t       *)dst_vaddr;
49768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian
49868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian        while (cur != end) {
49968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            const Rect& r(*cur++);
50068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            ssize_t w = r.right - r.left;
50168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            ssize_t h = r.bottom - r.top;
50268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (w <= 0 || h<=0) continue;
50368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            size_t size = w * bpp;
50468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp;
50568eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            uint8_t       * d = dst_bits + (r.left + dst->stride * r.top) * bpp;
50668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            if (dbpr==sbpr && size==sbpr) {
50768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                size *= h;
50868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                h = 1;
50968eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            }
51068eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            do {
51168eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                memcpy(d, s, size);
51268eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                d += dbpr;
51368eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                s += sbpr;
51468eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian            } while (--h > 0);
5152e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
5161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5191473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers()
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
521abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    if (!buffer) {
522abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
523abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian    }
524abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian
5252e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
5262e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * Handle eglSetSwapRectangleANDROID()
5272e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * We copyback from the front buffer
5282e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
5292e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (!dirtyRegion.isEmpty()) {
5302e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        dirtyRegion.andSelf(Rect(buffer->width, buffer->height));
5312e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        if (previousBuffer) {
5322e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion));
5332e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            if (!copyBack.isEmpty()) {
5342e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                void* prevBits;
5352e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                if (lock(previousBuffer,
53668eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                        GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) {
53768eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    // copy from previousBuffer to buffer
53868eeb80a54f411b9a8c928cc193de731adddb6c3Mathias Agopian                    copyBlt(buffer, bits, previousBuffer, prevBits, copyBack);
5392e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                    unlock(previousBuffer);
5402e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                }
5412e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            }
5422e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        }
5432e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        oldDirtyRegion = dirtyRegion;
5442e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5462e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (previousBuffer) {
5472e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer->common.decRef(&previousBuffer->common);
5482e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        previousBuffer = 0;
5492e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
551dff8e58d47ede6e748c0b02e128ca33b42a4f362Mathias Agopian    unlock(buffer);
5522e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    previousBuffer = buffer;
5531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->queueBuffer(nativeWindow, buffer);
5542e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer = 0;
5551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5562e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // dequeue a new buffer
5571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->dequeueBuffer(nativeWindow, &buffer);
5582e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5591473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // TODO: lockBuffer should rather be executed when the very first
5601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    // direct rendering occurs.
5611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    nativeWindow->lockBuffer(nativeWindow, buffer);
5621473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
5632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // reallocate the depth-buffer if needed
5641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if ((width != buffer->width) || (height != buffer->height)) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: we probably should reset the swap rect here
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if the window size has changed
5671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        width = buffer->width;
5681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        height = buffer->height;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data) {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            free(depth.data);
5711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.width   = width;
5721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.height  = height;
5731473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            depth.stride  = buffer->stride;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (depth.data == 0) {
5762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                setError(EGL_BAD_ALLOC, EGL_FALSE);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return EGL_FALSE;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // keep a reference on the buffer
5832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    buffer->common.incRef(&buffer->common);
5842e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // finally pin the buffer down
5862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN |
5872e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian            GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) {
5882e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)",
5892e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian                buffer, buffer->width, buffer->height);
590abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian        return setError(EGL_BAD_ACCESS, EGL_FALSE);
5912e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        // FIXME: we should make sure we're not accessing the buffer anymore
5922e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    }
5932e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5942e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
5952e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
5962e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
5972e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle(
5982e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint l, EGLint t, EGLint w, EGLint h)
5992e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
6002e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    dirtyRegion = Rect(l, t, l+w, t+h);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
604c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const
605c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian{
606c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return buffer;
607c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
608c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
6091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
6101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) {
612c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    // Hardware supported
6131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    switch (format) {
6141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case HAL_PIXEL_FORMAT_RGB_565:
615c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_8888:
616c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_4444:
617c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_RGBA_5551:
618c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    case HAL_PIXEL_FORMAT_BGRA_8888:
6191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return true;
6201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
621c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return false;
6221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
6231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif
6241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
6251473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl)
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
6301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
6311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
632430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits;
6331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
637350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian
6381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS
639350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian    gl->copybits.drawSurfaceBuffer = 0;
640a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian    if (gl->copybits.blitEngine != NULL) {
641a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian        if (supportedCopybitsDestinationFormat(buffer.format)) {
642a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian            buffer_handle_t handle = this->buffer->handle;
643a2fb72e08f41a67bbed534eb1035ba5bfc2df0e1Mathias Agopian            if (handle != NULL) {
644350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian                gl->copybits.drawSurfaceBuffer = handle;
6451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            }
6461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        }
6471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
6481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS
649350d651706d8f484d9aeb539d491526f822fa84aMathias Agopian
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6521473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl)
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
6561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.width   = this->buffer->width;
6571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.height  = this->buffer->height;
6581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.stride  = this->buffer->stride;
659430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian    buffer.data    = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!!
6601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    buffer.format  = this->buffer->format;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6641473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6671473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6701473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const {
6711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (60 * EGL_DISPLAY_SCALING); // FIXME
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const
6742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
6752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    /*
6762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves
6772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * the content of the swapped buffer.
6782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * EGL_BUFFER_DESTROYED means that the content of the buffer is lost.
6802e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6812e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED
6822e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * only applies to the area specified by eglSetSwapRectangleANDROID(), that
6832e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * is, everything outside of this area is preserved.
6842e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6852e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     * This implementation of EGL assumes the later case.
6862e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     *
6872e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian     */
6882e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
6891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_BUFFER_DESTROYED;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pixmap_surface_t(
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config,
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t depthFormat,
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_native_pixmap_t const * pixmap);
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pixmap_surface_t() { }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return nativePixmap.width;  }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return nativePixmap.height; }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_native_pixmap_t     nativePixmap;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy,
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config,
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t depthFormat,
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_native_pixmap_t const * pixmap)
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap)
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pixmap->width;
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pixmap->height;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl)
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
7381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &buffer);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl)
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface buffer;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.version = sizeof(GGLSurface);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.width   = nativePixmap.width;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.height  = nativePixmap.height;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.stride  = nativePixmap.stride;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.data    = nativePixmap.data;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    buffer.format  = nativePixmap.format;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &buffer);
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_pbuffer_surface_t(
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            EGLDisplay dpy, EGLConfig config, int32_t depthFormat,
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int32_t w, int32_t h, int32_t f);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual ~egl_pbuffer_surface_t();
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7671473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    virtual     bool        isValid() const { return pbuffer.data != 0; }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindDrawSurface(ogles_context_t* gl);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLBoolean  bindReadSurface(ogles_context_t* gl);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getWidth() const    { return pbuffer.width;  }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     EGLint      getHeight() const   { return pbuffer.height; }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GGLSurface  pbuffer;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy,
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLConfig config, int32_t depthFormat,
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t w, int32_t h, int32_t f)
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : egl_surface_t(dpy, config, depthFormat)
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t size = w*h;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (f) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_A_8:          size *= 1; break;
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGB_565:      size *= 2; break;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GGL_PIXEL_FORMAT_RGBA_8888:    size *= 4; break;
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGE("incompatible pixel format for pbuffer (format=%d)", f);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pbuffer.data = 0;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.version = sizeof(GGLSurface);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.width   = w;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.height  = h;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.stride  = w;
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.data    = (GGLubyte*)malloc(size);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pbuffer.format  = f;
7971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depthFormat) {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.width   = pbuffer.width;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.height  = pbuffer.height;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.stride  = depth.width; // use the width here
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depth.data    = (GGLubyte*)malloc(depth.stride*depth.height*2);
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (depth.data == 0) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    free(pbuffer.data);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl)
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.colorBuffer(gl, &pbuffer);
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (depth.data != gl->rasterizer.state.buffers.depth.data)
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gl->rasterizer.procs.depthBuffer(gl, &depth);
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl)
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gl->rasterizer.procs.readBuffer(gl, &pbuffer);
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_pair_t {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint value;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct configs_t {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const config_pair_t* array;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int                  size;
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct config_management_t {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint key;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool (*match)(GLint reqValue, GLint confValue);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool atLeast(GLint reqValue, GLint confValue) {
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool exact(GLint reqValue, GLint confValue) {
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (reqValue == EGL_DONT_CARE) || (confValue == reqValue);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static bool mask(GLint reqValue, GLint confValue) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (confValue & reqValue) == reqValue;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MAJOR 1
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define VERSION_MINOR 2
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gVendorString     = "Google Inc.";
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gVersionString    = "1.2 Android Driver";
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic char const * const gClientApiString  = "OpenGL ES";
8581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopianstatic char const * const gExtensionsString =
859927d37cb788670b91af0f1a7a93c68046a838d23Mathias Agopian        "EGL_KHR_image_base "
8601473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        // "KHR_image_pixmap "
8611473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        "EGL_ANDROID_image_native_buffer "
8622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        "EGL_ANDROID_swap_rectangle "
863c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        "EGL_ANDROID_get_render_buffer "
8641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        ;
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct extention_map_t {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char * const name;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    __eglMustCastToProperFunctionPointerType address;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = {
8741473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsOES",
8751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES },
8761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexiOES",
8771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES },
8781473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfOES",
8791473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES },
8801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxOES",
8811473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES },
8821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexsvOES",
8831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES },
8841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexivOES",
8851473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES },
8861473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexfvOES",
8871473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES },
8881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDrawTexxvOES",
8891473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES },
8901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glQueryMatrixxOES",
8911473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES },
8921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetTexture2DOES",
8931473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES },
8941473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glEGLImageTargetRenderbufferStorageOES",
8951473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES },
8961473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanef",
8971473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanef },
8981473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glClipPlanex",
8991473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glClipPlanex },
9001473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBindBuffer",
9011473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBindBuffer },
9021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferData",
9031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferData },
9041473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glBufferSubData",
9051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glBufferSubData },
9061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glDeleteBuffers",
9071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers },
9081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    { "glGenBuffers",
9091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            (__eglMustCastToProperFunctionPointerType)&glGenBuffers },
910c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglCreateImageKHR",
911c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR },
912c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglDestroyImageKHR",
913c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR },
914c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglSetSwapRectangleANDROID",
915c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID },
916c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    { "eglGetRenderBufferANDROID",
917c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian            (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID },
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian/*
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In the lists below, attributes names MUST be sorted.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Additionally, all configs must be sorted according to
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the EGL specification.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               0                                 },
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              EGL_SLOW_CONFIG                   },
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      0                                 },
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         GGL_MAX_VIEWPORT_DIMS             },
9311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        { EGL_MAX_PBUFFER_PIXELS,
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS                 },
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          GGL_MAX_VIEWPORT_DIMS             },
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          EGL_TRUE                          },
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           0                                 },
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         GGL_PIXEL_FORMAT_RGB_565          },
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    0                                 },
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             0                                 },
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           EGL_NONE                          },
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     0                                 },
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    0                                 },
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      0                                 },
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       EGL_FALSE                         },
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        EGL_FALSE                         },
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          1                                 },
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          4                                 },
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These configs can override the base attribute list
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface()
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        0 },
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     16 },
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       0 },
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        5 },
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       6 },
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         5 },
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        1 },
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        2 },
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,     32 },
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        8 },
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       8 },
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         8 },
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        3 },
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,       0 },
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        4 },
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,      8 },
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,       8 },
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,        0 },
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,       0 },
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,         0 },
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,      16 },
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,        5 },
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,     EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT },
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic configs_t const gConfigs[] = {
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_0_attribute_list, NELEM(config_0_attribute_list) },
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_1_attribute_list, NELEM(config_1_attribute_list) },
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_2_attribute_list, NELEM(config_2_attribute_list) },
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_3_attribute_list, NELEM(config_3_attribute_list) },
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_4_attribute_list, NELEM(config_4_attribute_list) },
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { config_5_attribute_list, NELEM(config_5_attribute_list) },
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_management_t const gConfigManagement[] = {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BUFFER_SIZE,                config_management_t::atLeast },
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_ALPHA_SIZE,                 config_management_t::atLeast },
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BLUE_SIZE,                  config_management_t::atLeast },
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_GREEN_SIZE,                 config_management_t::atLeast },
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_RED_SIZE,                   config_management_t::atLeast },
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_DEPTH_SIZE,                 config_management_t::atLeast },
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_STENCIL_SIZE,               config_management_t::atLeast },
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_CAVEAT,              config_management_t::exact   },
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_CONFIG_ID,                  config_management_t::exact   },
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_LEVEL,                      config_management_t::exact   },
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_HEIGHT,         config_management_t::exact   },
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_PIXELS,         config_management_t::exact   },
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_PBUFFER_WIDTH,          config_management_t::exact   },
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_RENDERABLE,          config_management_t::exact   },
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_ID,           config_management_t::exact   },
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_NATIVE_VISUAL_TYPE,         config_management_t::exact   },
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLES,                    config_management_t::exact   },
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SAMPLE_BUFFERS,             config_management_t::exact   },
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,               config_management_t::mask    },
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_TYPE,           config_management_t::exact   },
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_BLUE_VALUE,     config_management_t::exact   },
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_GREEN_VALUE,    config_management_t::exact   },
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_TRANSPARENT_RED_VALUE,      config_management_t::exact   },
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGBA,       config_management_t::exact   },
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_BIND_TO_TEXTURE_RGB,        config_management_t::exact   },
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MIN_SWAP_INTERVAL,          config_management_t::exact   },
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_MAX_SWAP_INTERVAL,          config_management_t::exact   },
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic config_pair_t const config_defaults[] = {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        { EGL_SURFACE_TYPE,        EGL_WINDOW_BIT },
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename T>
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key)
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   while (first <= last) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       int mid = (first + last) / 2;
10681473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       if (key > sortedArray[mid].key) {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           first = mid + 1;
10701473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian       } else if (key < sortedArray[mid].key) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           last = mid - 1;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       } else {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project           return mid;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   return -1;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val)
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // look for the attribute in all of our configs
10821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    config_pair_t const* configFound = gConfigs[i].array;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = binarySearch<config_pair_t>(
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[i].array,
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[i].size-1,
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attr);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index < 0) {
10881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        configFound = config_base_attribute_list;
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        index = binarySearch<config_pair_t>(
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_base_attribute_list,
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(config_base_attribute_list)-1,
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (index >= 0) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // attribute found, check if this config could match
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int cfgMgtIndex = binarySearch<config_management_t>(
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gConfigManagement,
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, NELEM(gConfigManagement)-1,
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attr);
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index >= 0) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool match = gConfigManagement[cfgMgtIndex].match(
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val, configFound[index].value);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (match) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this config matches
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return 1;
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // attribute not found. this should NEVER happen.
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // error, this attribute doesn't exist
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl)
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific();
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gl) {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(gl);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->flags & egl_context_t::IS_CURRENT) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current != gl) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it is an error to set a context current, if it's already
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // current to another thread
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return -1;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current) {
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // mark the current context as not current, and flush
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                glFlush();
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(c->flags & egl_context_t::IS_CURRENT)) {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The context is not current, make it current!
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setGlThreadSpecific(gl);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->flags |= egl_context_t::IS_CURRENT;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (current) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark the current context as not current, and flush
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            glFlush();
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT;
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this thread has no context attached to it
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config,
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t numConfigs =  NELEM(gConfigs);
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int index = (int)config;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (uint32_t(index) >= numConfigs)
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_CONFIG, EGL_FALSE);
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int attrIndex;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gConfigs[index].array,
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, gConfigs[index].size-1,
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = gConfigs[index].array[attrIndex].value;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    attrIndex = binarySearch<config_pair_t>(
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            config_base_attribute_list,
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            0, NELEM(config_base_attribute_list)-1,
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            attribute);
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (attrIndex>=0) {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *value = config_base_attribute_list[attrIndex].value;
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config,
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativeWindowType window, const EGLint *attrib_list)
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (window == 0)
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_WINDOW_BIT))
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
12021473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
12031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
12071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
12111473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
12151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
12191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
12231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // FIXME: we don't have access to the pixelFormat here just yet.
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // (it's possible that the surface is not fully initialized)
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // maybe this should be done after the page-flip
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //if (EGLint(info.format) != pixelFormat)
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //    return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    egl_surface_t* surface;
12371473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    surface = new egl_window_surface_v2_t(dpy, config, depthFormat,
12381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            static_cast<android_native_window_t*>(window));
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config,
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NativePixmapType pixmap, const EGLint *attrib_list)
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap == 0)
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PIXMAP_BIT))
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
12711473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
12721473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
12761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
12801473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
12841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
12881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
12921473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (pixmap->format != pixelFormat)
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pixmap_surface_t(dpy, config, depthFormat,
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                static_cast<egl_native_pixmap_t*>(pixmap));
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config,
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const EGLint *attrib_list)
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint surfaceType;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE)
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!(surfaceType & EGL_PBUFFER_BIT))
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLint configID;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE)
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_FALSE;
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t depthFormat;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t pixelFormat;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(configID) {
13351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    case 0:
13361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 1:
13401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGB_565;
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 2:
13441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 3:
13481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 4:
13521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = 0;
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case 5:
13561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        pixelFormat = GGL_PIXEL_FORMAT_A_8;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        depthFormat = GGL_PIXEL_FORMAT_Z_16;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_NO_SURFACE);
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t w = 0;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t h = 0;
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (attrib_list[0]) {
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_WIDTH)  w = attrib_list[1];
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1];
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        attrib_list+=2;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* surface =
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat);
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!surface->isValid()) {
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // there was a problem in the ctor, the error
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flag has been set.
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        surface = 0;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return surface;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Initialization
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display)
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef HAVE_ANDROID_OS
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // this just needs to be done once
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gGLKey == -1) {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_lock(&gInitMutex);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (gGLKey == -1)
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_key_create(&gGLKey, NULL);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pthread_mutex_unlock(&gInitMutex);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (display == EGL_DEFAULT_DISPLAY) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy = (EGLDisplay)1;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_display_t& d = egl_display_t::get_display(dpy);
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d.type = display;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return dpy;
14091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_NO_DISPLAY;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
14201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_inc(&d.initialized) == 0) {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // initialize stuff here if needed
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res == EGL_TRUE) {
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (major != NULL) *major = VERSION_MAJOR;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (minor != NULL) *minor = VERSION_MINOR;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy)
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean res = EGL_TRUE;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_display_t& d = egl_display_t::get_display(dpy);
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (android_atomic_dec(&d.initialized) == 1) {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: destroy all resources (surfaces, contexts, etc...)
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_lock(&gInitMutex);
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //pthread_mutex_unlock(&gInitMutex);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// configuration
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigs(   EGLDisplay dpy,
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs,
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint config_size, EGLint *num_config)
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint numConfigs = NELEM(gConfigs);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!configs) {
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = numConfigs;
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GLint i;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (i=0 ; i<numConfigs && i<config_size ; i++) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *configs++ = (EGLConfig)i;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = i;
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLConfig *configs, EGLint config_size,
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint *num_config)
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
14791badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich
14801badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(num_config==0)) {
14811badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
14821badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    }
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14841badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich    if (ggl_unlikely(attrib_list==0)) {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *num_config = 0;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14881473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numAttributes = 0;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int numConfigs =  NELEM(gConfigs);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t possibleMatch = (1<<numConfigs)-1;
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while(possibleMatch && *attrib_list != EGL_NONE) {
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        numAttributes++;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attr = *attrib_list++;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint val  = *attrib_list++;
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0 ; i<numConfigs ; i++) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(possibleMatch & (1<<i)))
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isAttributeMatching(i, attr, val) == 0) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                possibleMatch &= ~(1<<i);
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // now, handle the attributes which have a useful default value
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t j=0 ; j<NELEM(config_defaults) ; j++) {
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // see if this attribute was specified, if not apply its
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // default value
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (binarySearch<config_pair_t>(
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (config_pair_t const*)attrib_list,
1511ab1cf3efd3b884a90170a82744f7ae508d51cf6eMathias Agopian                0, numAttributes-1,
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                config_defaults[j].key) < 0)
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0 ; i<numConfigs ; i++) {
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!(possibleMatch & (1<<i)))
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (isAttributeMatching(i,
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].key,
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        config_defaults[j].value) == 0)
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    possibleMatch &= ~(1<<i);
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // return the configurations found
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int n=0;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (possibleMatch) {
15301badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        if (configs) {
15311badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; config_size && i<numConfigs ; i++) {
15321badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
15331badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    *configs++ = (EGLConfig)i;
15341badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    config_size--;
15351badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
15361badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
15371badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            }
15381badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich        } else {
15391badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich            for (int i=0 ; i<numConfigs ; i++) {
15401badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                if (possibleMatch & (1<<i)) {
15411badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                    n++;
15421badb712b94f5d4a14ca8c3bdb55c215a4915000Jack Palevich                }
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    *num_config = n;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     return EGL_TRUE;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLint attribute, EGLint *value)
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getConfigAttrib(dpy, config, attribute, value);
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// surfaces
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreateWindowSurface(  EGLDisplay dpy, EGLConfig config,
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativeWindowType window,
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createWindowSurface(dpy, config, window, attrib_list);
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15691473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePixmapSurface(  EGLDisplay dpy, EGLConfig config,
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    NativePixmapType pixmap,
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPixmapSurface(dpy, config, pixmap, attrib_list);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const EGLint *attrib_list)
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return createPbufferSurface(dpy, config, attrib_list);
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (eglSurface != EGL_NO_SURFACE) {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) );
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface->magic != egl_surface_t::MAGIC)
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_SURFACE, EGL_FALSE);
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (surface->dpy != dpy)
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
1593430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        if (surface->ctx) {
1594430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // FIXME: this surface is current check what the spec says
1595430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->disconnect();
1596430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            surface->ctx = 0;
1597430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian        }
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete surface;
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface,
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
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    egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface);
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (surface->dpy != dpy)
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLBoolean ret = EGL_TRUE;
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value);
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_WIDTH:
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getWidth();
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HEIGHT:
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHeight();
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_LARGEST_PBUFFER:
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // not modified for a window or pixmap surface
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_FORMAT:
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_TEXTURE_TARGET:
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_NO_TEXTURE;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_TEXTURE:
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_FALSE;
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_MIPMAP_LEVEL:
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = 0;
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_RENDER_BUFFER:
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // TODO: return the real RENDER_BUFFER here
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = EGL_BACK_BUFFER;
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_HORIZONTAL_RESOLUTION:
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getHorizontalResolution();
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERTICAL_RESOLUTION:
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pixel/mm * EGL_DISPLAY_SCALING
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = surface->getVerticalResolution();
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_PIXEL_ASPECT_RATIO: {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // w/h * EGL_DISPLAY_SCALING
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int wr = surface->getHorizontalResolution();
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int hr = surface->getVerticalResolution();
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            *value = (wr * EGL_DISPLAY_SCALING) / hr;
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_SWAP_BEHAVIOR:
16571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            *value = surface->getSwapBehavior();
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ret;
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config,
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLContext share_list, const EGLint *attrib_list)
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = ogles_init(sizeof(egl_context_t));
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT);
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base);
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->flags = egl_context_t::NEVER_CURRENT;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->dpy = dpy;
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->config = config;
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->read = 0;
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->draw = 0;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)gl;
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->flags & egl_context_t::IS_CURRENT)
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setGlThreadSpecific(0);
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_uninit((ogles_context_t*)ctx);
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglMakeCurrent(  EGLDisplay dpy, EGLSurface draw,
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLSurface read, EGLContext ctx)
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (draw) {
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* s = (egl_surface_t*)draw;
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s->dpy != dpy)
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_DISPLAY, EGL_FALSE);
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: check that draw and read are compatible with the context
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext current_ctx = EGL_NO_CONTEXT;
17071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT))
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT))
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_MATCH, EGL_FALSE);
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) {
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if we're detaching, we need the current context
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        current_ctx = (EGLContext)getGlThreadSpecific();
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(ctx);
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* d = (egl_surface_t*)draw;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_surface_t* r = (egl_surface_t*)read;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((d && d->ctx && d->ctx != ctx) ||
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (r && r->ctx && r->ctx != ctx)) {
1723430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            // one of the surface is bound to a context in another thread
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return setError(EGL_BAD_ACCESS, EGL_FALSE);
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ogles_context_t* gl = (ogles_context_t*)ctx;
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (makeCurrent(gl) == 0) {
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctx) {
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_context_t* c = egl_context_t::context(ctx);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* d = (egl_surface_t*)draw;
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            egl_surface_t* r = (egl_surface_t*)read;
1734430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
1735430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->draw) {
1736430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                reinterpret_cast<egl_surface_t*>(c->draw)->disconnect();
1737430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1738430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            if (c->read) {
1739430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: unlock/disconnect the read surface too
1740430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            }
1741430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c->draw = draw;
1743430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian            c->read = read;
1744430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c->flags & egl_context_t::NEVER_CURRENT) {
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                c->flags &= ~egl_context_t::NEVER_CURRENT;
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint w = 0;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GLint h = 0;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (draw) {
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    w = d->getWidth();
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    h = d->getHeight();
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_surfaceport(gl, 0, 0);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_viewport(gl, 0, 0, w, h);
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ogles_scissor(gl, 0, 0, w, h);
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d) {
1758abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                if (d->connect() == EGL_FALSE) {
1759abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                    return EGL_FALSE;
1760abac01052c1c40f8582fe9f010c2efe6013e25c6Mathias Agopian                }
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->ctx = ctx;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d->bindDrawSurface(gl);
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (r) {
1765430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                // FIXME: lock/connect the read surface too
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->ctx = ctx;
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r->bindReadSurface(gl);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if surfaces were bound to the context bound to this thread
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // mark then as unbound.
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (current_ctx) {
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_context_t* c = egl_context_t::context(current_ctx);
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* d = (egl_surface_t*)c->draw;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                egl_surface_t* r = (egl_surface_t*)c->read;
1776430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (d) {
177736432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->draw = 0;
1778430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->ctx = EGL_NO_CONTEXT;
1779430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    d->disconnect();
1780430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
1781430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                if (r) {
178236432ccc13f6d3db7af35661683c33ffa3406d85Mathias Agopian                    c->read = 0;
1783430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    r->ctx = EGL_NO_CONTEXT;
1784430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                    // FIXME: unlock/disconnect the read surface too
1785430f2ed5c03312700131a70c858b98e1cc6bc161Mathias Agopian                }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return EGL_TRUE;
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ACCESS, EGL_FALSE);
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLContext eglGetCurrentContext(void)
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentContext returns the current EGL rendering context,
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // as specified by eglMakeCurrent. If no context is current,
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // EGL_NO_CONTEXT is returned.
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (EGLContext)getGlThreadSpecific();
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw)
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentSurface returns the read or draw surface attached
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to the current EGL rendering context, as specified by eglMakeCurrent.
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_SURFACE is returned.
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE;
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (readdraw == EGL_READ) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->read;
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (readdraw == EGL_DRAW) {
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return c->draw;
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE);
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void)
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // eglGetCurrentDisplay returns the current EGL display connection
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // for the current EGL rendering context, as specified by eglMakeCurrent.
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If no context is current, EGL_NO_DISPLAY is returned.
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    EGLContext ctx = (EGLContext)getGlThreadSpecific();
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->dpy;
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx,
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            EGLint attribute, EGLint *value)
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_context_t* c = egl_context_t::context(ctx);
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (attribute) {
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CONFIG_ID:
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Returns the ID of the EGL frame buffer configuration with
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // respect to which the context was created
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value);
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE);
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitGL(void)
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine)
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->dpy != dpy)
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // post the surface
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    d->swapBuffers();
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // if it's bound to a context, update the buffer
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (d->ctx != EGL_NO_CONTEXT) {
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        d->bindDrawSurface((ogles_context_t*)d->ctx);
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if this surface is also the read surface of the context
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // it is bound to, make sure to update the read buffer as well.
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The EGL spec is a little unclear about this.
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        egl_context_t* c = egl_context_t::context(d->ctx);
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c->read == draw) {
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d->bindReadSurface((ogles_context_t*)d->ctx);
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglCopyBuffers(  EGLDisplay dpy, EGLSurface surface,
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            NativePixmapType target)
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCopyBuffers()
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_FALSE;
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLint eglGetError(void)
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return getError();
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name)
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, (const char*)0);
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (name) {
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VENDOR:
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVendorString;
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_VERSION:
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gVersionString;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_EXTENSIONS:
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gExtensionsString;
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case EGL_CLIENT_APIS:
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return gClientApiString;
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, (const char *)0);
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.1
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSurfaceAttrib(
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSurfaceAttrib()
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindTexImage(
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglBindTexImage()
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseTexImage(
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EGLDisplay dpy, EGLSurface surface, EGLint buffer)
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseTexImage()
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval)
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglSwapInterval()
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// EGL 1.2
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api)
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (api != EGL_OPENGL_ES_API)
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLenum eglQueryAPI(void)
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_OPENGL_ES_API;
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglWaitClient(void)
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    glFinish();
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLBoolean eglReleaseThread(void)
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglReleaseThread()
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return EGL_TRUE;
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer(
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          EGLConfig config, const EGLint *attrib_list)
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE);
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: eglCreatePbufferFromClientBuffer()
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE);
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19901473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// EGL_EGLEXT_VERSION 3
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))()
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    extention_map_t const * const map = gExtentionMap;
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) {
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!strcmp(procname, map[i].name)) {
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return map[i].address;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
20031473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20041473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface,
20051473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        const EGLint *attrib_list)
20061473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20071473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
20081473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
20091473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20101473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20111473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface)
20121473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20131473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    EGLBoolean result = EGL_FALSE;
20141473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return result;
20151473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20161473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20171473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
20181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        EGLClientBuffer buffer, const EGLint *attrib_list)
20191473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20201473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
20211473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR);
20221473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20231473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (ctx != EGL_NO_CONTEXT) {
20241473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
20251473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20261473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (target != EGL_NATIVE_BUFFER_ANDROID) {
20271473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20281473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20291473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20301473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer;
20311473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20321473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
20331473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
20341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
20361473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
2037af9a515299b24031c7aa77bf163d0985cc862069Mathias Agopian
20381473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.incRef(&native_buffer->common);
20391473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return (EGLImageKHR)native_buffer;
20401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20411473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20421473f46cbc82aa6f0ba744cc896a36923823d55bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img)
20431473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian{
20441473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE) {
20451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
20461473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
20471473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20481473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    android_native_buffer_t* native_buffer = (android_native_buffer_t*)img;
20491473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20501473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC)
20511473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
20521473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20531473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    if (native_buffer->common.version != sizeof(android_native_buffer_t))
20541473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return setError(EGL_BAD_PARAMETER, EGL_FALSE);
20551473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20561473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    native_buffer->common.decRef(&native_buffer->common);
20571473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
20581473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    return EGL_TRUE;
20591473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian}
20602e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
20612e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
20622e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ANDROID extensions
20632e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian// ----------------------------------------------------------------------------
20642e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
20652e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw,
20662e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        EGLint left, EGLint top, EGLint width, EGLint height)
20672e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian{
20682e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
20692e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
20702e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
20712e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
20722e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    if (d->dpy != dpy)
20732e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian        return setError(EGL_BAD_DISPLAY, EGL_FALSE);
20742e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
20752e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    // post the surface
20762e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    d->setSwapRectangle(left, top, width, height);
20772e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian
20782e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian    return EGL_TRUE;
20792e20bffbab8084fedce39d14d7dd17b08f6e9ba2Mathias Agopian}
2080c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2081c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw)
2082c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian{
2083c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    if (egl_display_t::is_valid(dpy) == EGL_FALSE)
2084c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
2085c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2086c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    egl_surface_t* d = static_cast<egl_surface_t*>(draw);
2087c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    if (d->dpy != dpy)
2088c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian        return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0);
2089c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian
2090c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    // post the surface
2091c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian    return d->getRenderBuffer();
2092c1e3ec555b79b1e45fccbdf0bbc8ac2d51902860Mathias Agopian}
2093