egl.cpp revision 7823e124e00576e20e47ec717cbe8bc89f0f2bf2
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> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 535f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian// ---------------------------------------------------------------------------- 544b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 554b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 564b9511c16195a646242eff833b0af212933b6ecaMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height); 574b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 605f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 686071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 82444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)error); 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 89444839b842798497cfa326204285a4f2ca2362afColin Cross GLint error = (GLint)(uintptr_t)pthread_getspecific(gEGLErrorKey); 902076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis if (error == 0) { 912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // The TLS key has been created by another thread, but the value for 922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // this thread has not been initialized. 932076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis return EGL_SUCCESS; 942076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis } 95444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)EGL_SUCCESS); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1113aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall NativeDisplayType type; 1123aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_size_t initialized; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 15178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall bool zombie; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1550696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1560696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 160cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 161e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 170df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 17878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall : magic(MAGIC), dpy(dpy), config(config), ctx(0), zombie(false) 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1890696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 190e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1910696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1920696a572294bbaa977245afb630065de3278473bMathias Agopian} 1930696a572294bbaa977245afb630065de3278473bMathias Agopian 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 209df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 21092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLint /*l*/, EGLint /*t*/, EGLint /*w*/, EGLint /*h*/) 211df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 213df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 219076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 2224b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2240696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2260696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 230cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 231e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 232cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 233cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 238df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2398d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr); 242697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t unlock(ANativeWindowBuffer* buf); 2434b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* nativeWindow; 244697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer; 245697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* previousBuffer; 246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 248e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 2689d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("%s { %5d, %5d, w=%5d, h=%5d }", 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 280240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 281240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 282240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 288df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 292df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 293df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 308240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 309240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 310240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 314240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 328df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 329df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 330df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 331df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 332697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 333697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 335df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 336df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 337df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 3434b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window) 344204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza : egl_surface_t(dpy, config, depthFormat), 345204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza nativeWindow(window), buffer(0), previousBuffer(0), bits(NULL) 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34769e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian 348df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 349204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza 350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 351076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 352cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 353cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 354cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 356cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 357cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 359cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 366cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 367cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3685221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3695221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3705221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3715221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 372df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 373d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 374d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, 375d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &fenceFd) != NO_ERROR) { 376d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 377d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 378d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis 379d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis // wait for the buffer 380d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 381d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER) != NO_ERROR) { 382d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 383cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 384cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 385df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 386df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 387076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 389cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 390076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 3939530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 3949530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 3959530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 3969530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 3979530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return setError(EGL_BAD_ALLOC, EGL_FALSE); 3989530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 3999530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 401cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 405df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 406076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 407df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 408df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 409df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 411e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("connect() failed to lock buffer %p (%ux%u)", 412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 413cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 415df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 416cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 417e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 418e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 419e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4219648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 423e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 425cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 4265f555569e757d280f707e2587b3d154c9d8c872fJesse Hall nativeWindow->cancelBuffer(nativeWindow, buffer, -1); 427cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 435076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 437697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf, int usage, void** vaddr) 4380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 439204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza auto& mapper = GraphicBufferMapper::get(); 440204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza return mapper.lock(buf->handle, usage, 441204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza android::Rect(buf->width, buf->height), vaddr); 4420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 444697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf) 4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 446cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 447204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza auto& mapper = GraphicBufferMapper::get(); 448204240a88b3a755a2d61d11b0f5ae634688d34fcDan Stoza return mapper.unlock(buf->handle); 4490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 451df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 452697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 453697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 454240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 456df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 457df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4589cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator cur = clip.begin(); 4599cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator end = clip.end(); 4609cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4619cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t dbpr = dst->stride * bpp; 4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t sbpr = src->stride * bpp; 4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian while (cur != end) { 4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const Rect& r(*cur++); 4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t w = r.right - r.left; 4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t h = r.bottom - r.top; 4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (w <= 0 || h<=0) continue; 4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size_t size = w * bpp; 4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 4759cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (dbpr==sbpr && size==sbpr) { 4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size *= h; 4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian h = 1; 479df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian do { 4819cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian memcpy(d, s, size); 4829cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian d += dbpr; 4839cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian s += sbpr; 4849cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian } while (--h > 0); 485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 488076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 490cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 491cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 492cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 493cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 494df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 495df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 496df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 497df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 498df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 499df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 50172c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 50272c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 50372c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 505df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 511df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 512df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 513df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 517df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 521076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5220926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 524d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->queueBuffer(nativeWindow, buffer, -1); 525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 526076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 528d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 529d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) { 530d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 531d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER)) { 532d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 533d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 535031213e5b31c317135f603271333949dda89e01eMathias Agopian 536031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 537031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 538031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 539031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 540031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 541031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 542031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 543031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 544031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 545031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 546031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 5479530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 5489530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 5499530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 5509530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 5519530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_FALSE); 5529530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return EGL_FALSE; 5539530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 5549530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 555031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 556031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 557031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 558031213e5b31c317135f603271333949dda89e01eMathias Agopian } 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 562031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 563031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 564031213e5b31c317135f603271333949dda89e01eMathias Agopian 565031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 566031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 567031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 568e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 569031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 570031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 571031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 572031213e5b31c317135f603271333949dda89e01eMathias Agopian } 573031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 574031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 575df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 577df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 579df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 581df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 582df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 583df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 594e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 5990a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 609e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 623df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 626df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 627df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 628df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 629df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 630df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 631df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 632df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 633df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 634df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 635df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 636df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 637df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 638df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6530696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 6729530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 6739530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 6749530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 6759530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 6769530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 6779530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 6789530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 6799530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 694076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7230696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 744e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("incompatible pixel format for pbuffer (format=%d)", f); 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 7599530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 7609530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 7619530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 7629530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 7639530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 7649530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 7659530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 7669530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 81392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn static bool ignore(GLint /*reqValue*/, GLint /*confValue*/) { 814639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 815639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 823141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 824cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString = "OpenGL_ES"; 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 82683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall "EGL_KHR_fence_sync " 827e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 830df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 856076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 862076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 863076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 8778d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 8788d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 8798d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 8808d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 88183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglCreateSyncKHR", 88283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR }, 88383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglDestroySyncKHR", 88483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR }, 88583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglClientWaitSyncKHR", 88683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR }, 88783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglGetSyncAttribKHR", 88883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR }, 8898d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 8908d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 904076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 91956fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9200985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9210985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9220985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 92356fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9240985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 939d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 951d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9588b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9598b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 964d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9668b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9678b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 976d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 9896af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 1001d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 10068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 1014d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 10266af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1052639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1053639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1054639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1056639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10690985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10700985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10710985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10720985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10730985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10760985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10780985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10790985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10800985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 10868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 10878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 10948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1134076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1136076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 116697640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatic EGLBoolean getConfigAttrib(EGLDisplay /*dpy*/, EGLConfig config, 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1221444839b842798497cfa326204285a4f2ca2362afColin Cross int index = (int)(uintptr_t)config; 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 124792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativeWindowType window, const EGLint* /*attrib_list*/) 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12614b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12620696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12630696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12640696a572294bbaa977245afb630065de3278473bMathias Agopian } 12650696a572294bbaa977245afb630065de3278473bMathias Agopian 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1282076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1283076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 12844b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12860696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 129692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType pixmap, const EGLint* /*attrib_list*/) 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13100696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 13110696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 13120696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 13130696a572294bbaa977245afb630065de3278473bMathias Agopian } 13140696a572294bbaa977245afb630065de3278473bMathias Agopian 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13320696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1350076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 13662e8ca9d01ed6a64451f9d6182e4abe980cdc41f0Jesse Hall while (attrib_list[0] != EGL_NONE) { 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13750696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 13966071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1418076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1421076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 14223aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_add(1, std::memory_order_acquire) == 0) { 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 14423aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_sub(1, std::memory_order_release) == 1) { 14433aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_thread_fence(std::memory_order_acquire); 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1462d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen if (ggl_unlikely(num_config==NULL)) 1463d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1464d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1472444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1484d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen 1485d8cf2ce6b8b2f29e24d8185a36618dd33a17cf8ePauli Nieminen if (ggl_unlikely(num_config==NULL)) { 1486749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1487749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1489749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 149004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 149104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 149204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 149304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 149404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 149504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 149604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 15060985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 15160985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 15170985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1521dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15240985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1540749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1541749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1542749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1543444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1544749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1545749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1546749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1547749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1548749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1549749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1550749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 15990696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1603e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 160478141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall // defer disconnect/delete until no longer current 160578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall surface->zombie = true; 160678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall } else { 1607e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 160878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete surface; 1609e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 16200696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16210696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 167992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLContext /*share_list*/, const EGLint* /*attrib_list*/) 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 17140696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17150696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 17160696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 17170696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17180696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 17190696a572294bbaa977245afb630065de3278473bMathias Agopian } 17200696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17210696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17220696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17230696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17260696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1730076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1746e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1757e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1758e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17590696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17600696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 176178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall s->ctx = EGL_NO_CONTEXT; 176278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (s->zombie) 176378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete s; 1764e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1765e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1766e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1767e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1770e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1785cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1786cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1787cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1792e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1803e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 18049648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1805e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 180678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall d->ctx = EGL_NO_CONTEXT; 180778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (d->zombie) 180878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete d; 1809e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1810e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 18119648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1813e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1814e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187792dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglWaitNative(EGLint /*engine*/) 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 18880696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 18890696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191192dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface /*surface*/, 191292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType /*target*/) 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 194892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*attribute*/, EGLint /*value*/) 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 195792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 196692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 197492dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint /*interval*/) 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1979551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 201192dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLenum /*buftype*/, EGLClientBuffer /*buffer*/, 201292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLConfig /*config*/, const EGLint* /*attrib_list*/) 2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2021076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 203592dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglLockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/, 203692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn const EGLint* /*attrib_list*/) 2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 204292dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglUnlockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/) 2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 204992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLClientBuffer buffer, const EGLint* /*attrib_list*/) 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2061697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer; 2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2066697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20688dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20698dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20708dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20718dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20728dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20738dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20748dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20758dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20768dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20778dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20788dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20798dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2081076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2086076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2090697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img; 2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2095697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2102df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2103df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 210483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync 210583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 210683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE) 210883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210983e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, 211083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall const EGLint *attrib_list) 211183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 211283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 211383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR); 211483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 211583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 211683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (type != EGL_SYNC_FENCE_KHR || 211783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (attrib_list != NULL && attrib_list[0] != EGL_NONE)) { 211883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR); 211983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 212083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (eglGetCurrentContext() == EGL_NO_CONTEXT) { 212283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 212383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall // AGL is synchronous; nothing to do here. 212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return FENCE_SYNC_HANDLE; 212883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 212983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213092dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglDestroySyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync) 213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 213783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 213883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLint eglClientWaitSyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, EGLint /*flags*/, 214092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLTimeKHR /*timeout*/) 214183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 214283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 214383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 214483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 214583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_CONDITION_SATISFIED_KHR; 214783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 214883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglGetSyncAttribKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, 215083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall EGLint attribute, EGLint *value) 215183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 215283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 215383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 215483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 215583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall switch (attribute) { 215783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_TYPE_KHR: 215883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_FENCE_KHR; 215983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 216083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_STATUS_KHR: 216183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SIGNALED_KHR; 216283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 216383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_CONDITION_KHR: 216483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR; 216583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 216683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall default: 216783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 216883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 216983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 217083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 217183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 2172df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2173df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2174df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2175df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2176df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2177df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2178df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2179df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2180df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2181df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21820696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21830696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2184df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2185df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2186df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2187df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2188df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2189df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2190df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2191df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2192