156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall/* 256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Copyright (C) 2011 The Android Open Source Project 356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Licensed under the Apache License, Version 2.0 (the "License"); 556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* you may not use this file except in compliance with the License. 656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* You may obtain a copy of the License at 756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* http://www.apache.org/licenses/LICENSE-2.0 956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* 1056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* Unless required by applicable law or agreed to in writing, software 1156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* distributed under the License is distributed on an "AS IS" BASIS, 1256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* See the License for the specific language governing permissions and 1456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall* limitations under the License. 1556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall*/ 1656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 1756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "HostConnection.h" 1856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ThreadInfo.h" 1956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "eglDisplay.h" 2056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "egl_ftable.h" 2156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <cutils/log.h> 2256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "gralloc_cb.h" 2356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "GLClientState.h" 2456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "GLSharedGroup.h" 2556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "eglContext.h" 2656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "ClientAPIExts.h" 2756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 2856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "GLEncoder.h" 2956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#ifdef WITH_GLES2 3056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include "GL2Encoder.h" 3156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#endif 3256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 3356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#include <system/window.h> 3456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 3556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Halltemplate<typename T> 3656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic T setErrorFunc(GLint error, T returnValue) { 3756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getEGLThreadInfo()->eglError = error; 3856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return returnValue; 3956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 4056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 4156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallconst char * eglStrError(EGLint err) 4256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 4356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (err){ 4456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_SUCCESS: return "EGL_SUCCESS"; 4556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 4656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 4756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 4856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 4956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 5056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 5156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 5256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 5356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 5456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 5556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 5656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 5756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 5856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 5956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: return "UNKNOWN"; 6056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 6156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 6256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define LOG_EGL_ERRORS 1 6456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#ifdef LOG_EGL_ERRORS 6656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 6756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define setErrorReturn(error, retVal) \ 6856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall { \ 6956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("tid %d: %s(%d): error 0x%x (%s)", gettid(), __FUNCTION__, __LINE__, error, eglStrError(error)); \ 7056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return setErrorFunc(error, retVal); \ 7156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 7256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 7356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define RETURN_ERROR(ret,err) \ 7456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("tid %d: %s(%d): error 0x%x (%s)", gettid(), __FUNCTION__, __LINE__, err, eglStrError(err)); \ 7556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getEGLThreadInfo()->eglError = err; \ 7656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; 7756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 7856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#else //!LOG_EGL_ERRORS 7956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define setErrorReturn(error, retVal) return setErrorFunc(error, retVal); 8156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define RETURN_ERROR(ret,err) \ 8356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getEGLThreadInfo()->eglError = err; \ 8456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; 8556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#endif //LOG_EGL_ERRORS 8756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 8856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define VALIDATE_CONFIG(cfg,ret) \ 8956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(((int)cfg<0)||((int)cfg>s_display.getNumConfigs())) { \ 9056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(ret,EGL_BAD_CONFIG); \ 9156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 9256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define VALIDATE_DISPLAY(dpy,ret) \ 9456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if ((dpy) != (EGLDisplay)&s_display) { \ 9556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(ret, EGL_BAD_DISPLAY); \ 9656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 9756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 9856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define VALIDATE_DISPLAY_INIT(dpy,ret) \ 9956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY(dpy, ret) \ 10056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!s_display.initialized()) { \ 10156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(ret, EGL_NOT_INITIALIZED); \ 10256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 10356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 10456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define DEFINE_HOST_CONNECTION \ 10556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall HostConnection *hostCon = HostConnection::get(); \ 10656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall renderControl_encoder_context_t *rcEnc = (hostCon ? hostCon->rcEncoder() : NULL) 10756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 10856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define DEFINE_AND_VALIDATE_HOST_CONNECTION(ret) \ 10956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall HostConnection *hostCon = HostConnection::get(); \ 11056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!hostCon) { \ 11156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("egl: Failed to get host connection\n"); \ 11256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; \ 11356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } \ 11456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall renderControl_encoder_context_t *rcEnc = hostCon->rcEncoder(); \ 11556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!rcEnc) { \ 11656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("egl: Failed to get renderControl encoder context\n"); \ 11756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; \ 11856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 11956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 12056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define VALIDATE_CONTEXT_RETURN(context,ret) \ 12156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!context) { \ 12256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(ret,EGL_BAD_CONTEXT); \ 12356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 12456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 12556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define VALIDATE_SURFACE_RETURN(surface, ret) \ 12656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (surface != EGL_NO_SURFACE) { \ 12756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* s( static_cast<egl_surface_t*>(surface) ); \ 12856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s->dpy != (EGLDisplay)&s_display) \ 12956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_DISPLAY, EGL_FALSE); \ 13056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 13156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 13256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 13356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLContext_t::EGLContext_t(EGLDisplay dpy, EGLConfig config, EGLContext_t* shareCtx) : 13456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall dpy(dpy), 13556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall config(config), 13656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall read(EGL_NO_SURFACE), 13756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall draw(EGL_NO_SURFACE), 13856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall shareCtx(shareCtx), 13956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcContext(0), 14056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall versionString(NULL), 14156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall vendorString(NULL), 14256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rendererString(NULL), 14356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall extensionString(NULL) 14456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 14556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall flags = 0; 14656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall version = 1; 14756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall clientState = new GLClientState(); 14856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (shareCtx) 14956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall sharedGroup = shareCtx->getSharedGroup(); 15056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else 15156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall sharedGroup = GLSharedGroupPtr(new GLSharedGroup()); 15256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}; 15356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 15456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLContext_t::~EGLContext_t() 15556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 15656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete clientState; 15756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete [] versionString; 15856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete [] vendorString; 15956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete [] rendererString; 16056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete [] extensionString; 16156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 16256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 16356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// ---------------------------------------------------------------------------- 16456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall//egl_surface_t 16556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 16656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall//we don't need to handle depth since it's handled when window created on the host 16756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 16856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstruct egl_surface_t { 16956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 17056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLDisplay dpy; 17156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLConfig config; 17256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 17356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 17456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLint surfaceType); 17556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual ~egl_surface_t(); 17656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 17756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual void setSwapInterval(int interval) = 0; 17856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual EGLBoolean swapBuffers() = 0; 17956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 18056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getSwapBehavior() const; 18156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t getRcSurface() { return rcSurface; } 18256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getSurfaceType() { return surfaceType; } 18356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 18456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getWidth(){ return width; } 18556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getHeight(){ return height; } 18656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void setTextureFormat(EGLint _texFormat) { texFormat = _texFormat; } 18756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getTextureFormat() { return texFormat; } 18856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void setTextureTarget(EGLint _texTarget) { texTarget = _texTarget; } 18956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint getTextureTarget() { return texTarget; } 19056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 19156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprivate: 19256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 19356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //Surface attributes 19456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 19556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint width; 19656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint height; 19756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint texFormat; 19856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint texTarget; 19956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 20056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprotected: 20156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void setWidth(EGLint w) { width = w; } 20256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall void setHeight(EGLint h) { height = h; } 20356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 20456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint surfaceType; 20556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t rcSurface; //handle to surface created via remote control 20656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}; 20756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 20856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_surface_t::egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLint surfaceType) 20956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall : dpy(dpy), config(config), surfaceType(surfaceType), rcSurface(0) 21056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 21156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall width = 0; 21256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall height = 0; 21356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall texFormat = EGL_NO_TEXTURE; 21456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall texTarget = EGL_NO_TEXTURE; 21556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 21656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 21756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLint egl_surface_t::getSwapBehavior() const { 21856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_BUFFER_PRESERVED; 21956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 22056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 22156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_surface_t::~egl_surface_t() 22256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 22356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 22456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 22556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// ---------------------------------------------------------------------------- 22656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// egl_window_surface_t 22756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 22856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstruct egl_window_surface_t : public egl_surface_t { 22956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall static egl_window_surface_t* create( 23056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLDisplay dpy, EGLConfig config, EGLint surfType, 23156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ANativeWindow* window); 23256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 23356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual ~egl_window_surface_t(); 23456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 23556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual void setSwapInterval(int interval); 23656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual EGLBoolean swapBuffers(); 23756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 23856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprivate: 23956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_window_surface_t( 24056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLDisplay dpy, EGLConfig config, EGLint surfType, 24156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ANativeWindow* window); 24256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLBoolean init(); 24356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 24456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ANativeWindow* nativeWindow; 24556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall android_native_buffer_t* buffer; 24656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}; 24756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 24856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_window_surface_t::egl_window_surface_t ( 24956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLDisplay dpy, EGLConfig config, EGLint surfType, 25056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ANativeWindow* window) 25156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall: egl_surface_t(dpy, config, surfType), 25256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow(window), 25356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall buffer(NULL) 25456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 25556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // keep a reference on the window 25656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow->common.incRef(&nativeWindow->common); 25756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint w,h; 25856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow->query(nativeWindow, NATIVE_WINDOW_WIDTH, &w); 25956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setWidth(w); 26056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow->query(nativeWindow, NATIVE_WINDOW_HEIGHT, &h); 26156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setHeight(h); 26256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 26356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 26456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean egl_window_surface_t::init() 26556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 266e705cdde0db7dc9e85cbca0d9924e4432b5d1c7cJesse Hall if (nativeWindow->dequeueBuffer_DEPRECATED(nativeWindow, &buffer) != NO_ERROR) { 26756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_FALSE); 26856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 26956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 27056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 27156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcSurface = rcEnc->rcCreateWindowSurface(rcEnc, (uint32_t)config, 27256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getWidth(), getHeight()); 27356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!rcSurface) { 27456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("rcCreateWindowSurface returned 0"); 27556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_FALSE; 27656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 27756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcSetWindowColorBuffer(rcEnc, rcSurface, 27856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ((cb_handle_t*)(buffer->handle))->hostHandle); 27956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 28056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 28156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 28256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 28356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_window_surface_t* egl_window_surface_t::create( 28456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLDisplay dpy, EGLConfig config, EGLint surfType, 28556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ANativeWindow* window) 28656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 28756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_window_surface_t* wnd = new egl_window_surface_t( 28856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall dpy, config, surfType, window); 28956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (wnd && !wnd->init()) { 29056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete wnd; 29156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall wnd = NULL; 29256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 29356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return wnd; 29456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 29556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 29656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_window_surface_t::~egl_window_surface_t() { 29756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_HOST_CONNECTION; 29856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (rcSurface && rcEnc) { 29956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcDestroyWindowSurface(rcEnc, rcSurface); 30056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 30156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (buffer) { 302e705cdde0db7dc9e85cbca0d9924e4432b5d1c7cJesse Hall nativeWindow->cancelBuffer_DEPRECATED(nativeWindow, buffer); 30356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 30456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow->common.decRef(&nativeWindow->common); 30556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 30656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 30756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallvoid egl_window_surface_t::setSwapInterval(int interval) 30856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 30956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall nativeWindow->setSwapInterval(nativeWindow, interval); 31056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 31156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 31256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean egl_window_surface_t::swapBuffers() 31356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 31456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 31556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 31656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcFlushWindowColorBuffer(rcEnc, rcSurface); 31756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 318e705cdde0db7dc9e85cbca0d9924e4432b5d1c7cJesse Hall nativeWindow->queueBuffer_DEPRECATED(nativeWindow, buffer); 319e705cdde0db7dc9e85cbca0d9924e4432b5d1c7cJesse Hall if (nativeWindow->dequeueBuffer_DEPRECATED(nativeWindow, &buffer)) { 32056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall buffer = NULL; 32156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_FALSE); 32256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 32356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 32456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcSetWindowColorBuffer(rcEnc, rcSurface, 32556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ((cb_handle_t *)(buffer->handle))->hostHandle); 32656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 32756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 32856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 32956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 33056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// ---------------------------------------------------------------------------- 33156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall//egl_pbuffer_surface_t 33256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 33356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstruct egl_pbuffer_surface_t : public egl_surface_t { 33456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall static egl_pbuffer_surface_t* create(EGLDisplay dpy, EGLConfig config, 33556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint surfType, int32_t w, int32_t h, GLenum pixelFormat); 33656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 33756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual ~egl_pbuffer_surface_t(); 33856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 33956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual void setSwapInterval(int interval) {} 34056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall virtual EGLBoolean swapBuffers() { return EGL_TRUE; } 34156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 34256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t getRcColorBuffer() { return rcColorBuffer; } 34356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 34456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallprivate: 34556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_pbuffer_surface_t(EGLDisplay dpy, EGLConfig config, EGLint surfType, 34656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int32_t w, int32_t h); 34756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLBoolean init(GLenum format); 34856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 34956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t rcColorBuffer; 35056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}; 35156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 35256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_pbuffer_surface_t::egl_pbuffer_surface_t(EGLDisplay dpy, EGLConfig config, 35356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint surfType, int32_t w, int32_t h) 35456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall: egl_surface_t(dpy, config, surfType), 35556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcColorBuffer(0) 35656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 35756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setWidth(w); 35856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setHeight(h); 35956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 36056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 36156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_pbuffer_surface_t::~egl_pbuffer_surface_t() 36256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 36356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_HOST_CONNECTION; 36456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (rcEnc) { 36556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (rcColorBuffer) rcEnc->rcCloseColorBuffer(rcEnc, rcColorBuffer); 36656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (rcSurface) rcEnc->rcDestroyWindowSurface(rcEnc, rcSurface); 36756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 36856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 36956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 37056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean egl_pbuffer_surface_t::init(GLenum pixelFormat) 37156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 37256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 37356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 37456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcSurface = rcEnc->rcCreateWindowSurface(rcEnc, (uint32_t)config, 37556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getWidth(), getHeight()); 37656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!rcSurface) { 37756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("rcCreateWindowSurface returned 0"); 37856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_FALSE; 37956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 38056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 38156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcColorBuffer = rcEnc->rcCreateColorBuffer(rcEnc, getWidth(), getHeight(), 38256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall pixelFormat); 38356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!rcColorBuffer) { 38456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("rcCreateColorBuffer returned 0"); 38556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_FALSE; 38656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 38756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 38856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcSetWindowColorBuffer(rcEnc, rcSurface, rcColorBuffer); 38956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 39056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 39156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 39256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 39356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallegl_pbuffer_surface_t* egl_pbuffer_surface_t::create(EGLDisplay dpy, 39456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLConfig config, EGLint surfType, int32_t w, int32_t h, 39556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall GLenum pixelFormat) 39656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 39756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_pbuffer_surface_t* pb = new egl_pbuffer_surface_t(dpy, config, surfType, 39856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall w, h); 39956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (pb && !pb->init(pixelFormat)) { 40056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete pb; 40156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall pb = NULL; 40256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 40356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return pb; 40456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 40556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 40656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic const char *getGLString(int glEnum) 40756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 40856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLThreadInfo *tInfo = getEGLThreadInfo(); 40956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!tInfo || !tInfo->currentContext) { 41056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 41156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 41256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 41356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall const char** strPtr = NULL; 41456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 41556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_VENDOR 0x1F00 41656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_RENDERER 0x1F01 41756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_VERSION 0x1F02 41856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define GL_EXTENSIONS 0x1F03 41956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 42056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch(glEnum) { 42156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case GL_VERSION: 42256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall strPtr = &tInfo->currentContext->versionString; 42356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 42456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case GL_VENDOR: 42556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall strPtr = &tInfo->currentContext->vendorString; 42656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 42756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case GL_RENDERER: 42856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall strPtr = &tInfo->currentContext->rendererString; 42956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 43056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case GL_EXTENSIONS: 43156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall strPtr = &tInfo->currentContext->extensionString; 43256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 43356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 43456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 43556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!strPtr) { 43656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 43756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 43856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 43956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (*strPtr != NULL) { 44056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 44156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // string is already cached 44256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 44356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return *strPtr; 44456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 44556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 44656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 44756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // first query of that string - need to query host 44856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 44956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(NULL); 45056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall char *hostStr = NULL; 45156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int n = rcEnc->rcGetGLString(rcEnc, glEnum, NULL, 0); 45256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (n < 0) { 45356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostStr = new char[-n+1]; 45456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall n = rcEnc->rcGetGLString(rcEnc, glEnum, hostStr, -n); 45556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (n <= 0) { 45656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete [] hostStr; 45756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostStr = NULL; 45856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 45956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 46056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 46156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 46256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // keep the string in the context and return its value 46356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 46456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *strPtr = hostStr; 46556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return hostStr; 46656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 46756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 46856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// ---------------------------------------------------------------------------- 46956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 47056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall// The one and only supported display object. 47156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic eglDisplay s_display; 47256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 47356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallstatic EGLClient_eglInterface s_eglIface = { 47456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getThreadInfo: getEGLThreadInfo, 47556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getGLString: getGLString 47656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall}; 47756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 47856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define DBG_FUNC DBG("%s\n", __FUNCTION__) 47956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLDisplay eglGetDisplay(EGLNativeDisplayType display_id) 48056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 48156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 48256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // we support only EGL_DEFAULT_DISPLAY. 48356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 48456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (display_id != EGL_DEFAULT_DISPLAY) { 48556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_NO_DISPLAY; 48656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 48756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 48856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return (EGLDisplay)&s_display; 48956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 49056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 49156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 49256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 49356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY(dpy,EGL_FALSE); 49456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 49556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!s_display.initialize(&s_eglIface)) { 49656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_FALSE; 49756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 49856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (major!=NULL) 49956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *major = s_display.getVersionMajor(); 50056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (minor!=NULL) 50156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *minor = s_display.getVersionMinor(); 50256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 50356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 50456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 50556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglTerminate(EGLDisplay dpy) 50656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 50756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 50856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 50956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.terminate(); 51056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 51156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 51256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 51356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLint eglGetError() 51456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 51556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint error = getEGLThreadInfo()->eglError; 51656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall getEGLThreadInfo()->eglError = EGL_SUCCESS; 51756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return error; 51856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 51956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 52056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall__eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname) 52156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 52256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // search in EGL function table 52356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall for (int i=0; i<egl_num_funcs; i++) { 52456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!strcmp(egl_funcs_by_name[i].name, procname)) { 52556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return (__eglMustCastToProperFunctionPointerType)egl_funcs_by_name[i].proc; 52656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 52756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 52856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 52956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 53056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // Make sure display is initialized before searching in client APIs 53156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 53256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!s_display.initialized()) { 53356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!s_display.initialize(&s_eglIface)) { 53456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 53556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 53656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 53756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 53856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // look in gles client api's extensions table 53956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return (__eglMustCastToProperFunctionPointerType)ClientAPIExts::getProcAddress(procname); 54056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 54156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // Fail - function not found. 54256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return NULL; 54356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 54456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 54556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hallconst char* eglQueryString(EGLDisplay dpy, EGLint name) 54656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 54756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, NULL); 54856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 54956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return s_display.queryString(name); 55056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 55156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 55256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config) 55356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 55456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, NULL); 55556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 55656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if(!num_config) { 55756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER); 55856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 55956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 56056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall GLint numConfigs = s_display.getNumConfigs(); 56156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!configs) { 56256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *num_config = numConfigs; 56356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 56456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 56556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 56656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int i=0; 56756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall for (i=0 ; i<numConfigs && i<config_size ; i++) { 56856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *configs++ = (EGLConfig)i; 56956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 57056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *num_config = i; 57156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 57256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 57356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 57456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) 57556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 57656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 57756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 57856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int attribs_size = 0; 57956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (attrib_list) { 58056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall const EGLint * attrib_p = attrib_list; 58156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (attrib_p[0] != EGL_NONE) { 58256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall attribs_size += 2; 58356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall attrib_p += 2; 58456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 58556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall attribs_size++; //for the terminating EGL_NONE 58656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 58756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 58856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 58956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *num_config = rcEnc->rcChooseConfig(rcEnc, (EGLint*)attrib_list, attribs_size * sizeof(EGLint), (uint32_t*)configs, config_size); 59056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 59156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 59256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 59356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 59456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value) 59556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 59656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, NULL); 59756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONFIG(config, EGL_FALSE); 59856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 59956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s_display.getConfigAttrib(config, attribute, value)) 60056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall { 60156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 60256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 60356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else 60456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall { 60556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall RETURN_ERROR(EGL_FALSE, EGL_BAD_ATTRIBUTE); 60656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 60756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 60856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 60956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list) 61056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 61156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, NULL); 61256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONFIG(config, EGL_FALSE); 61356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (win == 0) { 61456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SURFACE); 61556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 61656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 61756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint surfaceType; 61856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s_display.getConfigAttrib(config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) return EGL_FALSE; 61956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 62056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!(surfaceType & EGL_WINDOW_BIT)) { 62156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SURFACE); 62256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 62356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 62456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (static_cast<ANativeWindow*>(win)->common.magic != ANDROID_NATIVE_WINDOW_MAGIC) { 62556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 62656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 62756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 62856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* surface = egl_window_surface_t::create( 62956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall &s_display, config, surfaceType, static_cast<ANativeWindow*>(win)); 63056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!surface) { 63156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_NO_SURFACE); 63256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 63356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 63456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return surface; 63556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 63656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 63756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list) 63856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 63956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, NULL); 64056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONFIG(config, EGL_FALSE); 64156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 64256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint surfaceType; 64356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s_display.getConfigAttrib(config, EGL_SURFACE_TYPE, &surfaceType) == EGL_FALSE) return EGL_FALSE; 64456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 64556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!(surfaceType & EGL_PBUFFER_BIT)) { 64656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SURFACE); 64756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 64856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 64956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int32_t w = 0; 65056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall int32_t h = 0; 65156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint texFormat = EGL_NO_TEXTURE; 65256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint texTarget = EGL_NO_TEXTURE; 65356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (attrib_list[0]) { 65456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (attrib_list[0]) { 65556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_WIDTH: 65656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall w = attrib_list[1]; 65756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 65856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_HEIGHT: 65956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall h = attrib_list[1]; 66056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 66156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_TEXTURE_FORMAT: 66256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall texFormat = attrib_list[1]; 66356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 66456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_TEXTURE_TARGET: 66556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall texTarget = attrib_list[1]; 66656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 66756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 66856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 66956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall }; 67056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall attrib_list+=2; 67156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 67256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (((texFormat == EGL_NO_TEXTURE)&&(texTarget != EGL_NO_TEXTURE)) || 67356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ((texFormat != EGL_NO_TEXTURE)&&(texTarget == EGL_NO_TEXTURE))) { 67456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SURFACE); 67556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 67656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // TODO: check EGL_TEXTURE_FORMAT - need to support eglBindTexImage 67756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 67856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall GLenum pixelFormat; 67956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (s_display.getConfigGLPixelFormat(config, &pixelFormat) == EGL_FALSE) 68056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SURFACE); 68156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 68256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* surface = egl_pbuffer_surface_t::create(dpy, config, 68356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall surfaceType, w, h, pixelFormat); 68456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!surface) { 68556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_NO_SURFACE); 68656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 68756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 68856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //setup attributes 68956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall surface->setTextureFormat(texFormat); 69056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall surface->setTextureTarget(texTarget); 69156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 69256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return surface; 69356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 69456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 69556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list) 69656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 69756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //XXX: Pixmap not supported. The host cannot render to a pixmap resource 69856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // located on host. In order to support Pixmaps we should either punt 69956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // to s/w rendering -or- let the host render to a buffer that will be 70056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // copied back to guest at some sync point. None of those methods not 70156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // implemented and pixmaps are not used with OpenGL anyway ... 70256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_NO_SURFACE; 70356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 70456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 70556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface) 70656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 70756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 70856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_SURFACE_RETURN(eglSurface, EGL_FALSE); 70956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 71056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* surface(static_cast<egl_surface_t*>(eglSurface)); 71156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete surface; 71256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 71356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 71456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 71556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 71656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface eglSurface, EGLint attribute, EGLint *value) 71756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 71856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 71956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_SURFACE_RETURN(eglSurface, EGL_FALSE); 72056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 72156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 72256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLBoolean ret = EGL_TRUE; 72356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (attribute) { 72456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_CONFIG_ID: 72556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ret = s_display.getConfigAttrib(surface->config, EGL_CONFIG_ID, value); 72656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 72756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_WIDTH: 72856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = surface->getWidth(); 72956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 73056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_HEIGHT: 73156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = surface->getHeight(); 73256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 73356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_TEXTURE_FORMAT: 73456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = surface->getTextureFormat(); 73556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 73656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_TEXTURE_TARGET: 73756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = surface->getTextureTarget(); 73856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 73956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_SWAP_BEHAVIOR: 74056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = surface->getSwapBehavior(); 74156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 74256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_LARGEST_PBUFFER: 74356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // not modified for a window or pixmap surface 74456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // and we ignore it when creating a PBuffer surface (default is EGL_FALSE) 74556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (surface->getSurfaceType() & EGL_PBUFFER_BIT) *value = EGL_FALSE; 74656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 74756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO: complete other attributes 74856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 74956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("eglQuerySurface %x EGL_BAD_ATTRIBUTE", attribute); 75056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ret = setErrorFunc(EGL_BAD_ATTRIBUTE, EGL_FALSE); 75156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 75256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 75356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 75456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; 75556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 75656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 75756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglBindAPI(EGLenum api) 75856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 75956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (api != EGL_OPENGL_ES_API) 76056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 76156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 76256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 76356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 76456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLenum eglQueryAPI() 76556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 76656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_OPENGL_ES_API; 76756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 76856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 76956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglWaitClient() 77056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 77156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return eglWaitGL(); 77256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 77356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 77456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglReleaseThread() 77556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 77656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLThreadInfo *tInfo = getEGLThreadInfo(); 77756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo && tInfo->currentContext) { 77856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return eglMakeCurrent(&s_display, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE); 77956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 78056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 78156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 78256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 78356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list) 78456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 78556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO 78656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGW("%s not implemented", __FUNCTION__); 78756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 78856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 78956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 79056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) 79156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 79256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO 79356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGW("%s not implemented", __FUNCTION__); 79456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 79556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 79656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 79756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglBindTexImage(EGLDisplay dpy, EGLSurface eglSurface, EGLint buffer) 79856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 79956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 80056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_SURFACE_RETURN(eglSurface, EGL_FALSE); 80156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (eglSurface == EGL_NO_SURFACE) { 80256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_SURFACE, EGL_FALSE); 80356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 80456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 80556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (buffer != EGL_BACK_BUFFER) { 80656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 80756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 80856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 80956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* surface( static_cast<egl_surface_t*>(eglSurface) ); 81056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 81156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (surface->getTextureFormat() == EGL_NO_TEXTURE) { 81256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_FALSE); 81356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 81456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 81556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!(surface->getSurfaceType() & EGL_PBUFFER_BIT)) { 81656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_SURFACE, EGL_FALSE); 81756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 81856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 81956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //It's now safe to cast to pbuffer surface 82056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_pbuffer_surface_t* pbSurface = (egl_pbuffer_surface_t*)surface; 82156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 82256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 82356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcBindTexture(rcEnc, pbSurface->getRcColorBuffer()); 82456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 82556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return GL_TRUE; 82656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 82756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 82856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 82956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 83056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO 83156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGW("%s not implemented", __FUNCTION__); 83256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 83356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 83456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 83556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) 83656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 83756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 83856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 83956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 84056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t* ctx = getEGLThreadInfo()->currentContext; 84156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!ctx) { 84256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_CONTEXT, EGL_FALSE); 84356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 84456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!ctx->draw) { 84556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_SURFACE, EGL_FALSE); 84656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 84756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* draw(static_cast<egl_surface_t*>(ctx->draw)); 84856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall draw->setSwapInterval(interval); 84956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 85056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcFBSetSwapInterval(rcEnc, interval); //TODO: implement on the host 85156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 85256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 85356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 85456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 85556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list) 85656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 85756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_NO_CONTEXT); 85856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONFIG(config, EGL_NO_CONTEXT); 85956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 86056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint version = 1; //default 86156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall while (attrib_list && attrib_list[0]) { 86256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (attrib_list[0] == EGL_CONTEXT_CLIENT_VERSION) version = attrib_list[1]; 86356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall attrib_list+=2; 86456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 86556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 86656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t rcShareCtx = 0; 86756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * shareCtx = NULL; 86856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (share_context) { 86956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall shareCtx = static_cast<EGLContext_t*>(share_context); 87056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcShareCtx = shareCtx->rcContext; 87156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (shareCtx->dpy != dpy) 87256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_CONTEXT); 87356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 87456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 87556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_NO_CONTEXT); 87656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t rcContext = rcEnc->rcCreateContext(rcEnc, (uint32_t)config, rcShareCtx, version); 87756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!rcContext) { 87856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("rcCreateContext returned 0"); 87956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 88056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 88156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 88256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = new EGLContext_t(dpy, config, shareCtx); 88356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!context) 88456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ALLOC, EGL_NO_CONTEXT); 88556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 88656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->version = version; 88756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->rcContext = rcContext; 88856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 88956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 89056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return context; 89156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 89256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 89356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) 89456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 89556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 89656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONTEXT_RETURN(ctx, EGL_FALSE); 89756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 89856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = static_cast<EGLContext_t*>(ctx); 89956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 90056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (getEGLThreadInfo()->currentContext == context) 90156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall { 90256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall eglMakeCurrent(dpy, EGL_NO_CONTEXT, EGL_NO_SURFACE, EGL_NO_SURFACE); 90356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 90456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 90556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (context->rcContext) { 90656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 90756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall rcEnc->rcDestroyContext(rcEnc, context->rcContext); 90856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->rcContext = 0; 90956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 91056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 91156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall delete context; 91256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 91356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 91456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 91556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) 91656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 91756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 91856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_SURFACE_RETURN(draw, EGL_FALSE); 91956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_SURFACE_RETURN(read, EGL_FALSE); 92056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 92156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if ((read == EGL_NO_SURFACE && draw == EGL_NO_SURFACE) && (ctx != EGL_NO_CONTEXT)) 92256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_FALSE); 92356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if ((read != EGL_NO_SURFACE || draw != EGL_NO_SURFACE) && (ctx == EGL_NO_CONTEXT)) 92456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_FALSE); 92556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 92656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = static_cast<EGLContext_t*>(ctx); 92756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t ctxHandle = (context) ? context->rcContext : 0; 92856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t * drawSurf = static_cast<egl_surface_t *>(draw); 92956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t drawHandle = (drawSurf) ? drawSurf->getRcSurface() : 0; 93056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t * readSurf = static_cast<egl_surface_t *>(read); 93156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall uint32_t readHandle = (readSurf) ? readSurf->getRcSurface() : 0; 93256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 93356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 93456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // Nothing to do if no binding change has made 93556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // 93656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLThreadInfo *tInfo = getEGLThreadInfo(); 93756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext == context && 93856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall (context == NULL || 93956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall (context && context->draw == draw && context->read == read))) { 94056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 94156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 94256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 94356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (context && (context->flags & EGLContext_t::IS_CURRENT) && (context != tInfo->currentContext)) { 94456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //context is current to another thread 94556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ACCESS, EGL_FALSE); 94656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 94756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 94856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 94956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (rcEnc->rcMakeCurrent(rcEnc, ctxHandle, drawHandle, readHandle) == EGL_FALSE) { 95056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("rcMakeCurrent returned EGL_FALSE"); 95156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_CONTEXT, EGL_FALSE); 95256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 95356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 95456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //Now make the local bind 95556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (context) { 95656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->draw = draw; 95756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->read = read; 95856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall context->flags |= EGLContext_t::IS_CURRENT; 95956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //set the client state 96056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (context->version == 2) { 96156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->gl2Encoder()->setClientState(context->getClientState()); 96256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->gl2Encoder()->setSharedGroup(context->getSharedGroup()); 96356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 96456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else { 96556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->glEncoder()->setClientState(context->getClientState()); 96656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->glEncoder()->setSharedGroup(context->getSharedGroup()); 96756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 96856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 96956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else { 97056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //release ClientState & SharedGroup 97156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext->version == 2) { 97256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->gl2Encoder()->setClientState(NULL); 97356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->gl2Encoder()->setSharedGroup(GLSharedGroupPtr(NULL)); 97456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 97556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else { 97656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->glEncoder()->setClientState(NULL); 97756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->glEncoder()->setSharedGroup(GLSharedGroupPtr(NULL)); 97856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 97956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 98056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 98156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 98256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext) 98356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall tInfo->currentContext->flags &= ~EGLContext_t::IS_CURRENT; 98456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 98556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //Now make current 98656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall tInfo->currentContext = context; 98756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 98856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //Check maybe we need to init the encoder, if it's first eglMakeCurrent 98956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext) { 99056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext->version == 2) { 99156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!hostCon->gl2Encoder()->isInitialized()) { 99256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles2_iface()->init(); 99356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->gl2Encoder()->setInitialized(); 99456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ClientAPIExts::initClientFuncs(s_display.gles2_iface(), 1); 99556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 99656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 99756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else { 99856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!hostCon->glEncoder()->isInitialized()) { 99956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles_iface()->init(); 100056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->glEncoder()->setInitialized(); 100156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ClientAPIExts::initClientFuncs(s_display.gles_iface(), 0); 100256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 100356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 100456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 100556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 100656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 100756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 100856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 100956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLContext eglGetCurrentContext() 101056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 101156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return getEGLThreadInfo()->currentContext; 101256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 101356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 101456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSurface eglGetCurrentSurface(EGLint readdraw) 101556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 101656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = getEGLThreadInfo()->currentContext; 101756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!context) 101856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_NO_SURFACE; //not an error 101956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 102056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (readdraw) { 102156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_READ: 102256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return context->read; 102356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_DRAW: 102456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return context->draw; 102556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 102656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_NO_SURFACE); 102756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 102856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 102956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 103056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLDisplay eglGetCurrentDisplay() 103156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 103256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = getEGLThreadInfo()->currentContext; 103356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!context) 103456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_NO_DISPLAY; //not an error 103556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 103656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return context->dpy; 103756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 103856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 103956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value) 104056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 104156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 104256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_CONTEXT_RETURN(ctx, EGL_FALSE); 104356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 104456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLContext_t * context = static_cast<EGLContext_t*>(ctx); 104556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 104656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLBoolean ret = EGL_TRUE; 104756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (attribute) { 104856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_CONFIG_ID: 104956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ret = s_display.getConfigAttrib(context->config, EGL_CONFIG_ID, value); 105056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 105156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_CONTEXT_CLIENT_TYPE: 105256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_OPENGL_ES_API; 105356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 105456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_CONTEXT_CLIENT_VERSION: 105556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = context->version; 105656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 105756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_RENDER_BUFFER: 105856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!context->draw) 105956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_NONE; 106056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else 106156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_BACK_BUFFER; //single buffer not supported 106256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 106356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 106456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall ALOGE("eglQueryContext %x EGL_BAD_ATTRIBUTE", attribute); 106556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ATTRIBUTE, EGL_FALSE); 106656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 106756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 106856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 106956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return ret; 107056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 107156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 107256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglWaitGL() 107356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 107456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLThreadInfo *tInfo = getEGLThreadInfo(); 107556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!tInfo || !tInfo->currentContext) { 107656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_FALSE; 107756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 107856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 107956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext->version == 2) { 108056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles2_iface()->finish(); 108156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 108256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall else { 108356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles_iface()->finish(); 108456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 108556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 108656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 108756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 108856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 108956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglWaitNative(EGLint engine) 109056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 109156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 109256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 109356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 109456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface eglSurface) 109556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 109656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 109756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (eglSurface == EGL_NO_SURFACE) 109856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_SURFACE, EGL_FALSE); 109956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 110056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall DEFINE_AND_VALIDATE_HOST_CONNECTION(EGL_FALSE); 110156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 110256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall egl_surface_t* d = static_cast<egl_surface_t*>(eglSurface); 110356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (d->dpy != dpy) 110456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_DISPLAY, EGL_FALSE); 110556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 110656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // post the surface 110756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall d->swapBuffers(); 110856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 110956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall hostCon->flush(); 111056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 111156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 111256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 111356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) 111456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 111556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO :later 111656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 111756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 111856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 111956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint *attrib_list) 112056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 112156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO later 112256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 112356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 112456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 112556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface) 112656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 112756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall //TODO later 112856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return 0; 112956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 113056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 113156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) 113256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 113356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_NO_IMAGE_KHR); 113456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (ctx != EGL_NO_CONTEXT) { 113556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 113656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 113756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (target != EGL_NATIVE_BUFFER_ANDROID) { 113856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 113956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 114056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 114156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall android_native_buffer_t* native_buffer = (android_native_buffer_t*)buffer; 114256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 114356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 114456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 114556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 114656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (native_buffer->common.version != sizeof(android_native_buffer_t)) 114756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 114856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 11494d57cb8d6542f7fd82614a082de4b835de0d60ebEino-Ville Talvala cb_handle_t *cb = (cb_handle_t *)(native_buffer->handle); 11504d57cb8d6542f7fd82614a082de4b835de0d60ebEino-Ville Talvala 11514d57cb8d6542f7fd82614a082de4b835de0d60ebEino-Ville Talvala switch (cb->format) { 115256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGBA_8888: 115356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGBX_8888: 115456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGB_888: 115556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGB_565: 115656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_BGRA_8888: 115756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGBA_5551: 115856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case HAL_PIXEL_FORMAT_RGBA_4444: 115956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall break; 116056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 116156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 116256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 116356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 116456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall native_buffer->common.incRef(&native_buffer->common); 116556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return (EGLImageKHR)native_buffer; 116656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 116756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 116856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) 116956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 117056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY_INIT(dpy, EGL_FALSE); 117156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall android_native_buffer_t* native_buffer = (android_native_buffer_t*)img; 117256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 117356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (native_buffer->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) 117456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 117556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 117656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (native_buffer->common.version != sizeof(android_native_buffer_t)) 117756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 117856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 117956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall native_buffer->common.decRef(&native_buffer->common); 118056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 118156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 118256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 118356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 118456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall#define FENCE_SYNC_HANDLE (EGLSyncKHR)0xFE4CE 118556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 118656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, 118756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall const EGLint *attrib_list) 118856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 118956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // TODO: This implementation could be faster. We should require the host EGL 119056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // to support KHR_fence_sync, or at least pipe the fence command to the host 119156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // and wait for it (probably involving a glFinish on the host) in 119256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall // eglClientWaitSyncKHR. 119356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 119456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall VALIDATE_DISPLAY(dpy, EGL_NO_SYNC_KHR); 119556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 119656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (type != EGL_SYNC_FENCE_KHR || 119756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall (attrib_list != NULL && attrib_list[0] != EGL_NONE)) { 119856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ATTRIBUTE, EGL_NO_SYNC_KHR); 119956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 120056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 120156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLThreadInfo *tInfo = getEGLThreadInfo(); 120256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (!tInfo || !tInfo->currentContext) { 120356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 120456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 120556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 120656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (tInfo->currentContext->version == 2) { 120756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles2_iface()->finish(); 120856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } else { 120956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall s_display.gles_iface()->finish(); 121056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 121156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 121256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return FENCE_SYNC_HANDLE; 121356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 121456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 121556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) 121656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 121756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 121856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 121956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 122056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 122156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 122256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 122356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 122456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, 122556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLTimeKHR timeout) 122656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 122756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 122856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 122956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 123056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 123156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_CONDITION_SATISFIED_KHR; 123256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 123356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 123456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse HallEGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, 123556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall EGLint attribute, EGLint *value) 123656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall{ 123756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall if (sync != FENCE_SYNC_HANDLE) { 123856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_PARAMETER, EGL_FALSE); 123956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 124056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall 124156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall switch (attribute) { 124256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_SYNC_TYPE_KHR: 124356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_SYNC_FENCE_KHR; 124456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 124556513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_SYNC_STATUS_KHR: 124656513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_SIGNALED_KHR; 124756513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 124856513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall case EGL_SYNC_CONDITION_KHR: 124956513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall *value = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR; 125056513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall return EGL_TRUE; 125156513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall default: 125256513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall setErrorReturn(EGL_BAD_ATTRIBUTE, EGL_FALSE); 125356513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall } 125456513f5ff4f3e851c5f0cb38dc8851d18616b3c0Jesse Hall} 1255