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