egl.cpp revision e71212ba5397387100a578d23b15862518a7a859
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; 149e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect() {} 150e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 197076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 200076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 202076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ~egl_window_surface_v2_t(); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativeWindow->common.magic == ANDROID_NATIVE_WINDOW_MAGIC; } 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 208e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void connect(); 209e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 210076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getWidth() const { return buffer->width; } 211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual EGLint getHeight() const { return buffer->height; } 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 216e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 218e71212ba5397387100a578d23b15862518a7a859Mathias Agopian status_t lock(android_native_buffer_t* buf, int usage, void** vaddr); 2190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian status_t unlock(android_native_buffer_t* buf); 220076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* nativeWindow; 221076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 2220926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 223076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 224076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 225e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 228076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 231076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window) 2320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 233e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow(window), buffer(0), module(0), bits(NULL) 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_module_t const* pModule; 2360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 2370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 2380926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 240076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 241076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 246076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 256076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 257e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 258076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 259e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::connect() 260e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 2610926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 262e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 263e71212ba5397387100a578d23b15862518a7a859Mathias Agopian lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, &bits); 264e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 265e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 266e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 267e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 268e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (buffer) { 269e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 270e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 271e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 275e71212ba5397387100a578d23b15862518a7a859Mathias Agopian android_native_buffer_t* buf, int usage, void** vaddr) 2760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 2770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian int err; 2780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian buffer_handle_t bufferHandle; 2790926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian err = buf->getHandle(buf, &bufferHandle); 2800926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (err < 0) 2810926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 2820926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 2830926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian err = module->lock(module, bufferHandle, 284e71212ba5397387100a578d23b15862518a7a859Mathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 2850926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 2860926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 2870926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 2880926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) 2890926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 2900926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian int err; 2910926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian buffer_handle_t bufferHandle; 2920926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian err = buf->getHandle(buf, &bufferHandle); 2930926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (err < 0) 2940926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 2950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 2960926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian err = module->unlock(module, bufferHandle); 2970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 2980926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 2990926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 3000926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 301076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (buffer) { 303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.decRef(&buffer->common); 304076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 305076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 308076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 310076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: this is roughly the code needed for preserving the back buffer 311076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // efficiently. dirty is the area that has been modified. 312076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //Region newDirty(dirty); 313076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //newDirty.andSelf(Rect(nativeWindow->width, nativeWindow->height)); 314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //mDirty = newDirty; 315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //const Region copyback(mDirty.subtract(newDirty)); 316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //mDisplaySurface->copyFrontToBack(copyback); 317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 3190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.decRef(&buffer->common); buffer = 0; 322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 328e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* vaddr; 329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 330e71212ba5397387100a578d23b15862518a7a859Mathias Agopian lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, &bits); 331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: we probably should reset the swap rect here 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if the window size has changed 335076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data) { 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 339076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.stride = buffer->stride; 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 352076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 353076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 354076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) { 355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // Hardware supported and no destination alpha 356076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (format) { 357076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 358076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_422_SP: 359076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_YCbCr_420_SP: 360076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return true; 361076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian default: 362076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return false; 363076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 364076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 365076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif 366076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 367076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 371076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 373076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 374e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 375076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 379076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = -1; 381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (supportedCopybitsDestinationFormat(buffer.format)) { 382076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_handle_t handle; 383076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian this->buffer->getHandle(this->buffer, &handle); 384076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (handle != NULL) { 385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian private_handle_t* hand = private_handle_t::dynamicCast(handle); 386076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand != NULL) { 387076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (hand->usesPhysicallyContiguousMemory()) { 388076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian gl->copybits.drawSurfaceFd = hand->fd; 389076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 390076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 391076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 392076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 396076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 400076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 402076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 403e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 408076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 411076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 414076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 415076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const { 418076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //uint32_t flags = nativeWindow->flags; 419076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian //if (flags & SURFACE_FLAG_PRESERVE_CONTENT) 420076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // return EGL_BUFFER_PRESERVED; 421076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // This is now a feature of EGL, currently we don't preserve 422076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // the content of the buffers. 423076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 437076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return nativePixmap.version == sizeof(egl_native_pixmap_t); } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 472076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 501076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual bool isValid() const { return pbuffer.data != 0; } 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString = "1.2 Android Driver"; 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "KHR_image_base " 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, 4 }, 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 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_1_attribute_list[] = { 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 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 config_pair_t const config_2_attribute_list[] = { 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = { 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = { 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = { 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, config_management_t::exact }, 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_PIXELS, config_management_t::exact }, 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, config_management_t::exact }, 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, config_management_t::exact }, 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 794076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 806076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 926076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 927076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 931076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 935076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 939076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 943076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 947076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 960076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 961076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 962076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian static_cast<android_native_window_t*>(window)); 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 995076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 996076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1000076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1004076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1008076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1012076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1016076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1048076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1051076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1059076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1060076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!surface->isValid()) { 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1133076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1203749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1204749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1205749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1206749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1208749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = 0; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1212076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t j=0 ; j<NELEM(config_defaults) ; j++) { 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // see if this attribute was specified, if not apply its 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, numAttributes, 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<numConfigs ; i++) { 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1254749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1255749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1256749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1257749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1258749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1259749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1260749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1261749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1262749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1263749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1264749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1265749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1266749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1306076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->magic != egl_surface_t::MAGIC) 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1317e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1318e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1319e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1320e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1321e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: check that draw and read are compatible with the context 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1431076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1447e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1458e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1459e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 1460e71212ba5397387100a578d23b15862518a7a859Mathias Agopian reinterpret_cast<egl_surface_t*>(c->draw)->disconnect(); 1461e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1462e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1463e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1464e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1465e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1467e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1468e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1482e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->connect(); 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1487e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1498e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 1499e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1500e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1501e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1502e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 1503e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1504e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1505e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 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); 1577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 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_FALSE); 1641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1710076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1723076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1724076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 1725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 1726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1727076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1728076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1729076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1730076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1731076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 1732076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1733076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 1734076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 1735076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1736076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1737076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1738076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 1739076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1740076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1741076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 1742076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 1744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 1745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 1747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 1751076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1752076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1753076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1755076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 17578b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian 1758076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 1759076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 1760076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1761076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1762076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 1763076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 1764076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 1765076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1766076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1767076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1768076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 1769076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1770076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 1771076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1772076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1773076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 1774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1775076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1776076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 1777076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 1779076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 1780