1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License"); 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 193aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall#include <atomic> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 21a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <fcntl.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 23a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <stdlib.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 28a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <unistd.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 307823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 335f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian#include <ui/ANativeObjectBase.h> 34d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis#include <ui/Fence.h> 35204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza#include <ui/GraphicBufferMapper.h> 36a9347647eca3101c014be902b713772de3977d87Mathias Agopian#include <ui/Rect.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 545f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian// ---------------------------------------------------------------------------- 554b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 564b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 574b9511c16195a646242eff833b0af212933b6ecaMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height); 584b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 615f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 696071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 83444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)error); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 90444839b842798497cfa326204285a4f2ca2362afColin Cross GLint error = (GLint)(uintptr_t)pthread_getspecific(gEGLErrorKey); 912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis if (error == 0) { 922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // The TLS key has been created by another thread, but the value for 932076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // this thread has not been initialized. 942076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis return EGL_SUCCESS; 952076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis } 96444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)EGL_SUCCESS); 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1123aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall NativeDisplayType type; 1133aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_size_t initialized; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 15278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall bool zombie; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1560696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1570696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 161cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 162e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 171df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 17978141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall : magic(MAGIC), dpy(dpy), config(config), ctx(0), zombie(false) 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1900696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 191e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1920696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1930696a572294bbaa977245afb630065de3278473bMathias Agopian} 1940696a572294bbaa977245afb630065de3278473bMathias Agopian 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 21192dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLint /*l*/, EGLint /*t*/, EGLint /*w*/, EGLint /*h*/) 212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 213df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 214df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 2234b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2250696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2270696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 231cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 232e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 233cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 234cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 239df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2408d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 242697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr); 243697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t unlock(ANativeWindowBuffer* buf); 2444b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* nativeWindow; 245697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer; 246697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* previousBuffer; 247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 248076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 249e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 2699d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("%s { %5d, %5d, w=%5d, h=%5d }", 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 281240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 282240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 283240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 291df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 293df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 294df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 308240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 309240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 310240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 311240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 315240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 330df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 331df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 332df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 333697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 334697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 336df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 337df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 338df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 3444b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window) 345204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza : egl_surface_t(dpy, config, depthFormat), 346204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza nativeWindow(window), buffer(0), previousBuffer(0), bits(NULL) 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34869e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian 349df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 350204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza 351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 353cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 354cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 355cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 357cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 359cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 366cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 367cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 368cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3695221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3705221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3715221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3725221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 373df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 374d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 375d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, 376d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &fenceFd) != NO_ERROR) { 377d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 378d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 379d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis 380d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis // wait for the buffer 381d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 382d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER) != NO_ERROR) { 383d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 384cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 385cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 386df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 387df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 389076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 390cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 3949530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 3959530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 3969530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 3979530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 3989530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return setError(EGL_BAD_ALLOC, EGL_FALSE); 3999530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 4009530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 402cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 405076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 406df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 407076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 408df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 409df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 412e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("connect() failed to lock buffer %p (%ux%u)", 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 414cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 417cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 418e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 419e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 420e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 421e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4229648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 423e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 425e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 426cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 4275f555569e757d280f707e2587b3d154c9d8c872fJesse Hall nativeWindow->cancelBuffer(nativeWindow, buffer, -1); 428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 436076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 438697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf, int usage, void** vaddr) 4390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 440204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza auto& mapper = GraphicBufferMapper::get(); 441204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza return mapper.lock(buf->handle, usage, 442204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza android::Rect(buf->width, buf->height), vaddr); 4430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 445697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf) 4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 447cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 448204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza auto& mapper = GraphicBufferMapper::get(); 449204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza return mapper.unlock(buf->handle); 4500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4510926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 452df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 453697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 454697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 455240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 457df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 458df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4599cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator cur = clip.begin(); 4609cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator end = clip.end(); 4619cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t dbpr = dst->stride * bpp; 4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t sbpr = src->stride * bpp; 4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian while (cur != end) { 4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const Rect& r(*cur++); 4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t w = r.right - r.left; 4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t h = r.bottom - r.top; 4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (w <= 0 || h<=0) continue; 4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size_t size = w * bpp; 4759cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (dbpr==sbpr && size==sbpr) { 4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size *= h; 4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian h = 1; 480df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 4819cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian do { 4829cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian memcpy(d, s, size); 4839cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian d += dbpr; 4849cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian s += sbpr; 4859cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian } while (--h > 0); 486076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 491cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 492cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 493cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 494cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 495df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 496df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 497df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 498df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 499df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 501df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 50272c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 50372c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 50472c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 505df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 507df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 512df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 517076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5230926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 525d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->queueBuffer(nativeWindow, buffer, -1); 526df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 527076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 528df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 529d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 530d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) { 531d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 532d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER)) { 533d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 535d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 536031213e5b31c317135f603271333949dda89e01eMathias Agopian 537031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 538031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 539031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 540031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 541031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 542031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 543031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 544031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 545031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 546031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 547031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 5489530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 5499530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 5509530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 5519530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 5529530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_FALSE); 5539530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return EGL_FALSE; 5549530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 5559530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 556031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 557031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 558031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 559031213e5b31c317135f603271333949dda89e01eMathias Agopian } 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 563031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 564031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 565031213e5b31c317135f603271333949dda89e01eMathias Agopian 566031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 567031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 568031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 569e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 570031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 571031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 572031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 573031213e5b31c317135f603271333949dda89e01eMathias Agopian } 574031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 575031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 577df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 579df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 581df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 582df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 583df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 584df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 595e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 6000a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 610e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 626df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 627df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 628df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 629df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 630df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 631df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 632df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 633df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 634df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 635df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 636df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 637df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 638df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 639df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6540696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 6739530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 6749530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 6759530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 6769530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 6779530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 6789530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 6799530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 6809530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 695076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7240696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 74490c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir case GGL_PIXEL_FORMAT_BGRA_8888: size *= 4; break; 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 746e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("incompatible pixel format for pbuffer (format=%d)", f); 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 7619530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 7629530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 7639530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 7649530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 7659530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 7669530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 7679530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 7689530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 81592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn static bool ignore(GLint /*reqValue*/, GLint /*confValue*/) { 816639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 817639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 825141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 826cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString = "OpenGL_ES"; 827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 82883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall "EGL_KHR_fence_sync " 829e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 832df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 856076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 862076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 863076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 8798d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 8808d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 8818d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 8828d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 88383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglCreateSyncKHR", 88483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR }, 88583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglDestroySyncKHR", 88683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR }, 88783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglClientWaitSyncKHR", 88883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR }, 88983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglGetSyncAttribKHR", 89083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR }, 8918d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 8928d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 906076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 92156fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9220985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9230985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9240985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 92556fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9260985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 941d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 953d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9578b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 966d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9678b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 978d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 9916af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 1003d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 10088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 1016d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 10286af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103290c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir// BGRA 8888 config 103390c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundirstatic config_pair_t const config_8_attribute_list[] = { 103490c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_BUFFER_SIZE, 32 }, 103590c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_ALPHA_SIZE, 8 }, 103690c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_BLUE_SIZE, 8 }, 103790c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_GREEN_SIZE, 8 }, 103890c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_RED_SIZE, 8 }, 103990c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_DEPTH_SIZE, 0 }, 104090c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_CONFIG_ID, 8 }, 104190c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_BGRA_8888 }, 104290c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 104390c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir}; 104490c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 105490c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir { config_8_attribute_list, NELEM(config_8_attribute_list) }, 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1068639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1069639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1070639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1072639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10870985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10890985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10920985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10940985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10960985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 11348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 113790c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir case 8: 113890c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir pixelFormat = GGL_PIXEL_FORMAT_BGRA_8888; 113990c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir depthFormat = 0; 114090c75a2f5bd539c50f9176f9be9a6a574fc606b7Amit Pundir break; 11418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 11428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 11438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 11448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 11458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 11468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 11478b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 11488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1156076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1168076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1174076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 118697640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatic EGLBoolean getConfigAttrib(EGLDisplay /*dpy*/, EGLConfig config, 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1241444839b842798497cfa326204285a4f2ca2362afColin Cross int index = (int)(uintptr_t)config; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 126792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativeWindowType window, const EGLint* /*attrib_list*/) 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12814b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12820696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12830696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12840696a572294bbaa977245afb630065de3278473bMathias Agopian } 12850696a572294bbaa977245afb630065de3278473bMathias Agopian 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 13044b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13060696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 131692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType pixmap, const EGLint* /*attrib_list*/) 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13300696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 13310696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 13320696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 13330696a572294bbaa977245afb630065de3278473bMathias Agopian } 13340696a572294bbaa977245afb630065de3278473bMathias Agopian 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13520696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1370076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 13862e8ca9d01ed6a64451f9d6182e4abe980cdc41f0Jesse Hall while (attrib_list[0] != EGL_NONE) { 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13950696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 14166071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1430076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1438076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1441076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 14423aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_add(1, std::memory_order_acquire) == 0) { 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 14623aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_sub(1, std::memory_order_release) == 1) { 14633aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_thread_fence(std::memory_order_acquire); 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1482d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen if (ggl_unlikely(num_config==NULL)) 1483d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1484d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1492444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1504d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen 1505d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen if (ggl_unlikely(num_config==NULL)) { 1506749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1507749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1509749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 151004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 151104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 151204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 151304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 151404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 151504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 151604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 15260985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 15360985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 15370985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1541dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15440985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1560749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1561749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1562749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1563444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1564749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1565749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1566749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1567749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1568749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1569749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1570749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1571749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1572749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 16190696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1623e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 162478141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall // defer disconnect/delete until no longer current 162578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall surface->zombie = true; 162678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall } else { 1627e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 162878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete surface; 1629e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 16400696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16410696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1690076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 169992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLContext /*share_list*/, const EGLint* /*attrib_list*/) 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 17340696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17350696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 17360696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 17370696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17380696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 17390696a572294bbaa977245afb630065de3278473bMathias Agopian } 17400696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17410696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17420696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17430696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17460696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1777e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1778e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17790696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17800696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 178178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall s->ctx = EGL_NO_CONTEXT; 178278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (s->zombie) 178378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete s; 1784e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1785e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1786e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1787e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1788e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1790e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1791e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1805cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1806cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1807cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1823e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 18249648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1825e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 182678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall d->ctx = EGL_NO_CONTEXT; 182778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (d->zombie) 182878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete d; 1829e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1830e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 18319648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1832e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1833e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1834e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 189792dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglWaitNative(EGLint /*engine*/) 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1906076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 19080696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 19090696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 193192dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface /*surface*/, 193292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType /*target*/) 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 196892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*attribute*/, EGLint /*value*/) 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 197792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 198692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199492dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint /*interval*/) 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1999551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 203192dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLenum /*buftype*/, EGLClientBuffer /*buffer*/, 203292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLConfig /*config*/, const EGLint* /*attrib_list*/) 2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 2038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 205592dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglLockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/, 205692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn const EGLint* /*attrib_list*/) 2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 206292dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglUnlockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/) 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 206992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLClientBuffer buffer, const EGLint* /*attrib_list*/) 2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2074076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2081697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer; 2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2086697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20888dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20898dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20908dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20918dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20928dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20938dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20948dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20958dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20968dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20978dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20988dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20998dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2110697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img; 2111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2115697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2122df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2123df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync 212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE) 212883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212983e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, 213083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall const EGLint *attrib_list) 213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR); 213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (type != EGL_SYNC_FENCE_KHR || 213783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (attrib_list != NULL && attrib_list[0] != EGL_NONE)) { 213883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR); 213983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 214083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (eglGetCurrentContext() == EGL_NO_CONTEXT) { 214283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 214383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 214483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall // AGL is synchronous; nothing to do here. 214683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return FENCE_SYNC_HANDLE; 214883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 214983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215092dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglDestroySyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync) 215183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 215283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 215383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 215483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 215583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 215783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 215883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLint eglClientWaitSyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, EGLint /*flags*/, 216092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLTimeKHR /*timeout*/) 216183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 216283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 216383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 216483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 216583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 216683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_CONDITION_SATISFIED_KHR; 216783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 216883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 216992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglGetSyncAttribKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, 217083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall EGLint attribute, EGLint *value) 217183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 217283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 217383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 217483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 217583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 217683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall switch (attribute) { 217783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_TYPE_KHR: 217883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_FENCE_KHR; 217983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 218083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_STATUS_KHR: 218183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SIGNALED_KHR; 218283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 218383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_CONDITION_KHR: 218483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR; 218583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 218683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall default: 218783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 218883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 218983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 219083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 219183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 2192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 22020696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 22030696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2204df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2205df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2206df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2207df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2208df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2211df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2212