egl.cpp revision bc4929117d0b07fec2f0986f38641eecc9f20d55
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2007 The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License Version 2.0(the "License"); 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing software 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied. 14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <assert.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <fcntl.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/ioctl.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/mman.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/log.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <cutils/atomic.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/eglext.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/format.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <pixelflinger/pixelflinger.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4258a79f47457e9cae2f6880653b581fe3170b0b1fMathias Agopian#include <private/ui/android_natives_priv.h> 43bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian#include <private/ui/sw_gralloc_handle.h> 447189c0054e29a66d945f5657c48d5ecf538ea511Mathias Agopian 45240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian#include <hardware/copybit.h> 46240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define NELEM(x) (sizeof(x)/sizeof(*(x))) 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst unsigned int NUM_DISPLAYS = 1; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gInitMutex = PTHREAD_MUTEX_INITIALIZER; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_mutex_t gErrorKeyMutex = PTHREAD_MUTEX_INITIALIZER; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic pthread_key_t gEGLErrorKey = -1; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpthread_key_t gGLKey = -1; 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic T setError(GLint error, T returnValue) { 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) { 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gErrorKeyMutex); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gEGLErrorKey == -1) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gEGLErrorKey, NULL); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gErrorKeyMutex); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)error); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return returnValue; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic GLint getError() { 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(gEGLErrorKey == -1)) 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_SUCCESS; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint error = (GLint)pthread_getspecific(gEGLErrorKey); 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return error; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_display_t 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t() : type(0), initialized(0) { } 95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static egl_display_t& get_display(EGLDisplay dpy); 97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static EGLBoolean is_valid(EGLDisplay dpy) { 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((uintptr_t(dpy)-1U) >= NUM_DISPLAYS) ? EGL_FALSE : EGL_TRUE; 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeDisplayType type; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t initialized; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic egl_display_t gDisplays[NUM_DISPLAYS]; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_display_t& egl_display_t::get_display(EGLDisplay dpy) { 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDisplays[uintptr_t(dpy)-1U]; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_context_t { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IS_CURRENT = 0x00010000, 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NEVER_CURRENT = 0x00020000 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags; 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface draw; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static inline egl_context_t* context(EGLContext ctx) { 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* const gl = static_cast<ogles_context_t*>(ctx); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return static_cast<egl_context_t*>(gl->rasterizer.base); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_surface_t 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PAGE_FLIP = 0x00000001, 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project MAGIC = 0x31415265 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t magic; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config; 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_surface_t(); 1450696a572294bbaa977245afb630065de3278473bMathias Agopian bool isValid() const; 1460696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const = 0; 147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl) = 0; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl) = 0; 150cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect() { return EGL_TRUE; } 151e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect() {} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const = 0; 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const = 0; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 160df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 1618d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian virtual EGLClientBuffer getRenderBuffer() const; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface depth; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::egl_surface_t(EGLDisplay dpy, 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat) 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : magic(MAGIC), dpy(dpy), config(config), ctx(0) 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.version = sizeof(GGLSurface); 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = 0; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.format = depthFormat; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_surface_t::~egl_surface_t() 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project magic = 0; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1800696a572294bbaa977245afb630065de3278473bMathias Agopianbool egl_surface_t::isValid() const { 1810696a572294bbaa977245afb630065de3278473bMathias Agopian LOGE_IF(magic != MAGIC, "invalid EGLSurface (%p)", this); 1820696a572294bbaa977245afb630065de3278473bMathias Agopian return magic == MAGIC; 1830696a572294bbaa977245afb630065de3278473bMathias Agopian} 1840696a572294bbaa977245afb630065de3278473bMathias Agopian 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_surface_t::swapBuffers() { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getHorizontalResolution() const { 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getVerticalResolution() const { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (0 * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getRefreshRate() const { 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (60 * EGL_DISPLAY_SCALING); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint egl_surface_t::getSwapBehavior() const { 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_BUFFER_PRESERVED; 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_surface_t::setSwapRectangle( 201df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 202df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 203df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_FALSE; 204df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 2058d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_surface_t::getRenderBuffer() const { 2068d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return 0; 2078d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 211076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct egl_window_surface_v2_t : public egl_surface_t 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 213076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_window_surface_v2_t( 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 216076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window); 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2180696a572294bbaa977245afb630065de3278473bMathias Agopian ~egl_window_surface_v2_t(); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2200696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return true; } // TODO: report failure if ctor fails 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean swapBuffers(); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 224cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian virtual EGLBoolean connect(); 225e71212ba5397387100a578d23b15862518a7a859Mathias Agopian virtual void disconnect(); 226cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getWidth() const { return width; } 227cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian virtual EGLint getHeight() const { return height; } 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHorizontalResolution() const; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getVerticalResolution() const; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getRefreshRate() const; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getSwapBehavior() const; 232df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian virtual EGLBoolean setSwapRectangle(EGLint l, EGLint t, EGLint w, EGLint h); 2338d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian virtual EGLClientBuffer getRenderBuffer() const; 2348d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 236e71212ba5397387100a578d23b15862518a7a859Mathias Agopian status_t lock(android_native_buffer_t* buf, int usage, void** vaddr); 2370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian status_t unlock(android_native_buffer_t* buf); 238076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* nativeWindow; 239076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* buffer; 240df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* previousBuffer; 2410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian gralloc_module_t const* module; 242240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* blitengine; 243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int width; 244076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian int height; 245e71212ba5397387100a578d23b15862518a7a859Mathias Agopian void* bits; 246df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GGLFormat const* pixelFormatTable; 247df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 248df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Rect { 249df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect() { }; 250df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t w, int32_t h) 251df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(0), top(0), right(w), bottom(h) { } 252df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Rect(int32_t l, int32_t t, int32_t r, int32_t b) 253df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian : left(l), top(t), right(r), bottom(b) { } 254df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect& andSelf(const Rect& r) { 255df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian left = max(left, r.left); 256df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian top = max(top, r.top); 257df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian right = min(right, r.right); 258df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bottom = min(bottom, r.bottom); 259df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return *this; 260df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 261df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 262df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return (left>=right || top>=bottom); 263df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 264df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void dump(char const* what) { 265df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGD("%s { %5d, %5d, w=%5d, h=%5d }", 266df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian what, left, top, right-left, bottom-top); 267df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 268df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 269df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t left; 270df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t top; 271df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t right; 272df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian int32_t bottom; 273df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 274df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 275df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian struct Region { 276df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian inline Region() : count(0) { } 277240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian typedef Rect const* const_iterator; 278240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator begin() const { return storage; } 279240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const_iterator end() const { return storage+count; } 280df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian static Region subtract(const Rect& lhs, const Rect& rhs) { 281df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Region reg; 282df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect* storage = reg.storage; 283df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!lhs.isEmpty()) { 284df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.top < rhs.top) { // top rect 285df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 286df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->top = lhs.top; 287df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 288240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = rhs.top; 289df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 290df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 291240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t top = max(lhs.top, rhs.top); 292240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const int32_t bot = min(lhs.bottom, rhs.bottom); 293240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (top < bot) { 294240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.left < rhs.left) { // left-side rect 295240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = lhs.left; 296240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 297240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = rhs.left; 298240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 299240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 300240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 301240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (lhs.right > rhs.right) { // right-side rect 302240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->left = rhs.right; 303240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = top; 304240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->right = lhs.right; 305240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->bottom = bot; 306240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage++; 307240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 308df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 309df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lhs.bottom > rhs.bottom) { // bottom rect 310df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->left = lhs.left; 311240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian storage->top = rhs.bottom; 312df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->right = lhs.right; 313df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage->bottom = lhs.bottom; 314df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian storage++; 315df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 316df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian reg.count = storage - reg.storage; 317df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 318df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return reg; 319df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 320df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian bool isEmpty() const { 321df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return count<=0; 322df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 323df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian private: 324df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect storage[4]; 325df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian ssize_t count; 326df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian }; 327df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 328240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian struct region_iterator : public copybit_region_t { 329240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator(const Region& region) 330240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian : b(region.begin()), e(region.end()) { 331240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian this->next = iterate; 332240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 333240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian private: 334240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian static int iterate(copybit_region_t const * self, copybit_rect_t* rect) { 335240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator const* me = static_cast<region_iterator const*>(self); 336240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (me->b != me->e) { 337240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian *reinterpret_cast<Rect*>(rect) = *me->b++; 338240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 1; 339240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 340240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian return 0; 341240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 342240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian mutable Region::const_iterator b; 343240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator const e; 344240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian }; 345240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 346df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void copyBlt( 347df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 348df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 349240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip); 350df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 351df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect dirtyRegion; 352df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian Rect oldDirtyRegion; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 355076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianegl_window_surface_v2_t::egl_window_surface_v2_t(EGLDisplay dpy, 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 358076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_window_t* window) 3590926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian : egl_surface_t(dpy, config, depthFormat), 360df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian nativeWindow(window), buffer(0), previousBuffer(0), module(0), 361240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian blitengine(0), bits(NULL) 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 3630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_module_t const* pModule; 3640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &pModule); 3650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian module = reinterpret_cast<gralloc_module_t const*>(pModule); 3660926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 367240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &pModule) == 0) { 368240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_open(pModule, &blitengine); 369240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 370240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 371df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian pixelFormatTable = gglGetPixelFormatTable(); 372df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 373df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the window 374076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->common.incRef(&nativeWindow->common); 375cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &width); 376cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &height); 377cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 378076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 379cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianegl_window_surface_v2_t::~egl_window_surface_v2_t() { 380cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 381cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 382cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 383cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 384cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 385cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 386cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->common.decRef(&nativeWindow->common); 387cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (blitengine) { 388cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian copybit_close(blitengine); 389cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 390cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian} 391cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian 392cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias AgopianEGLBoolean egl_window_surface_v2_t::connect() 393cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian{ 3945221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian // we're intending to do software rendering 3955221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian native_window_set_usage(nativeWindow, 3965221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 3975221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian 398df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a buffer 399cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (nativeWindow->dequeueBuffer(nativeWindow, &buffer) != NO_ERROR) { 400cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 401cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 402df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 403df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // allocate a corresponding depth-buffer 404076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 405076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 406cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (depth.format) { 407076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 408076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 412cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ALLOC, EGL_FALSE); 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 415076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 416df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 417076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer->common.incRef(&buffer->common); 418df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 4190926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian // Lock the buffer 420e71212ba5397387100a578d23b15862518a7a859Mathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 421df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // pin the buffer down 422df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 423df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 424240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("connect() failed to lock buffer %p (%ux%u)", 425df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 426cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 427df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 428df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 429cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_TRUE; 430e71212ba5397387100a578d23b15862518a7a859Mathias Agopian} 431e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 432e71212ba5397387100a578d23b15862518a7a859Mathias Agopianvoid egl_window_surface_v2_t::disconnect() 433e71212ba5397387100a578d23b15862518a7a859Mathias Agopian{ 4349648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian if (buffer && bits) { 435e71212ba5397387100a578d23b15862518a7a859Mathias Agopian bits = NULL; 436e71212ba5397387100a578d23b15862518a7a859Mathias Agopian unlock(buffer); 437e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 438cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian // enqueue the last frame 439cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 440cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (buffer) { 441cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer->common.decRef(&buffer->common); 442cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian buffer = 0; 443cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 444cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian if (previousBuffer) { 445cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 446cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian previousBuffer = 0; 447cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian } 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 449076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 4500926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::lock( 451e71212ba5397387100a578d23b15862518a7a859Mathias Agopian android_native_buffer_t* buf, int usage, void** vaddr) 4520926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 453bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err; 454bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian if (sw_gralloc_handle_t::validate(buf->handle) < 0) { 455bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = module->lock(module, buf->handle, 456bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian usage, 0, 0, buf->width, buf->height, vaddr); 457bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } else { 458bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian sw_gralloc_handle_t const* hnd = 459bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian reinterpret_cast<sw_gralloc_handle_t const*>(buf->handle); 460bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian *vaddr = (void*)hnd->base; 461bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = NO_ERROR; 462bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } 4630926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4640926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4650926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 4660926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianstatus_t egl_window_surface_v2_t::unlock(android_native_buffer_t* buf) 4670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 468cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buf) return BAD_VALUE; 469bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian int err = NO_ERROR; 470bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian if (sw_gralloc_handle_t::validate(buf->handle) < 0) { 471bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian err = module->unlock(module, buf->handle); 472bc4929117d0b07fec2f0986f38641eecc9f20d55Mathias Agopian } 4730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian return err; 4740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 4750926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 476df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopianvoid egl_window_surface_v2_t::copyBlt( 477df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* dst, void* dst_vaddr, 478df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian android_native_buffer_t* src, void const* src_vaddr, 479240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Region& clip) 480df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 481df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: use copybit if possible 482df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // NOTE: dst and src must be the same format 483df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 484240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian status_t err = NO_ERROR; 485240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_device_t* const copybit = blitengine; 486240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (copybit) { 487240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t simg; 488240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.w = src->width; 489240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.h = src->height; 490240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.format = src->format; 491240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian simg.handle = const_cast<native_handle_t*>(src->handle); 492240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 493240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit_image_t dimg; 494240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.w = dst->width; 495240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.h = dst->height; 496240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.format = dst->format; 497240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian dimg.handle = const_cast<native_handle_t*>(dst->handle); 498240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 499240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0); 500240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 255); 501240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE); 502240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian region_iterator it(clip); 503240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian err = copybit->blit(copybit, &dimg, &simg, &it); 504240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (err != NO_ERROR) { 505240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian LOGE("copybit failed (%s)", strerror(err)); 506240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 507240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 5080926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 509240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (!copybit || err) { 510240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator cur = clip.begin(); 511240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian Region::const_iterator end = clip.end(); 512240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 513240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t bpp = pixelFormatTable[src->format].size; 514240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t dbpr = dst->stride * bpp; 515240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const size_t sbpr = src->stride * bpp; 516240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 517240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * const src_bits = (uint8_t const *)src_vaddr; 518240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * const dst_bits = (uint8_t *)dst_vaddr; 519240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian 520240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian while (cur != end) { 521240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian const Rect& r(*cur++); 522240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t w = r.right - r.left; 523240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian ssize_t h = r.bottom - r.top; 524240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (w <= 0 || h<=0) continue; 525240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size_t size = w * bpp; 526240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 527240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 528240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian if (dbpr==sbpr && size==sbpr) { 529240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian size *= h; 530240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian h = 1; 531240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } 532240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian do { 533240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian memcpy(d, s, size); 534240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian d += dbpr; 535240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian s += sbpr; 536240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian } while (--h > 0); 537df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::swapBuffers() 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 543cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (!buffer) { 544cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 545cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 546cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian 547df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 548df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * Handle eglSetSwapRectangleANDROID() 549df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * We copyback from the front buffer 550df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 551df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!dirtyRegion.isEmpty()) { 552df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion.andSelf(Rect(buffer->width, buffer->height)); 553df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 554df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian const Region copyBack(Region::subtract(oldDirtyRegion, dirtyRegion)); 555df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (!copyBack.isEmpty()) { 556df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian void* prevBits; 557df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(previousBuffer, 558240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN, &prevBits) == NO_ERROR) { 559240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian // copy from previousBuffer to buffer 560240c9fe59e9db5807c88796f60889acc44ba845cMathias Agopian copyBlt(buffer, bits, previousBuffer, prevBits, copyBack); 561df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian unlock(previousBuffer); 562df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 563df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 564df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 565df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian oldDirtyRegion = dirtyRegion; 566df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 568df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (previousBuffer) { 569df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer->common.decRef(&previousBuffer->common); 570df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = 0; 571df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 5730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian unlock(buffer); 574df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian previousBuffer = buffer; 575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->queueBuffer(nativeWindow, buffer); 576df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer = 0; 577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 578df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // dequeue a new buffer 579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->dequeueBuffer(nativeWindow, &buffer); 580df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // TODO: lockBuffer should rather be executed when the very first 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // direct rendering occurs. 583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian nativeWindow->lockBuffer(nativeWindow, buffer); 584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 585df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // reallocate the depth-buffer if needed 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if ((width != buffer->width) || (height != buffer->height)) { 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: we probably should reset the swap rect here 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if the window size has changed 589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian width = buffer->width; 590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian height = buffer->height; 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data) { 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(depth.data); 593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.width = width; 594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.height = height; 595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian depth.stride = buffer->stride; 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 598df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian setError(EGL_BAD_ALLOC, EGL_FALSE); 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 603df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 604df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // keep a reference on the buffer 605df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer->common.incRef(&buffer->common); 606df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 607df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // finally pin the buffer down 608df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (lock(buffer, GRALLOC_USAGE_SW_READ_OFTEN | 609df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian GRALLOC_USAGE_SW_WRITE_OFTEN, &bits) != NO_ERROR) { 610df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian LOGE("eglSwapBuffers() failed to lock buffer %p (%ux%u)", 611df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian buffer, buffer->width, buffer->height); 612cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return setError(EGL_BAD_ACCESS, EGL_FALSE); 613df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // FIXME: we should make sure we're not accessing the buffer anymore 614df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian } 615df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 616df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 617df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 618df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 619df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean egl_window_surface_v2_t::setSwapRectangle( 620df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint l, EGLint t, EGLint w, EGLint h) 621df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 622df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian dirtyRegion = Rect(l, t, l+w, t+h); 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6268d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer egl_window_surface_v2_t::getRenderBuffer() const 6278d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{ 6288d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return buffer; 6298d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 6308d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic bool supportedCopybitsDestinationFormat(int format) { 6348d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian // Hardware supported 635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian switch (format) { 636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case HAL_PIXEL_FORMAT_RGB_565: 6378d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 6388d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_4444: 6398d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_RGBA_5551: 6408d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return true; 642076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 6438d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return false; 644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif 646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindDrawSurface(ogles_context_t* gl) 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 651076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 652076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 653076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 654e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; 655076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 6590a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 660076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef LIBAGL_USE_GRALLOC_COPYBITS 6610a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian gl->copybits.drawSurfaceBuffer = 0; 662f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (gl->copybits.blitEngine != NULL) { 663f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (supportedCopybitsDestinationFormat(buffer.format)) { 664f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian buffer_handle_t handle = this->buffer->handle; 665f13901eaa98241b52062a3ae3b016badce3dee0cMathias Agopian if (handle != NULL) { 6666fee064809068fe1a7da63d55678d9a222b0be15Mathias Agopian gl->copybits.drawSurfaceBuffer = this->buffer; 667076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 668076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 669076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // LIBAGL_USE_GRALLOC_COPYBITS 6710a3139a21e628093893bba8ca0bb0b4742e0522cMathias Agopian 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean egl_window_surface_v2_t::bindReadSurface(ogles_context_t* gl) 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 678076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.width = this->buffer->width; 679076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.height = this->buffer->height; 680076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.stride = this->buffer->stride; 681e71212ba5397387100a578d23b15862518a7a859Mathias Agopian buffer.data = (GGLubyte*)bits; // FIXME: hopefully is is LOCKED!!! 682076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer.format = this->buffer->format; 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 686076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getHorizontalResolution() const { 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->xdpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 689076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getVerticalResolution() const { 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (nativeWindow->ydpi * EGL_DISPLAY_SCALING) * (1.0f / 25.4f); 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 692076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLint egl_window_surface_v2_t::getRefreshRate() const { 693076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (60 * EGL_DISPLAY_SCALING); // FIXME 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 695df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLint egl_window_surface_v2_t::getSwapBehavior() const 696df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 697df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian /* 698df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_PRESERVED means that eglSwapBuffers() completely preserves 699df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * the content of the swapped buffer. 700df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 701df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * EGL_BUFFER_DESTROYED means that the content of the buffer is lost. 702df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 703df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * However when ANDROID_swap_retcangle is supported, EGL_BUFFER_DESTROYED 704df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * only applies to the area specified by eglSetSwapRectangleANDROID(), that 705df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * is, everything outside of this area is preserved. 706df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 707df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * This implementation of EGL assumes the later case. 708df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian * 709df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian */ 710df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 711076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_BUFFER_DESTROYED; 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pixmap_surface_t : public egl_surface_t 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pixmap_surface_t( 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap); 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pixmap_surface_t() { } 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7250696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return !depth.format || depth.data!=0; } 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return nativePixmap.width; } 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return nativePixmap.height; } 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t nativePixmap; 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pixmap_surface_t::egl_pixmap_surface_t(EGLDisplay dpy, 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat, 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_native_pixmap_t const * pixmap) 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat), nativePixmap(*pixmap) 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pixmap->width; 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pixmap->height; 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindDrawSurface(ogles_context_t* gl) 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 759076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &buffer); 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pixmap_surface_t::bindReadSurface(ogles_context_t* gl) 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface buffer; 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.version = sizeof(GGLSurface); 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.width = nativePixmap.width; 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.height = nativePixmap.height; 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.stride = nativePixmap.stride; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.data = nativePixmap.data; 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer.format = nativePixmap.format; 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &buffer); 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct egl_pbuffer_surface_t : public egl_surface_t 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_pbuffer_surface_t( 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLConfig config, int32_t depthFormat, 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f); 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual ~egl_pbuffer_surface_t(); 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7880696a572294bbaa977245afb630065de3278473bMathias Agopian virtual bool initCheck() const { return pbuffer.data != 0; } 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindDrawSurface(ogles_context_t* gl); 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLBoolean bindReadSurface(ogles_context_t* gl); 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getWidth() const { return pbuffer.width; } 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual EGLint getHeight() const { return pbuffer.height; } 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGLSurface pbuffer; 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, int32_t depthFormat, 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w, int32_t h, int32_t f) 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : egl_surface_t(dpy, config, depthFormat) 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t size = w*h; 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (f) { 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_A_8: size *= 1; break; 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGB_565: size *= 2; break; 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GGL_PIXEL_FORMAT_RGBA_8888: size *= 4; break; 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("incompatible pixel format for pbuffer (format=%d)", f); 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = 0; 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.version = sizeof(GGLSurface); 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.width = w; 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.height = h; 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.stride = w; 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.data = (GGLubyte*)malloc(size); 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pbuffer.format = f; 818076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depthFormat) { 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.width = pbuffer.width; 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.height = pbuffer.height; 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.stride = depth.width; // use the width here 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth.data = (GGLubyte*)malloc(depth.stride*depth.height*2); 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data == 0) { 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setError(EGL_BAD_ALLOC, EGL_NO_SURFACE); 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectegl_pbuffer_surface_t::~egl_pbuffer_surface_t() { 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(pbuffer.data); 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindDrawSurface(ogles_context_t* gl) 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.colorBuffer(gl, &pbuffer); 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth.data != gl->rasterizer.state.buffers.depth.data) 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.depthBuffer(gl, &depth); 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean egl_pbuffer_surface_t::bindReadSurface(ogles_context_t* gl) 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gl->rasterizer.procs.readBuffer(gl, &pbuffer); 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_pair_t { 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint value; 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct configs_t { 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const config_pair_t* array; 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int size; 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct config_management_t { 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint key; 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool (*match)(GLint reqValue, GLint confValue); 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool atLeast(GLint reqValue, GLint confValue) { 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue >= reqValue); 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool exact(GLint reqValue, GLint confValue) { 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (reqValue == EGL_DONT_CARE) || (confValue == reqValue); 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static bool mask(GLint reqValue, GLint confValue) { 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (confValue & reqValue) == reqValue; 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MAJOR 1 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VERSION_MINOR 2 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVendorString = "Google Inc."; 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gVersionString = "1.2 Android Driver"; 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic char const * const gClientApiString = "OpenGL ES"; 879076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic char const * const gExtensionsString = 880e6bf8b32b616450f80b64d226ea673f4a2e0bf8dMathias Agopian "EGL_KHR_image_base " 881076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian // "KHR_image_pixmap " 882076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian "EGL_ANDROID_image_native_buffer " 883df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian "EGL_ANDROID_swap_rectangle " 8848d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian "EGL_ANDROID_get_render_buffer " 885076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ; 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct extention_map_t { 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const char * const name; 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project __eglMustCastToProperFunctionPointerType address; 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const extention_map_t gExtentionMap[] = { 895076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsOES", 896076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsOES }, 897076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexiOES", 898076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexiOES }, 899076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfOES", 900076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfOES }, 901076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxOES", 902076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxOES }, 903076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexsvOES", 904076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexsvOES }, 905076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexivOES", 906076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexivOES }, 907076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexfvOES", 908076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexfvOES }, 909076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDrawTexxvOES", 910076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDrawTexxvOES }, 911076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glQueryMatrixxOES", 912076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glQueryMatrixxOES }, 913076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetTexture2DOES", 914076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetTexture2DOES }, 915076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glEGLImageTargetRenderbufferStorageOES", 916076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glEGLImageTargetRenderbufferStorageOES }, 917076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanef", 918076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanef }, 919076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glClipPlanex", 920076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glClipPlanex }, 921076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBindBuffer", 922076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBindBuffer }, 923076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferData", 924076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferData }, 925076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glBufferSubData", 926076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glBufferSubData }, 927076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glDeleteBuffers", 928076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glDeleteBuffers }, 929076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { "glGenBuffers", 930076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian (__eglMustCastToProperFunctionPointerType)&glGenBuffers }, 9318d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglCreateImageKHR", 9328d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglCreateImageKHR }, 9338d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglDestroyImageKHR", 9348d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglDestroyImageKHR }, 9358d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglSetSwapRectangleANDROID", 9368d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglSetSwapRectangleANDROID }, 9378d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian { "eglGetRenderBufferANDROID", 9388d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian (__eglMustCastToProperFunctionPointerType)&eglGetRenderBufferANDROID }, 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 941076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * In the lists below, attributes names MUST be sorted. 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Additionally, all configs must be sorted according to 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the EGL specification. 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_base_attribute_list[] = { 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, 0 }, 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, EGL_SLOW_CONFIG }, 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, 0 }, 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, GGL_MAX_VIEWPORT_DIMS }, 952076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian { EGL_MAX_PBUFFER_PIXELS, 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GGL_MAX_VIEWPORT_DIMS*GGL_MAX_VIEWPORT_DIMS }, 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, GGL_MAX_VIEWPORT_DIMS }, 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, EGL_TRUE }, 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, 0 }, 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, GGL_PIXEL_FORMAT_RGB_565 }, 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, 0 }, 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, 0 }, 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, EGL_NONE }, 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, 0 }, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, 0 }, 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, 0 }, 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, EGL_FALSE }, 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, EGL_FALSE }, 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, 1 }, 96756fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_MAX_SWAP_INTERVAL, 1 }, 9680985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, 0 }, 9690985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, 0 }, 9700985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER }, 97156fa27572a2bbdd84a4762968327dba670fedae0Mathias Agopian { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT }, 9720985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, 0 } 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// These configs can override the base attribute list 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// NOTE: when adding a config here, don't forget to update eglCreate*Surface() 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 9780985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_0_attribute_list[] = { 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 0 }, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_1_attribute_list[] = { 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 16 }, 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 0 }, 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 5 }, 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 6 }, 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 5 }, 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 1 }, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_2_attribute_list[] = { 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 2 }, 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_3_attribute_list[] = { 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 32 }, 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 8 }, 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 8 }, 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 8 }, 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 3 }, 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_4_attribute_list[] = { 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 0 }, 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 4 }, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_5_attribute_list[] = { 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, 8 }, 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, 8 }, 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, 0 }, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, 0 }, 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, 0 }, 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, 16 }, 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, 5 }, 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, EGL_WINDOW_BIT|EGL_PBUFFER_BIT|EGL_PIXMAP_BIT }, 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic configs_t const gConfigs[] = { 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_0_attribute_list, NELEM(config_0_attribute_list) }, 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_1_attribute_list, NELEM(config_1_attribute_list) }, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_2_attribute_list, NELEM(config_2_attribute_list) }, 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_3_attribute_list, NELEM(config_3_attribute_list) }, 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_4_attribute_list, NELEM(config_4_attribute_list) }, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { config_5_attribute_list, NELEM(config_5_attribute_list) }, 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_management_t const gConfigManagement[] = { 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BUFFER_SIZE, config_management_t::atLeast }, 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_ALPHA_SIZE, config_management_t::atLeast }, 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BLUE_SIZE, config_management_t::atLeast }, 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_GREEN_SIZE, config_management_t::atLeast }, 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_RED_SIZE, config_management_t::atLeast }, 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_DEPTH_SIZE, config_management_t::atLeast }, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_STENCIL_SIZE, config_management_t::atLeast }, 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_CAVEAT, config_management_t::exact }, 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_CONFIG_ID, config_management_t::exact }, 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_LEVEL, config_management_t::exact }, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_HEIGHT, config_management_t::exact }, 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_PIXELS, config_management_t::exact }, 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_PBUFFER_WIDTH, config_management_t::exact }, 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_RENDERABLE, config_management_t::exact }, 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_ID, config_management_t::exact }, 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_NATIVE_VISUAL_TYPE, config_management_t::exact }, 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLES, config_management_t::exact }, 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SAMPLE_BUFFERS, config_management_t::exact }, 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_SURFACE_TYPE, config_management_t::mask }, 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_TYPE, config_management_t::exact }, 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_BLUE_VALUE, config_management_t::exact }, 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_GREEN_VALUE, config_management_t::exact }, 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_TRANSPARENT_RED_VALUE, config_management_t::exact }, 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGBA, config_management_t::exact }, 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_BIND_TO_TEXTURE_RGB, config_management_t::exact }, 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MIN_SWAP_INTERVAL, config_management_t::exact }, 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { EGL_MAX_SWAP_INTERVAL, config_management_t::exact }, 10820985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_LUMINANCE_SIZE, config_management_t::atLeast }, 10830985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_ALPHA_MASK_SIZE, config_management_t::atLeast }, 10840985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_COLOR_BUFFER_TYPE, config_management_t::exact }, 10850985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_RENDERABLE_TYPE, config_management_t::mask }, 10860985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian { EGL_CONFORMANT, config_management_t::mask } 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 10890985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic config_pair_t const config_defaults[] = { 10910985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // attributes that are not specified are simply ignored, if a particular 10920985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // one needs not be ignored, it must be specified here, eg: 10930985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // { EGL_SURFACE_TYPE, EGL_WINDOW_BIT }, 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename T> 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int binarySearch(T const sortedArray[], int first, int last, EGLint key) 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (first <= last) { 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int mid = (first + last) / 2; 1103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (key > sortedArray[mid].key) { 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first = mid + 1; 1105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } else if (key < sortedArray[mid].key) { 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project last = mid - 1; 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mid; 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int isAttributeMatching(int i, EGLint attr, EGLint val) 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for the attribute in all of our configs 1117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian config_pair_t const* configFound = gConfigs[i].array; 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = binarySearch<config_pair_t>( 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[i].array, 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[i].size-1, 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index < 0) { 1123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian configFound = config_base_attribute_list; 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index = binarySearch<config_pair_t>( 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute found, check if this config could match 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cfgMgtIndex = binarySearch<config_management_t>( 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigManagement, 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(gConfigManagement)-1, 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attr); 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index >= 0) { 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool match = gConfigManagement[cfgMgtIndex].match( 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project val, configFound[index].value); 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (match) { 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this config matches 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1; 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // attribute not found. this should NEVER happen. 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // error, this attribute doesn't exist 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int makeCurrent(ogles_context_t* gl) 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* current = (ogles_context_t*)getGlThreadSpecific(); 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gl) { 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(gl); 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) { 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current != gl) { 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is an error to set a context current, if it's already 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // current to another thread 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return -1; 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(c->flags & egl_context_t::IS_CURRENT)) { 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The context is not current, make it current! 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(gl); 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags |= egl_context_t::IS_CURRENT; 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current) { 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark the current context as not current, and flush 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFlush(); 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t::context(current)->flags &= ~egl_context_t::IS_CURRENT; 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this thread has no context attached to it 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLBoolean getConfigAttrib(EGLDisplay dpy, EGLConfig config, 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t numConfigs = NELEM(gConfigs); 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = (int)config; 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (uint32_t(index) >= numConfigs) 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_CONFIG, EGL_FALSE); 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int attrIndex; 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gConfigs[index].array, 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, gConfigs[index].size-1, 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = gConfigs[index].array[attrIndex].value; 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrIndex = binarySearch<config_pair_t>( 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_base_attribute_list, 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0, NELEM(config_base_attribute_list)-1, 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attribute); 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrIndex>=0) { 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = config_base_attribute_list[attrIndex].value; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createWindowSurface(EGLDisplay dpy, EGLConfig config, 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, const EGLint *attrib_list) 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (window == 0) 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_WINDOW_BIT)) 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12300696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<android_native_window_t*>(window)->common.magic != 12310696a572294bbaa977245afb630065de3278473bMathias Agopian ANDROID_NATIVE_WINDOW_MAGIC) { 12320696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 12330696a572294bbaa977245afb630065de3278473bMathias Agopian } 12340696a572294bbaa977245afb630065de3278473bMathias Agopian 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1242076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1243076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1247076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1251076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1255076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1259076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1263076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // FIXME: we don't have access to the pixelFormat here just yet. 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (it's possible that the surface is not fully initialized) 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // maybe this should be done after the page-flip 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //if (EGLint(info.format) != pixelFormat) 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1276076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian egl_surface_t* surface; 1277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian surface = new egl_window_surface_v2_t(dpy, config, depthFormat, 1278076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian static_cast<android_native_window_t*>(window)); 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12800696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPixmapSurface(EGLDisplay dpy, EGLConfig config, 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, const EGLint *attrib_list) 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap == 0) 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PIXMAP_BIT)) 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13040696a572294bbaa977245afb630065de3278473bMathias Agopian if (static_cast<egl_native_pixmap_t*>(pixmap)->version != 13050696a572294bbaa977245afb630065de3278473bMathias Agopian sizeof(egl_native_pixmap_t)) { 13060696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 13070696a572294bbaa977245afb630065de3278473bMathias Agopian } 13080696a572294bbaa977245afb630065de3278473bMathias Agopian 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1337076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pixmap->format != pixelFormat) 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pixmap_surface_t(dpy, config, depthFormat, 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static_cast<egl_native_pixmap_t*>(pixmap)); 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13510696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic EGLSurface createPbufferSurface(EGLDisplay dpy, EGLConfig config, 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint surfaceType; 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1369076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(surfaceType & EGL_PBUFFER_BIT)) 1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1372076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint configID; 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (getConfigAttrib(dpy, config, EGL_CONFIG_ID, &configID) == EGL_FALSE) 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t depthFormat; 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t pixelFormat; 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(configID) { 1380076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian case 0: 1381076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: 1385076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGB_565; 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: 1389076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: 1393076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_RGBA_8888; 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 4: 1397076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = 0; 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 5: 1401076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian pixelFormat = GGL_PIXEL_FORMAT_A_8; 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthFormat = GGL_PIXEL_FORMAT_Z_16; 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_NO_SURFACE); 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t w = 0; 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t h = 0; 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (attrib_list[0]) { 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_WIDTH) w = attrib_list[1]; 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (attrib_list[0] == EGL_HEIGHT) h = attrib_list[1]; 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project attrib_list+=2; 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new egl_pbuffer_surface_t(dpy, config, depthFormat, w, h, pixelFormat); 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14190696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->initCheck()) { 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // there was a problem in the ctor, the error 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // flag has been set. 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project surface = 0; 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return surface; 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Initialization 1436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetDisplay(NativeDisplayType display) 1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef HAVE_ANDROID_OS 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this just needs to be done once 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) { 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_lock(&gInitMutex); 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gGLKey == -1) 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_key_create(&gGLKey, NULL); 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pthread_mutex_unlock(&gInitMutex); 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (display == EGL_DEFAULT_DISPLAY) { 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy = (EGLDisplay)1; 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d.type = display; 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return dpy; 1454076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_NO_DISPLAY; 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1462076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1465076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_inc(&d.initialized) == 0) { 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // initialize stuff here if needed 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res == EGL_TRUE) { 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (major != NULL) *major = VERSION_MAJOR; 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (minor != NULL) *minor = VERSION_MINOR; 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglTerminate(EGLDisplay dpy) 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean res = EGL_TRUE; 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_display_t& d = egl_display_t::get_display(dpy); 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (android_atomic_dec(&d.initialized) == 1) { 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: destroy all resources (surfaces, contexts, etc...) 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_lock(&gInitMutex); 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //pthread_mutex_unlock(&gInitMutex); 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// configuration 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigs( EGLDisplay dpy, 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint config_size, EGLint *num_config) 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint numConfigs = NELEM(gConfigs); 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!configs) { 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = numConfigs; 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint i; 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i=0 ; i<numConfigs && i<config_size ; i++) { 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *configs++ = (EGLConfig)i; 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = i; 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglChooseConfig( EGLDisplay dpy, const EGLint *attrib_list, 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig *configs, EGLint config_size, 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint *num_config) 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1524749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich 1525749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(num_config==0)) { 1526749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1527749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1529749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (ggl_unlikely(attrib_list==0)) { 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = 0; 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1533076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numAttributes = 0; 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numConfigs = NELEM(gConfigs); 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t possibleMatch = (1<<numConfigs)-1; 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while(possibleMatch && *attrib_list != EGL_NONE) { 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numAttributes++; 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attr = *attrib_list++; 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint val = *attrib_list++; 15410985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, attr, val) == 0) { 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // now, handle the attributes which have a useful default value 15510985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (size_t j=0 ; possibleMatch && j<NELEM(config_defaults) ; j++) { 15520985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian // see if this attribute was specified, if not, apply its 1553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // default value 1554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binarySearch<config_pair_t>( 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (config_pair_t const*)attrib_list, 1556dacd7a33c458240355c4b22dcc82809241447ab8Mathias Agopian 0, numAttributes-1, 1557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key) < 0) 1558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 15590985f6a4ea1c457d98b0169ba9caa6b3713b1c7eMathias Agopian for (int i=0 ; possibleMatch && i<numConfigs ; i++) { 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(possibleMatch & (1<<i))) 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isAttributeMatching(i, 1563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].key, 1564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project config_defaults[j].value) == 0) 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project possibleMatch &= ~(1<<i); 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // return the configurations found 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n=0; 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (possibleMatch) { 1575749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (configs) { 1576749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; config_size && i<numConfigs ; i++) { 1577749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1578749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich *configs++ = (EGLConfig)i; 1579749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich config_size--; 1580749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1581749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1582749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1583749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } else { 1584749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich for (int i=0 ; i<numConfigs ; i++) { 1585749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich if (possibleMatch & (1<<i)) { 1586749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich n++; 1587749c63dbff0ab66223f30af1bad4ca56bd26d5d2Jack Palevich } 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *num_config = n; 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 1596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, config, attribute, value); 1602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// surfaces 1606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativeWindowType window, 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createWindowSurface(dpy, config, window, attrib_list); 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config, 1616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType pixmap, 1617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPixmapSurface(dpy, config, pixmap, attrib_list); 1620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config, 1623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const EGLint *attrib_list) 1624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return createPbufferSurface(dpy, config, attrib_list); 1626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 1629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (eglSurface != EGL_NO_SURFACE) { 1633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 16340696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_SURFACE, EGL_FALSE); 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1638e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (surface->ctx) { 1639e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: this surface is current check what the spec says 1640e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->disconnect(); 1641e71212ba5397387100a578d23b15862518a7a859Mathias Agopian surface->ctx = 0; 1642e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete surface; 1644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQuerySurface( EGLDisplay dpy, EGLSurface eglSurface, 1649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* surface = static_cast<egl_surface_t*>(eglSurface); 16540696a572294bbaa977245afb630065de3278473bMathias Agopian if (!surface->isValid()) 16550696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface->dpy != dpy) 1657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLBoolean ret = EGL_TRUE; 1660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = getConfigAttrib(dpy, surface->config, EGL_CONFIG_ID, value); 1663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_WIDTH: 1665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getWidth(); 1666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HEIGHT: 1668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHeight(); 1669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_LARGEST_PBUFFER: 1671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // not modified for a window or pixmap surface 1672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_FORMAT: 1674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_TEXTURE_TARGET: 1677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_NO_TEXTURE; 1678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_TEXTURE: 1680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_FALSE; 1681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_MIPMAP_LEVEL: 1683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = 0; 1684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_RENDER_BUFFER: 1686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: return the real RENDER_BUFFER here 1687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = EGL_BACK_BUFFER; 1688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_HORIZONTAL_RESOLUTION: 1690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getHorizontalResolution(); 1692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERTICAL_RESOLUTION: 1694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pixel/mm * EGL_DISPLAY_SCALING 1695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = surface->getVerticalResolution(); 1696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_PIXEL_ASPECT_RATIO: { 1698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // w/h * EGL_DISPLAY_SCALING 1699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int wr = surface->getHorizontalResolution(); 1700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int hr = surface->getVerticalResolution(); 1701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *value = (wr * EGL_DISPLAY_SCALING) / hr; 1702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 1703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_SWAP_BEHAVIOR: 1704076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *value = surface->getSwapBehavior(); 1705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ret = setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ret; 1710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, 1713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext share_list, const EGLint *attrib_list) 1714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 1717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = ogles_init(sizeof(egl_context_t)); 1719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!gl) return setError(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 1720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = static_cast<egl_context_t*>(gl->rasterizer.base); 1722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags = egl_context_t::NEVER_CURRENT; 1723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->dpy = dpy; 1724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->config = config; 1725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->read = 0; 1726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = 0; 1727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)gl; 1728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 1731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::IS_CURRENT) 1736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project setGlThreadSpecific(0); 1737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_uninit((ogles_context_t*)ctx); 1738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, 1742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLSurface read, EGLContext ctx) 1743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* s = (egl_surface_t*)draw; 17480696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17490696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 17500696a572294bbaa977245afb630065de3278473bMathias Agopian if (s->dpy != dpy) 17510696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17520696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that draw is compatible with the context 17530696a572294bbaa977245afb630065de3278473bMathias Agopian } 17540696a572294bbaa977245afb630065de3278473bMathias Agopian if (read && read!=draw) { 17550696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = (egl_surface_t*)read; 17560696a572294bbaa977245afb630065de3278473bMathias Agopian if (!s->isValid()) 17570696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (s->dpy != dpy) 1759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 17600696a572294bbaa977245afb630065de3278473bMathias Agopian // TODO: check that read is compatible with the context 1761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext current_ctx = EGL_NO_CONTEXT; 1764076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 1766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 1769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_MATCH, EGL_FALSE); 1770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) { 1772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if we're detaching, we need the current context 1773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current_ctx = (EGLContext)getGlThreadSpecific(); 1774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((d && d->ctx && d->ctx != ctx) || 1779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (r && r->ctx && r->ctx != ctx)) { 1780e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // one of the surface is bound to a context in another thread 1781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* gl = (ogles_context_t*)ctx; 1786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (makeCurrent(gl) == 0) { 1787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx) { 1788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)draw; 1790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)read; 1791e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1792e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->draw) { 17930696a572294bbaa977245afb630065de3278473bMathias Agopian egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); 17940696a572294bbaa977245afb630065de3278473bMathias Agopian s->disconnect(); 1795e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1796e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (c->read) { 1797e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1798e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1799e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->draw = draw; 1801e71212ba5397387100a578d23b15862518a7a859Mathias Agopian c->read = read; 1802e71212ba5397387100a578d23b15862518a7a859Mathias Agopian 1803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->flags & egl_context_t::NEVER_CURRENT) { 1804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->flags &= ~egl_context_t::NEVER_CURRENT; 1805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint w = 0; 1806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint h = 0; 1807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (draw) { 1808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project w = d->getWidth(); 1809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project h = d->getHeight(); 1810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_surfaceport(gl, 0, 0); 1812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(gl, 0, 0, w, h); 1813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(gl, 0, 0, w, h); 1814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d) { 1816cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian if (d->connect() == EGL_FALSE) { 1817cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian return EGL_FALSE; 1818cf81c84e43eb33931b950fa2c9b4c6f51afe7197Mathias Agopian } 1819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->ctx = ctx; 1820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface(gl); 1821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (r) { 1823e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: lock/connect the read surface too 1824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->ctx = ctx; 1825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r->bindReadSurface(gl); 1826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if surfaces were bound to the context bound to this thread 1829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mark then as unbound. 1830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (current_ctx) { 1831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(current_ctx); 1832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = (egl_surface_t*)c->draw; 1833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* r = (egl_surface_t*)c->read; 1834e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (d) { 18359648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->draw = 0; 1836e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->ctx = EGL_NO_CONTEXT; 1837e71212ba5397387100a578d23b15862518a7a859Mathias Agopian d->disconnect(); 1838e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1839e71212ba5397387100a578d23b15862518a7a859Mathias Agopian if (r) { 18409648c1a2b9b527bcef64bb9d96e8385a14949840Mathias Agopian c->read = 0; 1841e71212ba5397387100a578d23b15862518a7a859Mathias Agopian r->ctx = EGL_NO_CONTEXT; 1842e71212ba5397387100a578d23b15862518a7a859Mathias Agopian // FIXME: unlock/disconnect the read surface too 1843e71212ba5397387100a578d23b15862518a7a859Mathias Agopian } 1844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ACCESS, EGL_FALSE); 1849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLContext eglGetCurrentContext(void) 1852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentContext returns the current EGL rendering context, 1854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // as specified by eglMakeCurrent. If no context is current, 1855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // EGL_NO_CONTEXT is returned. 1856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (EGLContext)getGlThreadSpecific(); 1857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglGetCurrentSurface(EGLint readdraw) 1860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentSurface returns the read or draw surface attached 1862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // to the current EGL rendering context, as specified by eglMakeCurrent. 1863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_SURFACE is returned. 1864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_SURFACE; 1866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (readdraw == EGL_READ) { 1868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->read; 1869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (readdraw == EGL_DRAW) { 1870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->draw; 1871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); 1873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLDisplay eglGetCurrentDisplay(void) 1876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // eglGetCurrentDisplay returns the current EGL display connection 1878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for the current EGL rendering context, as specified by eglMakeCurrent. 1879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If no context is current, EGL_NO_DISPLAY is returned. 1880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLContext ctx = (EGLContext)getGlThreadSpecific(); 1881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ctx == EGL_NO_CONTEXT) return EGL_NO_DISPLAY; 1882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return c->dpy; 1884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglQueryContext( EGLDisplay dpy, EGLContext ctx, 1887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLint attribute, EGLint *value) 1888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(ctx); 1892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (attribute) { 1893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CONFIG_ID: 1894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Returns the ID of the EGL frame buffer configuration with 1895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // respect to which the context was created 1896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getConfigAttrib(dpy, c->config, EGL_CONFIG_ID, value); 1897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_ATTRIBUTE, EGL_FALSE); 1899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitGL(void) 1902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitNative(EGLint engine) 1907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw) 1912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1915076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_surface_t* d = static_cast<egl_surface_t*>(draw); 19170696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 19180696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 1919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->dpy != dpy) 1920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // post the surface 1923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->swapBuffers(); 1924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if it's bound to a context, update the buffer 1926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (d->ctx != EGL_NO_CONTEXT) { 1927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindDrawSurface((ogles_context_t*)d->ctx); 1928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if this surface is also the read surface of the context 1929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it is bound to, make sure to update the read buffer as well. 1930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // The EGL spec is a little unclear about this. 1931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project egl_context_t* c = egl_context_t::context(d->ctx); 1932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->read == draw) { 1933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d->bindReadSurface((ogles_context_t*)d->ctx); 1934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 1938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglCopyBuffers( EGLDisplay dpy, EGLSurface surface, 1941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project NativePixmapType target) 1942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCopyBuffers() 1946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_FALSE; 1947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLint eglGetError(void) 1950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return getError(); 1952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* eglQueryString(EGLDisplay dpy, EGLint name) 1955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, (const char*)0); 1958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (name) { 1960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VENDOR: 1961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVendorString; 1962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_VERSION: 1963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gVersionString; 1964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_EXTENSIONS: 1965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gExtensionsString; 1966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case EGL_CLIENT_APIS: 1967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gClientApiString; 1968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, (const char *)0); 1970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.1 1974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSurfaceAttrib( 1977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 1978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSurfaceAttrib() 1982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindTexImage( 1986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglBindTexImage() 1991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 1992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseTexImage( 1995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 1998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 1999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseTexImage() 2000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 2004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglSwapInterval() 2008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// EGL 1.2 2013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglBindAPI(EGLenum api) 2016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (api != EGL_OPENGL_ES_API) 2018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLenum eglQueryAPI(void) 2023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_OPENGL_ES_API; 2025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglWaitClient(void) 2028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project glFinish(); 2030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLBoolean eglReleaseThread(void) 2034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglReleaseThread() 2036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return EGL_TRUE; 2037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectEGLSurface eglCreatePbufferFromClientBuffer( 2040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, 2041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project EGLConfig config, const EGLint *attrib_list) 2042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_DISPLAY, EGL_NO_SURFACE); 2045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO: eglCreatePbufferFromClientBuffer() 2046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return setError(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 2047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2050076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// EGL_EGLEXT_VERSION 3 2051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 2052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid (*eglGetProcAddress (const char *procname))() 2054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 2055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extention_map_t const * const map = gExtentionMap; 2056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (uint32_t i=0 ; i<NELEM(gExtentionMap) ; i++) { 2057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!strcmp(procname, map[i].name)) { 2058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return map[i].address; 2059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 2061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 2062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2063076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2064076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, 2065076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const EGLint *attrib_list) 2066076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2067076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2068076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2069076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2070076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2071076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) 2072076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2073076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLBoolean result = EGL_FALSE; 2074076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return result; 2075076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2076076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2077076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 2078076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian EGLClientBuffer buffer, const EGLint *attrib_list) 2079076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2080076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2081076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_NO_IMAGE_KHR); 2082076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2083076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (ctx != EGL_NO_CONTEXT) { 2084076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 2085076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2086076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (target != EGL_NATIVE_BUFFER_ANDROID) { 2087076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2088076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2090076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 2091076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 2094076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2095076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 20978b765b7f5ea7f56963ea0e3141d043d20944dbccMathias Agopian 2098076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.incRef(&native_buffer->common); 2099076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return (EGLImageKHR)native_buffer; 2100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2101076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2102076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias AgopianEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 2103076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{ 2104076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) { 2105076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2106076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 2107076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2108076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 2109076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 2111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (native_buffer->common.version != sizeof(android_native_buffer_t)) 2114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return setError(EGL_BAD_PARAMETER, EGL_FALSE); 2115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian native_buffer->common.decRef(&native_buffer->common); 2117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 2118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return EGL_TRUE; 2119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 2120df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2121df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2122df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ANDROID extensions 2123df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian// ---------------------------------------------------------------------------- 2124df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2125df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias AgopianEGLBoolean eglSetSwapRectangleANDROID(EGLDisplay dpy, EGLSurface draw, 2126df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian EGLint left, EGLint top, EGLint width, EGLint height) 2127df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian{ 2128df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 2129df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2130df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2131df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21320696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21330696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, EGL_FALSE); 2134df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian if (d->dpy != dpy) 2135df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return setError(EGL_BAD_DISPLAY, EGL_FALSE); 2136df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2137df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian // post the surface 2138df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian d->setSwapRectangle(left, top, width, height); 2139df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian 2140df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian return EGL_TRUE; 2141df3ca30bf663cb8eed88ee3f16fb5e9a65dc00fcMathias Agopian} 21428d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 21438d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias AgopianEGLClientBuffer eglGetRenderBufferANDROID(EGLDisplay dpy, EGLSurface draw) 21448d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian{ 21458d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian if (egl_display_t::is_valid(dpy) == EGL_FALSE) 21468d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0); 21478d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 21488d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian egl_surface_t* d = static_cast<egl_surface_t*>(draw); 21490696a572294bbaa977245afb630065de3278473bMathias Agopian if (!d->isValid()) 21500696a572294bbaa977245afb630065de3278473bMathias Agopian return setError(EGL_BAD_SURFACE, (EGLClientBuffer)0); 21518d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian if (d->dpy != dpy) 21528d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return setError(EGL_BAD_DISPLAY, (EGLClientBuffer)0); 21538d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian 21548d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian // post the surface 21558d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian return d->getRenderBuffer(); 21568d2e83b9f44c7f2207a312fcfda8eb3a4c26745fMathias Agopian} 2157