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> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.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> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.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> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 525f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian// ---------------------------------------------------------------------------- 534b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 544b9511c16195a646242eff833b0af212933b6ecaMathias AgopianEGLBoolean EGLAPI eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 554b9511c16195a646242eff833b0af212933b6ecaMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height); 564b9511c16195a646242eff833b0af212933b6ecaMathias Agopian 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 595f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 81444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)error); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 88444839b842798497cfa326204285a4f2ca2362afColin Cross GLint error = (GLint)(uintptr_t)pthread_getspecific(gEGLErrorKey); 892076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis if (error == 0) { 902076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // The TLS key has been created by another thread, but the value for 912076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis // this thread has not been initialized. 922076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis return EGL_SUCCESS; 932076f35549c7c04035b9f626d9209e049b6c91f8Jamie Gennis } 94444839b842798497cfa326204285a4f2ca2362afColin Cross pthread_setspecific(gEGLErrorKey, (void*)(uintptr_t)EGL_SUCCESS); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 15078141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall bool zombie; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1540696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1550696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 156076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 159cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 160e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 169df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 17778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall : magic(MAGIC), dpy(dpy), config(config), ctx(0), zombie(false) 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1880696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 189e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1900696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1910696a572294bbaa977245afb630065de3278473bMathias Agopian} 1920696a572294bbaa977245afb630065de3278473bMathias Agopian 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 208df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 20992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLint /*l*/, EGLint /*t*/, EGLint /*w*/, EGLint /*h*/) 210df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 211df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 212df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 2214b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2230696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2250696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 229cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 230e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 231cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 232cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 237df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2388d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 240697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t lock(ANativeWindowBuffer* buf, int usage, void** vaddr); 241697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev status_t unlock(ANativeWindowBuffer* buf); 2424b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* nativeWindow; 243697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buffer; 244697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* previousBuffer; 2450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 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) 3440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 3469cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian bits(NULL) 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34869e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian hw_module_t const* pModule; 34969e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 35069e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 35169e43b71afb2af729657f6d26ffef142fedbafabMathias Agopian 352df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 353df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 354df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 356cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 357cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 358cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 360cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 361cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 362cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 363cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 364cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 365cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 366cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 367cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 368cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 369cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 370cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 371cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3725221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3735221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3745221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3755221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 376df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 377d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 378d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, 379d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &fenceFd) != NO_ERROR) { 380d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 381d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 382d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis 383d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis // wait for the buffer 384d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 385d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER) != NO_ERROR) { 386d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 387cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 388cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 389df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 390df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 393cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 394076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 395076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 399cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 403df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 405df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 406df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 407df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 408df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 409e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("connect() failed to lock buffer %p (%ux%u)", 410df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 411cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 414cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 415e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 416e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 417e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 418e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4199648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 421e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 423cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 4245f555569e757d280f707e2587b3d154c9d8c872fJesse Hall nativeWindow->cancelBuffer(nativeWindow, buffer, -1); 425cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 426cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 427cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 428cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 430cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 433076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 435697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf, int usage, void** vaddr) 4360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 437bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err; 438695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 439695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->lock(module, buf->handle, 440695b66f082033d618ce19ee289d858130bd5420bMathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 441695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4440926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 445697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf) 4460926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 447cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 448bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err = NO_ERROR; 449695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 450695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->unlock(module, buf->handle); 451695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4530926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 455df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 456697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 457697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 458240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 459df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 460df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4629cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator cur = clip.begin(); 4639cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator end = clip.end(); 4649cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4659cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 4669cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t dbpr = dst->stride * bpp; 4679cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t sbpr = src->stride * bpp; 4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian while (cur != end) { 4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const Rect& r(*cur++); 4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t w = r.right - r.left; 4759cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t h = r.bottom - r.top; 4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (w <= 0 || h<=0) continue; 4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size_t size = w * bpp; 4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (dbpr==sbpr && size==sbpr) { 4819cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size *= h; 4829cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian h = 1; 483df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 4849cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian do { 4859cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian memcpy(d, s, size); 4869cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian d += dbpr; 4879cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian s += sbpr; 4889cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian } while (--h > 0); 489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 494cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 495cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 496cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 497cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 498df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 499df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 500df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 501df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 502df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 503df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 50572c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 50672c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 50772c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 517df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 518df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 519df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 525076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5260926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 528d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->queueBuffer(nativeWindow, buffer, -1); 529df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 530076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 531df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 532d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 533d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) { 534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 535d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER)) { 536d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 537d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 538d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 539031213e5b31c317135f603271333949dda89e01eMathias Agopian 540031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 541031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 542031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 543031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 544031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 545031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 546031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 547031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 548031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 549031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 550031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 551031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 552031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 553031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 554031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 555031213e5b31c317135f603271333949dda89e01eMathias Agopian } 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 559031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 560031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 561031213e5b31c317135f603271333949dda89e01eMathias Agopian 562031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 563031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 564031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 565e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 566031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 567031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 568031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 569031213e5b31c317135f603271333949dda89e01eMathias Agopian } 570031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 571031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 572df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 573df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 574df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 575df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 577df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 579df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 591e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 5960a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 606e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 623df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 624df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 625df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 626df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 627df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 628df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 629df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 630df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 631df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 632df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 633df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 634df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 635df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6500696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 684076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7130696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 734e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("incompatible pixel format for pbuffer (format=%d)", f); 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 79692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn static bool ignore(GLint /*reqValue*/, GLint /*confValue*/) { 797639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 798639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 806141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 807cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString = "OpenGL_ES"; 808076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 80983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall "EGL_KHR_fence_sync " 810e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 811076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 813df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 842076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 843076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 844076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 845076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 846076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 847076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 848076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 849076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 856076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 8608d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 8618d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 8628d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 8638d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 86483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglCreateSyncKHR", 86583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR }, 86683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglDestroySyncKHR", 86783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR }, 86883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglClientWaitSyncKHR", 86983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR }, 87083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglGetSyncAttribKHR", 87183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR }, 8728d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 8738d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 90256fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9030985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9040985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9050985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 90656fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9070985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 922d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 934d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9458b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 947d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9498b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9508b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9518b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9548b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9568b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9578b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9588b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 959d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9608b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9618b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9628b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9638b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9648b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 9726af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 984d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 997d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 10096af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1035639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1036639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1037639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1039639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10520985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10530985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10540985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10550985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10560985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10590985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10610985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10620985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10630985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 10698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 10708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 10718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 10728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 10738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 10778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 10788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 10818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 10828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 10858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 10868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 10898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 10908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 10938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 10948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1137076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 114997640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatic EGLBoolean getConfigAttrib(EGLDisplay /*dpy*/, EGLConfig config, 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1204444839b842798497cfa326204285a4f2ca2362afColin Cross int index = (int)(uintptr_t)config; 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 123092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativeWindowType window, const EGLint* /*attrib_list*/) 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12444b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12450696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12460696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12470696a572294bbaa977245afb630065de3278473bMathias Agopian } 12480696a572294bbaa977245afb630065de3278473bMathias Agopian 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12558b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1266076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 12674b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12690696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 127992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType pixmap, const EGLint* /*attrib_list*/) 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12930696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 12940696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 12950696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 12960696a572294bbaa977245afb630065de3278473bMathias Agopian } 12970696a572294bbaa977245afb630065de3278473bMathias Agopian 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13150696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13580696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1451444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1463749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1464749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1465749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1466749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1468749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 146904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 147004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 147104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 147204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 147304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 147404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 147504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1477076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 14850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 14950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 14960985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1500dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15030985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 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 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1519749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1520749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1521749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1522444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1523749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1524749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1525749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1526749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1527749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1528749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1529749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1530749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1531749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 15780696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1582e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 158378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall // defer disconnect/delete until no longer current 158478141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall surface->zombie = true; 158578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall } else { 1586e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 158778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete surface; 1588e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 15990696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16000696a572294bbaa977245afb630065de3278473bMathias Agopian 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); 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 165892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLContext /*share_list*/, const EGLint* /*attrib_list*/) 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 16930696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 16940696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 16950696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 16960696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 16970696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 16980696a572294bbaa977245afb630065de3278473bMathias Agopian } 16990696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17000696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17010696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17020696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17050696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1709076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1725e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1736e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1737e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17380696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17390696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 174078141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall s->ctx = EGL_NO_CONTEXT; 174178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (s->zombie) 174278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete s; 1743e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1744e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1745e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1746e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1747e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1749e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1750e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1764cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1765cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1766cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1782e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 17839648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1784e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 178578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall d->ctx = EGL_NO_CONTEXT; 178678141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (d->zombie) 178778141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete d; 1788e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1789e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 17909648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1791e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1792e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1793e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185692dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglWaitNative(EGLint /*engine*/) 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 18670696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 18680696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 189092dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface /*surface*/, 189192dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType /*target*/) 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 192792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*attribute*/, EGLint /*value*/) 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 193692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 194592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 195392dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint /*interval*/) 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1958551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 199092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLenum /*buftype*/, EGLClientBuffer /*buffer*/, 199192dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLConfig /*config*/, const EGLint* /*attrib_list*/) 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2013076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 201492dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglLockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/, 201592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn const EGLint* /*attrib_list*/) 2016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2017076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2018076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2019076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 202192dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglUnlockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/) 2022076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2023076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2025076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 202892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLClientBuffer buffer, const EGLint* /*attrib_list*/) 2029076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2031076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2033076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2034076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2035076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2037076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2038076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2039076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2040697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer; 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2045697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20478dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20488dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20498dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20508dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20518dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20528dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20538dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20548dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20558dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20568dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20578dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20588dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2069697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img; 2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2074697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2081df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2082df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 208383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync 208483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 208583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 208683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE) 208783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 208883e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, 208983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall const EGLint *attrib_list) 209083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 209183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 209283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR); 209383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 209483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 209583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (type != EGL_SYNC_FENCE_KHR || 209683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (attrib_list != NULL && attrib_list[0] != EGL_NONE)) { 209783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR); 209883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 209983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (eglGetCurrentContext() == EGL_NO_CONTEXT) { 210183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 210283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 210383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall // AGL is synchronous; nothing to do here. 210583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return FENCE_SYNC_HANDLE; 210783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 210883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 210992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglDestroySyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync) 211083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 211183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 211283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 211383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 211483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 211583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 211683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 211783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 211892dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLint eglClientWaitSyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, EGLint /*flags*/, 211992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLTimeKHR /*timeout*/) 212083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 212183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 212283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 212383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_CONDITION_SATISFIED_KHR; 212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212892dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglGetSyncAttribKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, 212983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall EGLint attribute, EGLint *value) 213083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall switch (attribute) { 213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_TYPE_KHR: 213783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_FENCE_KHR; 213883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 213983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_STATUS_KHR: 214083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SIGNALED_KHR; 214183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 214283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_CONDITION_KHR: 214383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR; 214483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 214583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall default: 214683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 214783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 214883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 214983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 2151df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2152df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2153df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2154df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2155df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2156df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2157df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2158df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2159df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21610696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21620696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2163df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2164df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2165df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2166df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2167df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2168df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2169df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2170df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2171