egl_display.h revision 5b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09
1518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian/* 2518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Copyright 2007, The Android Open Source Project 3518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 4518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License"); 5518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** you may not use this file except in compliance with the License. 6518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** You may obtain a copy of the License at 7518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 8518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 9518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** 10518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Unless required by applicable law or agreed to in writing, software 11518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS, 12518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** See the License for the specific language governing permissions and 14518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** limitations under the License. 15518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian */ 16518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 17518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#ifndef ANDROID_EGL_DISPLAY_H 18518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#define ANDROID_EGL_DISPLAY_H 19518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 20518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 21518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <ctype.h> 22518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdint.h> 23518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdlib.h> 24518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 25518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/egl.h> 26518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/eglext.h> 27518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/gl.h> 28518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/glext.h> 29518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 30518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <utils/SortedVector.h> 31518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <utils/threads.h> 32518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 33518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include "hooks.h" 34518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 35518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 36518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiannamespace android { 37518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 38518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 39518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_object_t; 40518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_connection_t; 41518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 42518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 43518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 44518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_config_t { 45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t() {} 46518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t(int impl, EGLConfig config) 47518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian : impl(impl), config(config), configId(0), implConfigId(0) { } 48518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian int impl; // the implementation this config is for 49518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig config; // the implementation's EGLConfig 50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint configId; // our CONFIG_ID 51518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint implConfigId; // the implementation's CONFIG_ID 52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool operator < (const egl_config_t& rhs) const { 53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian if (impl < rhs.impl) return true; 54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian if (impl > rhs.impl) return false; 55518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian return config < rhs.config; 56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian } 57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; 58518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 59518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_display_t { 62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static egl_display_t sDisplay[NUM_DISPLAYS]; 63518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLDisplay getDisplay(EGLNativeDisplayType display); 64518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 65518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic: 66518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian enum { 67518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian NOT_INITIALIZED = 0, 68518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian INITIALIZED = 1, 69518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian TERMINATED = 2 70518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 71518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 72518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_display_t(); 73518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ~egl_display_t(); 74518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 75518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLBoolean initialize(EGLint *major, EGLint *minor); 76518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLBoolean terminate(); 77518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 78518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian // add object to this display's list 79518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian void addObject(egl_object_t* object); 805b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian // remove object from this display's list 815b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian void removeObject(egl_object_t* object); 82518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian // add reference to this object. returns true if this is a valid object. 83518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian bool getObject(egl_object_t* object); 84518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 855b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian 86518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static egl_display_t* get(EGLDisplay dpy); 87518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian static EGLDisplay getFromNativeDisplay(EGLNativeDisplayType disp); 88518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 89518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isReady() const { return (refs > 0); } 90518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isValid() const { return magic == '_dpy'; } 91518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian inline bool isAlive() const { return isValid(); } 92518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 93518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian struct strings_t { 94518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * vendor; 95518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * version; 96518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * clientApi; 97518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian char const * extensions; 98518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 99518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 100518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian struct DisplayImpl { 101518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian DisplayImpl() : dpy(EGL_NO_DISPLAY), config(0), 102518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian state(NOT_INITIALIZED), numConfigs(0) { } 103518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLDisplay dpy; 104518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig* config; 105518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint state; 106518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint numConfigs; 107518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian strings_t queryString; 108518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian }; 109518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 110518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate: 111518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian uint32_t magic; 112518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 113518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic: 114518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian DisplayImpl disp[IMPL_NUM_IMPLEMENTATIONS]; 115518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLint numTotalConfigs; 116518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian egl_config_t* configs; 117518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 118518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate: 119518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian uint32_t refs; 120518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian Mutex lock; 121518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian SortedVector<egl_object_t*> objects; 122518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; 123518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 124518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 125518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 126518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianinline egl_display_t* get_display(EGLDisplay dpy) { 127518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian return egl_display_t::get(dpy); 128518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian} 129518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 130518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 131518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 132518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_display_t* validate_display(EGLDisplay dpy); 133518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_connection_t* validate_display_config(EGLDisplay dpy, 134518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian EGLConfig config, egl_display_t const*& dp); 135518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias AgopianEGLBoolean validate_display_context(EGLDisplay dpy, EGLContext ctx); 136518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias AgopianEGLBoolean validate_display_surface(EGLDisplay dpy, EGLSurface surface); 137518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 138518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 139518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; // namespace android 140518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ---------------------------------------------------------------------------- 141518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 142518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif // ANDROID_EGL_DISPLAY_H 143518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian 144