egl.cpp revision 076b1cc3a9b90aa5b381a1ed268ca0b548444c9b
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> 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <EGL/android_natives.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 49076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include "gralloc_priv.h" 50076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 51076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 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(); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isValid() const = 0; 146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void* getBits() const = 0; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 194076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 196076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 199076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window); 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ~egl_window_surface_v2_t(); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 203076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; } 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 207076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getWidth() const { return buffer->width; } 208076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getHeight() const { return buffer->height; } 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void* getBits() const; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 215076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* nativeWindow; 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 217076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 218076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window) 225076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian : egl_surface_t(dpy, config, depthFormat), nativeWindow(window), buffer(0) 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 227076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 229076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 230076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 232076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 234076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 235076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 245076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 248076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 249076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // FIXME: we need to gralloc lock the buffer 250076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // FIXME: we need to handle the copy-back if needed, but 251076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // for now we're a "non preserving" implementation. 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 254076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (buffer) { 256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.decRef(&buffer->common); 257076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 258076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 261076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 263076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: this is roughly the code needed for preserving the back buffer 264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // efficiently. dirty is the area that has been modified. 265076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //Region newDirty(dirty); 266076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //newDirty.andSelf(Rect(nativeWindow->width, nativeWindow->height)); 267076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //mDirty = newDirty; 268076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //const Region copyback(mDirty.subtract(newDirty)); 269076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //mDisplaySurface->copyFrontToBack(copyback); 270076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 271076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 272076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.decRef(&buffer->common); buffer = 0; 274076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 275076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 276076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 278076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 279076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 280076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 281076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 282076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 283076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: we probably should reset the swap rect here 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if the window size has changed 286076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 287076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data) { 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 291076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.stride = buffer->stride; 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 304076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 305076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) { 306076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // Hardware supported and no destination alpha 307076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (format) { 308076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 309076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 310076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 311076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return true; 312076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian default: 313076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return false; 314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif 317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.data = (GGLubyte*)this->buffer->bits; 326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 330076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = -1; 332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (supportedCopybitsDestinationFormat(buffer.format)) { 333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t handle; 334076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian this->buffer->getHandle(this->buffer, &handle); 335076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (handle != NULL) { 336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian private_handle_t* hand = private_handle_t::dynamicCast(handle); 337076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand != NULL) { 338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand->usesPhysicallyContiguousMemory()) { 339076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = hand->fd; 340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 342076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 347076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 351076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.data = (GGLubyte*)this->buffer->bits; 355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid* egl_window_surface_v2_t::getBits() const { 360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (GGLubyte*)buffer->bits; 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 362076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 368076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const { 372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //uint32_t flags = nativeWindow->flags; 373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //if (flags & SURFACE_FLAG_PRESERVE_CONTENT) 374076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // return EGL_BUFFER_PRESERVED; 375076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // This is now a feature of EGL, currently we don't preserve 376076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // the content of the buffers. 377076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); } 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void* getBits() const { return nativePixmap.data; } 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 427076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 456076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return pbuffer.data != 0; } 457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void* getBits() const { return pbuffer.data; } 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString = "1.2 Android Driver"; 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 549076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "KHR_image_base " 550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 551076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 573076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, 4 }, 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = { 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = { 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = { 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, config_management_t::exact }, 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_PIXELS, config_management_t::exact }, 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, config_management_t::exact }, 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, config_management_t::exact }, 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 762076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 768076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 883076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 891076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 916076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 917076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 918076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian static_cast<android_native_window_t*>(window)); 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 951076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 952076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 956076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 960076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 964076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 968076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 972076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1007076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1015076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1020076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1024076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1028076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1032076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1036076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1097076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1159749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1160749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1161749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1162749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1164749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = 0; 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1168076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t j=0 ; j<NELEM(config_defaults) ; j++) { 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // see if this attribute was specified, if not apply its 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, numAttributes, 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1210749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1211749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1212749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1213749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1214749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1215749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1216749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1217749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1218749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1219749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1220749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1221749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1222749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1249076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1262076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 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_FALSE); 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->magic != egl_surface_t::MAGIC) 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 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_FALSE); 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check that draw and read are compatible with the context 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1382076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // once of the surface is bound to a context in another thread 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1403076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: call connect / disconnect on the surface 1404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = read; 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) d->ctx = EGL_NO_CONTEXT; 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) r->ctx = EGL_NO_CONTEXT; 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1513076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, 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 // TODO: eglSurfaceAttrib() 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 1638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1659076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 1661076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 1662076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1663076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1664076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1665076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1666076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 1668076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1669076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1671076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1672076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1673076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 1675076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1676076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1677076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 1678076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1679076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 1680076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 1681076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1682076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 1683076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1684076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1685076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1686076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 1687076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1688076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1689076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1690076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1691076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1692076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1693076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1694076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian hw_module_t const* pModule; 1695076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule)) 1696076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1697076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t bufferHandle; 1698076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gralloc_module_t const* module = 1699076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian reinterpret_cast<gralloc_module_t const*>(pModule); 1700076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->getHandle(native_buffer, &bufferHandle) < 0) 1701076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1702076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (module->map(module, bufferHandle, &native_buffer->bits) < 0) 1703076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1704076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1705076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 1706076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 1707076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1708076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1709076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 1710076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1711076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1712076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1713076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1714076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1715076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 1716076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1717076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1718076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1719076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1720076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1721076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1722076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1723076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian hw_module_t const* pModule; 1724076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule) == 0) { 1725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t bufferHandle; 1726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gralloc_module_t const* module = 1727076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian reinterpret_cast<gralloc_module_t const*>(pModule); 1728076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->getHandle(native_buffer, &bufferHandle) == 0) { 1729076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian module->unmap(module, bufferHandle); 1730076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1731076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1732076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1733076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 1734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 1736076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1737