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