1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License"); 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 193aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall#include <atomic> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 335f2165f9455d4893b581b73a67c5431f4344b47eMathias Agopian#include <ui/ANativeObjectBase.h> 34d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis#include <ui/Fence.h> 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; 676071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 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 1103aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall NativeDisplayType type; 1113aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_size_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 3979530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 3989530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 3999530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 4009530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 4019530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return setError(EGL_BAD_ALLOC, EGL_FALSE); 4029530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 4039530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 405cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 408076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 409df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 412df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 414df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 415e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("connect() failed to lock buffer %p (%ux%u)", 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 417cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 419df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 420cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 421e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 422e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 423e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 424e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4259648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 426e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 427e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 428e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 429cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 4305f555569e757d280f707e2587b3d154c9d8c872fJesse Hall nativeWindow->cancelBuffer(nativeWindow, buffer, -1); 431cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 432cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 435cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 436cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 439076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 441697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf, int usage, void** vaddr) 4420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 443bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err; 444695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 445695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->lock(module, buf->handle, 446695b66f082033d618ce19ee289d858130bd5420bMathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 447695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4480926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4490926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 451697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchevstatus_t egl_window_surface_v2_t::unlock(ANativeWindowBuffer* buf) 4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 453cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 454bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err = NO_ERROR; 455695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 456695b66f082033d618ce19ee289d858130bd5420bMathias Agopian err = module->unlock(module, buf->handle); 457695b66f082033d618ce19ee289d858130bd5420bMathias Agopian 4580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 461df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 462697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* dst, void* dst_vaddr, 463697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* src, void const* src_vaddr, 464240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 465df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 466df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 467df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4689cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator cur = clip.begin(); 4699cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian Region::const_iterator end = clip.end(); 4709cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4719cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 4729cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t dbpr = dst->stride * bpp; 4739cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const size_t sbpr = src->stride * bpp; 4749cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4759cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 4769cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 4779cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian 4789cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian while (cur != end) { 4799cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian const Rect& r(*cur++); 4809cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t w = r.right - r.left; 4819cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian ssize_t h = r.bottom - r.top; 4829cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (w <= 0 || h<=0) continue; 4839cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size_t size = w * bpp; 4849cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 4859cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 4869cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian if (dbpr==sbpr && size==sbpr) { 4879cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian size *= h; 4889cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian h = 1; 489df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 4909cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian do { 4919cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian memcpy(d, s, size); 4929cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian d += dbpr; 4939cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian s += sbpr; 4949cdb01da71934e98b6732db0f5758ea4edd5d5c7Mathias Agopian } while (--h > 0); 495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 500cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 501cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 502cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 503cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 504df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 505df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 506df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 507df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 508df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 509df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 510df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 51172c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 51272c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 51372c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 514df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 515df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 516df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 520df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 521df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 522df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 523df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 524df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 525df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 526076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 527df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 528df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 529df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 530df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 533df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 534d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->queueBuffer(nativeWindow, buffer, -1); 535df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 537df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 538d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis int fenceFd = -1; 539d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (nativeWindow->dequeueBuffer(nativeWindow, &buffer, &fenceFd) == NO_ERROR) { 540d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis sp<Fence> fence(new Fence(fenceFd)); 541d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis if (fence->wait(Fence::TIMEOUT_NEVER)) { 542d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis nativeWindow->cancelBuffer(nativeWindow, buffer, fenceFd); 543d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis return setError(EGL_BAD_ALLOC, EGL_FALSE); 544d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis } 545031213e5b31c317135f603271333949dda89e01eMathias Agopian 546031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 547031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 548031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 549031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 550031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 551031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 552031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 553031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 554031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 555031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 556031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 5579530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 5589530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 5599530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 5609530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 5619530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_FALSE); 5629530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return EGL_FALSE; 5639530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 5649530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 565031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 566031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 567031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 568031213e5b31c317135f603271333949dda89e01eMathias Agopian } 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 571df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 572031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 573031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 574031213e5b31c317135f603271333949dda89e01eMathias Agopian 575031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 576031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 577031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 578e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 579031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 580031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 581031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 582031213e5b31c317135f603271333949dda89e01eMathias Agopian } 583031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 584031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 585df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 586df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 587df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 588df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 589df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 590df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 591df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 592df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 593df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 604e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 6090a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 619e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 633df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 634df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 635df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 636df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 637df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 638df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 639df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 640df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 641df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 642df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 643df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 644df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 645df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 646df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 647df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 648df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6630696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 6829530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 6839530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 6849530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 6859530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 6869530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 6879530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 6889530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 6899530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 704076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7330696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7528b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 754e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("incompatible pixel format for pbuffer (format=%d)", f); 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 764076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 7699530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine uint64_t allocSize = static_cast<uint64_t>(depth.stride) * 7709530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine static_cast<uint64_t>(depth.height) * 2; 7719530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine if (depth.stride < 0 || depth.height > INT_MAX || 7729530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine allocSize > UINT32_MAX) { 7739530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 7749530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine return; 7759530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine } 7769530388b260ddd47c4e013b10f7f56b987d4f79fMichael Lentine depth.data = (GGLubyte*)malloc(allocSize); 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 82392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn static bool ignore(GLint /*reqValue*/, GLint /*confValue*/) { 824639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 825639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 833141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 834cc2b1560e87369676a2d13f17bd1ff4021a91819Mathias Agopianstatic char const * const gClientApiString = "OpenGL_ES"; 835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 83683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall "EGL_KHR_fence_sync " 837e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 838076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 840df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 851076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 854076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 856076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 857076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 858076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 859076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 860076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 861076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 862076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 863076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 8878d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 8888d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 8898d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 8908d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 89183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglCreateSyncKHR", 89283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglCreateSyncKHR }, 89383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglDestroySyncKHR", 89483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglDestroySyncKHR }, 89583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglClientWaitSyncKHR", 89683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglClientWaitSyncKHR }, 89783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall { "eglGetSyncAttribKHR", 89883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (__eglMustCastToProperFunctionPointerType)&eglGetSyncAttribKHR }, 8998d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 9008d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 914076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 92956fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9300985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9310985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9320985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 93356fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9340985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 949d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 961d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9658b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9688b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9698b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9728b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9738b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 974d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9808b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 986d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9928b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 9996af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 1011d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 10168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 1024d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 10366af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10478b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10488b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1062639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1063639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1064639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1066639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10790985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10800985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10810985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10820985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10830985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10890985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10900985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 10968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 10978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 10988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 10998b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 11008b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 11328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 11338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 11348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 11358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 11368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 11378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 11388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 117697640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynstatic EGLBoolean getConfigAttrib(EGLDisplay /*dpy*/, EGLConfig config, 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1231444839b842798497cfa326204285a4f2ca2362afColin Cross int index = (int)(uintptr_t)config; 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 125792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativeWindowType window, const EGLint* /*attrib_list*/) 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12714b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12720696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12730696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12740696a572294bbaa977245afb630065de3278473bMathias Agopian } 12750696a572294bbaa977245afb630065de3278473bMathias Agopian 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 12944b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12960696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 130692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType pixmap, const EGLint* /*attrib_list*/) 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13200696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 13210696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 13220696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 13230696a572294bbaa977245afb630065de3278473bMathias Agopian } 13240696a572294bbaa977245afb630065de3278473bMathias Agopian 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13420696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13708b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 13762e8ca9d01ed6a64451f9d6182e4abe980cdc41f0Jesse Hall while (attrib_list[0] != EGL_NONE) { 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13850696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 14066071da7ef84c60645572654504813d492b8b21d5Elliott Hughes#ifndef __ANDROID__ 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1420076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1428076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1431076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 14323aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_add(1, std::memory_order_acquire) == 0) { 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 14523aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall if (d.initialized.fetch_sub(1, std::memory_order_release) == 1) { 14533aa75f95f23df87cf74ddefe0d3f90b1484ff95eJesse Hall std::atomic_thread_fence(std::memory_order_acquire); 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1479444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1491749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1492749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1493749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1494749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1496749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 149704aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 149804aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 149904aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 150004aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 150104aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 150204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 150304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1505076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 15130985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 15230985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 15240985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1528dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15310985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1547749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1548749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1549749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1550444839b842798497cfa326204285a4f2ca2362afColin Cross *configs++ = (EGLConfig)(uintptr_t)i; 1551749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1553749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1554749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1555749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1556749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1557749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1558749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1559749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 16060696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1610e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 161178141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall // defer disconnect/delete until no longer current 161278141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall surface->zombie = true; 161378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall } else { 1614e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 161578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete surface; 1616e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 16270696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16280696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1677076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 168692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLContext /*share_list*/, const EGLint* /*attrib_list*/) 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 17210696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17220696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 17230696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 17240696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17250696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 17260696a572294bbaa977245afb630065de3278473bMathias Agopian } 17270696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17280696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17290696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17300696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17330696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1737076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1753e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1764e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1765e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17660696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17670696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 176878141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall s->ctx = EGL_NO_CONTEXT; 176978141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (s->zombie) 177078141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete s; 1771e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1774e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1777e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1778e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1792cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1793cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1794cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1799e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1810e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 18119648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1812e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 181378141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall d->ctx = EGL_NO_CONTEXT; 181478141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall if (d->zombie) 181578141e3acc9913153883fa337a0f3a5eff7acc64Jesse Hall delete d; 1816e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1817e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 18189648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1819e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1820e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1821e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 188492dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglWaitNative(EGLint /*engine*/) 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 18950696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 18960696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191892dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface /*surface*/, 191992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn NativePixmapType /*target*/) 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 195592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*attribute*/, EGLint /*value*/) 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 196492dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 197392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLSurface /*surface*/, EGLint /*buffer*/) 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 198192dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint /*interval*/) 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1986551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 201892dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLDisplay dpy, EGLenum /*buftype*/, EGLClientBuffer /*buffer*/, 201992dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLConfig /*config*/, const EGLint* /*attrib_list*/) 2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 204292dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglLockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/, 204392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn const EGLint* /*attrib_list*/) 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 204992dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglUnlockSurfaceKHR(EGLDisplay /*dpy*/, EGLSurface /*surface*/) 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 205692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLClientBuffer buffer, const EGLint* /*attrib_list*/) 2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2068697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)buffer; 2069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2073697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2074076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20758dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20768dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20778dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20788dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20798dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20808dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20818dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20828dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20838dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20848dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20858dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20868dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2097697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* native_buffer = (ANativeWindowBuffer*)img; 2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2102697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev if (native_buffer->common.version != sizeof(ANativeWindowBuffer)) 2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2109df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2110df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 211183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// EGL_KHR_fence_sync 211283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 211383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 211483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall#define FENCE_SYNC_HANDLE ((EGLSyncKHR)0xFE4CE) 211583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 211683e7c8c431ec8b578b6f778811837632e3798768Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, 211783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall const EGLint *attrib_list) 211883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 211983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 212083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_DISPLAY, EGL_NO_SYNC_KHR); 212183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 212283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (type != EGL_SYNC_FENCE_KHR || 212483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall (attrib_list != NULL && attrib_list[0] != EGL_NONE)) { 212583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR); 212683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 212783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 212883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (eglGetCurrentContext() == EGL_NO_CONTEXT) { 212983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 213083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 213183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall // AGL is synchronous; nothing to do here. 213383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return FENCE_SYNC_HANDLE; 213583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 213683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 213792dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglDestroySyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync) 213883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 213983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 214083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 214183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 214283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 214483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 214583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 214692dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLint eglClientWaitSyncKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, EGLint /*flags*/, 214792dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn EGLTimeKHR /*timeout*/) 214883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 214983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 215083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 215183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 215283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_CONDITION_SATISFIED_KHR; 215483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 215583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 215692dc3fc52cf097bd105460cf377779bdcf146d62Mark SalyzynEGLBoolean eglGetSyncAttribKHR(EGLDisplay /*dpy*/, EGLSyncKHR sync, 215783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall EGLint attribute, EGLint *value) 215883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall{ 215983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 216083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_PARAMETER, EGL_FALSE); 216183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 216283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 216383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall switch (attribute) { 216483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_TYPE_KHR: 216583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_FENCE_KHR; 216683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 216783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_STATUS_KHR: 216883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SIGNALED_KHR; 216983e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 217083e7c8c431ec8b578b6f778811837632e3798768Jesse Hall case EGL_SYNC_CONDITION_KHR: 217183e7c8c431ec8b578b6f778811837632e3798768Jesse Hall *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR; 217283e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return EGL_TRUE; 217383e7c8c431ec8b578b6f778811837632e3798768Jesse Hall default: 217483e7c8c431ec8b578b6f778811837632e3798768Jesse Hall return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 217583e7c8c431ec8b578b6f778811837632e3798768Jesse Hall } 217683e7c8c431ec8b578b6f778811837632e3798768Jesse Hall} 217783e7c8c431ec8b578b6f778811837632e3798768Jesse Hall 217883e7c8c431ec8b578b6f778811837632e3798768Jesse Hall// ---------------------------------------------------------------------------- 2179df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2180df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2181df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2182df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2183df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2184df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2185df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2186df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2187df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2188df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21890696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21900696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2191df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2192df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2193df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2194df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2195df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2196df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2197df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2198df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2199