egl.cpp revision 72c384e0a16504638927fea2da36a4731953c8df
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License"); 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h> 43bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian#include <private/ui/sw_gralloc_handle.h> 447189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian 45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h> 46240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)error); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint error = (GLint)pthread_getspecific(gEGLErrorKey); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1450696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1460696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 150cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 151e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1790696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 1800696a572294bbaa977245afb630065de3278473bMathias Agopian LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1810696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1820696a572294bbaa977245afb630065de3278473bMathias Agopian} 1830696a572294bbaa977245afb630065de3278473bMathias Agopian 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 199df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 209076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 2124b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window); 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2140696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2160696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 220cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 221e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 222cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 223cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 228df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2298d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 231e71212ba5397387100a578d23b15862518a7a859Mathias Agopian status_t lock(android_native_buffer_t* buf, int usage, void** vaddr); 2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian status_t unlock(android_native_buffer_t* buf); 2334b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* nativeWindow; 234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 235df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* previousBuffer; 2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 237240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* blitengine; 238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 240e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 241df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 242df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 243df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 244df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 245df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 272240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 273240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 274240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 277df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 278df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 279df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 283240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 286240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 287240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 289240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 290240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 303df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 304df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 305df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 307df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 311df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 323240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian struct region_iterator : public copybit_region_t { 324240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator(const Region& region) 325240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian : b(region.begin()), e(region.end()) { 326240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian this->next = iterate; 327240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian private: 329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian static int iterate(copybit_region_t const * self, copybit_rect_t* rect) { 330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator const* me = static_cast<region_iterator const*>(self); 331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (me->b != me->e) { 332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian *reinterpret_cast<Rect*>(rect) = *me->b++; 333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 1; 334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 0; 336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian mutable Region::const_iterator b; 338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator const e; 339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian }; 340240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 341df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 342df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 343df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 344240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 345df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 350076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 3534b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn ANativeWindow* window) 3540926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 355df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 356240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian blitengine(0), bits(NULL) 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_module_t const* pModule; 3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 3600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 3610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 362240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) { 363240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_open(pModule, &blitengine); 364240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 365240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 366df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 367df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 368df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 370cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 371cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 372cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 374cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 378cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (blitengine) { 383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian copybit_close(blitengine); 384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 387cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 388cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3905221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3915221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3925221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 393df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 394cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) { 395cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 396cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 397df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 398df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 399076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 400076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 401cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 407cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 410076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 411df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 412076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 413df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4140926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 415e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 417df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 419240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("connect() failed to lock buffer %p (%ux%u)", 420df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 421cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 423df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 424cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 425e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 426e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 427e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 428e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4299648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 431e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 432e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 433cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian // enqueue the last frame 434cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 435cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 436cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 437cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 442cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 444076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4450926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 446e71212ba5397387100a578d23b15862518a7a859Mathias Agopian android_native_buffer_t* buf, int usage, void** vaddr) 4470926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 448bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err; 449bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian if (sw_gralloc_handle_t::validate(buf->handle) < 0) { 450bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = module->lock(module, buf->handle, 451bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 452bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } else { 453bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian sw_gralloc_handle_t const* hnd = 454bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian reinterpret_cast<sw_gralloc_handle_t const*>(buf->handle); 455bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian *vaddr = (void*)hnd->base; 456bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = NO_ERROR; 457bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } 4580926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4600926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 4610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) 4620926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 463cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 464bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err = NO_ERROR; 465bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian if (sw_gralloc_handle_t::validate(buf->handle) < 0) { 466bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = module->unlock(module, buf->handle); 467bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } 4680926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 471df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 472df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 473df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 474240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 475df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 476df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: use copybit if possible 477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 478df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian status_t err = NO_ERROR; 480240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* const copybit = blitengine; 481240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (copybit) { 482240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t simg; 483a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist simg.w = src->stride; 484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.h = src->height; 485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.format = src->format; 486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.handle = const_cast<native_handle_t*>(src->handle); 487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t dimg; 489a409e195fefcfdc2672418d7ad058f3ff865999eMathias Palmqvist dimg.w = dst->stride; 490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.h = dst->height; 491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.format = dst->format; 492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.handle = const_cast<native_handle_t*>(dst->handle); 493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255); 496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE); 497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator it(clip); 498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian err = copybit->blit(copybit, &dimg, &simg, &it); 499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (err != NO_ERROR) { 500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("copybit failed (%s)", strerror(err)); 501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 5030926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (!copybit || err) { 505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator cur = clip.begin(); 506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator end = clip.end(); 507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 508240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t dbpr = dst->stride * bpp; 510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t sbpr = src->stride * bpp; 511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian while (cur != end) { 516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Rect& r(*cur++); 517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t w = r.right - r.left; 518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t h = r.bottom - r.top; 519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (w <= 0 || h<=0) continue; 520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size_t size = w * bpp; 521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (dbpr==sbpr && size==sbpr) { 524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size *= h; 525240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian h = 1; 526240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 527240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian do { 528240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian memcpy(d, s, size); 529240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian d += dbpr; 530240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian s += sbpr; 531240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } while (--h > 0); 532df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 533076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 538cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 539cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 540cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 541cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 542df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 543df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 544df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 545df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 546df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 54972c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // This was const Region copyBack, but that causes an 55072c384e0a16504638927fea2da36a4731953c8dfKristian Monsen // internal compile error on simulator builds 55172c384e0a16504638927fea2da36a4731953c8dfKristian Monsen /*const*/ Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 553df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 554df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 555240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 556240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 557240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 558df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 559df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 560df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 567df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 568df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 571df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 573df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 575df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 576031213e5b31c317135f603271333949dda89e01eMathias Agopian if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) == NO_ERROR) { 577031213e5b31c317135f603271333949dda89e01eMathias Agopian 578031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: lockBuffer should rather be executed when the very first 579031213e5b31c317135f603271333949dda89e01eMathias Agopian // direct rendering occurs. 580031213e5b31c317135f603271333949dda89e01eMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 581031213e5b31c317135f603271333949dda89e01eMathias Agopian 582031213e5b31c317135f603271333949dda89e01eMathias Agopian // reallocate the depth-buffer if needed 583031213e5b31c317135f603271333949dda89e01eMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 584031213e5b31c317135f603271333949dda89e01eMathias Agopian // TODO: we probably should reset the swap rect here 585031213e5b31c317135f603271333949dda89e01eMathias Agopian // if the window size has changed 586031213e5b31c317135f603271333949dda89e01eMathias Agopian width = buffer->width; 587031213e5b31c317135f603271333949dda89e01eMathias Agopian height = buffer->height; 588031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data) { 589031213e5b31c317135f603271333949dda89e01eMathias Agopian free(depth.data); 590031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.width = width; 591031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.height = height; 592031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.stride = buffer->stride; 593031213e5b31c317135f603271333949dda89e01eMathias Agopian depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 594031213e5b31c317135f603271333949dda89e01eMathias Agopian if (depth.data == 0) { 595031213e5b31c317135f603271333949dda89e01eMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 596031213e5b31c317135f603271333949dda89e01eMathias Agopian return EGL_FALSE; 597031213e5b31c317135f603271333949dda89e01eMathias Agopian } 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 600df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 601031213e5b31c317135f603271333949dda89e01eMathias Agopian // keep a reference on the buffer 602031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer->common.incRef(&buffer->common); 603031213e5b31c317135f603271333949dda89e01eMathias Agopian 604031213e5b31c317135f603271333949dda89e01eMathias Agopian // finally pin the buffer down 605031213e5b31c317135f603271333949dda89e01eMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 606031213e5b31c317135f603271333949dda89e01eMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 607031213e5b31c317135f603271333949dda89e01eMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 608031213e5b31c317135f603271333949dda89e01eMathias Agopian buffer, buffer->width, buffer->height); 609031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 610031213e5b31c317135f603271333949dda89e01eMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 611031213e5b31c317135f603271333949dda89e01eMathias Agopian } 612031213e5b31c317135f603271333949dda89e01eMathias Agopian } else { 613031213e5b31c317135f603271333949dda89e01eMathias Agopian return setError(EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 633e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 6380a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 648e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 649076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 653076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 656076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 659076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 662df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 663df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 664df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 665df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 666df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 667df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 668df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 669df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 670df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 671df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 672df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 673df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 674df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 675df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 676df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 677df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 678076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6920696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7550696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 7748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case GGL_PIXEL_FORMAT_RGBX_8888: size *= 4; break; 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 786076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 838639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian static bool ignore(GLint reqValue, GLint confValue) { 839639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian return true; 840639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian } 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 848141550bc18f670f7e7ec65fc25363da3dd35d52eMathias Agopianstatic char const * const gVersionString = "1.2 Android Driver 1.2.0"; 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 850076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 851e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 852076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 853076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 854df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 855076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 865076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 866076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 867076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 869076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 870076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 871076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 872076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 873076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 874076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 875076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 876076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 877076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 878076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 880076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 884076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 886076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 888076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 889076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 890076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 893076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 894076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 900076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 9018d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 9028d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 9038d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 9048d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 9058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 9068d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 909076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 920076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 93556fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9360985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9370985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9380985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 93956fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9400985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9468b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 565 configs 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 955d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 967d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGB_565 }, 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9718b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// RGB 888 configs 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 9748b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9758b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9778b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9788b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 0 }, 9798b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 6 }, 980d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9818b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9828b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9838b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9848b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_3_attribute_list[] = { 9858b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 9868b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_ALPHA_SIZE, 0 }, 9878b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BLUE_SIZE, 8 }, 9888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_GREEN_SIZE, 8 }, 9898b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_RED_SIZE, 8 }, 9908b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_DEPTH_SIZE, 16 }, 9918b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_CONFIG_ID, 7 }, 992d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBX_8888 }, 9938b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 9948b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian}; 9958b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 9968b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// 8888 configs 9978b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_4_attribute_list[] = { 9988b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { EGL_BUFFER_SIZE, 32 }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 10056af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_5_attribute_list[] = { 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 1017d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_RGBA_8888 }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// A8 configs 10228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_6_attribute_list[] = { 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 1030d8e5ceb963c9bd3cba5c307aef481ded7859ef79Mathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic config_pair_t const config_7_attribute_list[] = { 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 10426af358e0a752b179671a9f9ea01757ade3b123cfMathias Agopian { EGL_NATIVE_VISUAL_ID, GGL_PIXEL_FORMAT_A_8 }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 10538b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_6_attribute_list, NELEM(config_6_attribute_list) }, 10548b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian { config_7_attribute_list, NELEM(config_7_attribute_list) }, 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1068639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_HEIGHT, config_management_t::ignore }, 1069639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_PIXELS, config_management_t::ignore }, 1070639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_MAX_PBUFFER_WIDTH, config_management_t::ignore }, 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1072639716736f5d87b64a43a20f39f37dee6bd98806Mathias Agopian { EGL_NATIVE_VISUAL_ID, config_management_t::ignore }, 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10870985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10880985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10890985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10920985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10940985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10950985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10960985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11018b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopianstatic status_t getConfigFormatInfo(EGLint configID, 11028b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian int32_t& pixelFormat, int32_t& depthFormat) 11038b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian{ 11048b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian switch(configID) { 11058b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 0: 11068b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11078b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11088b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11098b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 1: 11108b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 11118b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11128b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11138b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 2: 11148b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11158b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11168b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11178b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 3: 11188b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBX_8888; 11198b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11208b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11218b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 4: 11228b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11238b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11248b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11258b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 5: 11268b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 11278b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11288b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11298b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 6: 11308b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11318b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = 0; 11328b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11338b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian case 7: 11348b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 11358b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian depthFormat = GGL_PIXEL_FORMAT_Z_16; 11368b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian break; 11378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian default: 11388b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NAME_NOT_FOUND; 11398b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian } 11408b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian return NO_ERROR; 11418b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian} 11428b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 11438b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian// ---------------------------------------------------------------------------- 11448b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1150076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1170076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 118297640b9320eac5f5709f48550ff37e9f41297065Christoffer Gurell if (cfgMgtIndex >= 0) { 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12774b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn if (static_cast<ANativeWindow*>(window)->common.magic != 12780696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12790696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12800696a572294bbaa977245afb630065de3278473bMathias Agopian } 12810696a572294bbaa977245afb630065de3278473bMathias Agopian 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 12888b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1299076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 13004b5e91e4820f03dba7dcc36e4b148331bc964b4bDianne Hackborn static_cast<ANativeWindow*>(window)); 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13020696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13260696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 13270696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 13280696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 13290696a572294bbaa977245afb630065de3278473bMathias Agopian } 13300696a572294bbaa977245afb630065de3278473bMathias Agopian 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13378b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13480696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1366076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 13768b6b95abaec4a7e3df80a648bed75aa5aa74e8feMathias Agopian if (getConfigFormatInfo(configID, pixelFormat, depthFormat) != NO_ERROR) { 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13910696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1426076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1434076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1437076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1496749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1497749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1498749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1499749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1501749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 150204aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian /* 150304aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * A NULL attrib_list should be treated as though it was an empty 150404aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * one (terminated with EGL_NONE) as defined in 150504aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian * section 3.4.1 "Querying Configurations" in the EGL specification. 150604aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian */ 150704aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian static const EGLint dummy = EGL_NONE; 150804aed2149d95f04602127eef4d5b6d7d48684359Mathias Agopian attrib_list = &dummy; 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1510076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 15180985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 15280985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 15290985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1533dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15360985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1552749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1553749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1554749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1555749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1556749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1557749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1558749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1559749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1560749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1561749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1562749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1563749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1564749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 16110696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1615e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1616e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1617e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1618e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1619e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 16310696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16320696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1681076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 17250696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17260696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 17270696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 17280696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17290696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 17300696a572294bbaa977245afb630065de3278473bMathias Agopian } 17310696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17320696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17330696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17340696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17370696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1741076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1757e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1768e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1769e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17700696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17710696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 1772e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1773e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1774e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1775e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1776e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1778e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1779e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1793cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1794cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1795cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1800e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1811e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 18129648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1813e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1814e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1815e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1816e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 18179648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1818e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1819e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1820e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1892076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 18940696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 18950696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1985551dc26ebd7db09a6ae8604a8612c00d2ebab403Ari Hirvonen return EGL_TRUE; 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2027076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2040076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2041076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 2042076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 2043076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2044076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2045076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2046076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2047076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 2049076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2052076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2053076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2054076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 2055076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 2056076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2057076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2058076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2061076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2062076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20748dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 20758dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian switch (native_buffer->format) { 20768dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 20778dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBX_8888: 20788dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_888: 20798dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 20808dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 20818dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_5551: 20828dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian case HAL_PIXEL_FORMAT_RGBA_4444: 20838dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian break; 20848dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian default: 20858dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20868dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian } 20878dccb26901973722164f2a11551fd6d5c52081bfMathias Agopian 2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2110df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2111df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2112df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2113df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2114df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2115df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2116df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2117df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2118df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2119df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2120df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2121df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21220696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21230696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2124df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2125df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2126df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2127df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2128df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2129df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2130df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2131df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2132