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