Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c38d40de authored by Jamie Gennis's avatar Jamie Gennis Committed by Android Git Automerger
Browse files

am 6b228af6: Merge "EGL: add the ANDROID suffix to the blob cache ext" into ics-mr1

* commit '6b228af6':
  EGL: add the ANDROID suffix to the blob cache ext
parents 3dd55677 6b228af6
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -261,14 +261,14 @@ typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC)(void);
 */
#ifndef EGL_ANDROID_blob_cache
#define EGL_ANDROID_blob_cache 1
typedef khronos_ssize_t EGLsizei;
typedef void (*EGLSetBlobFunc) (const void* key, EGLsizei keySize, const void* value, EGLsizei valueSize);
typedef EGLsizei (*EGLGetBlobFunc) (const void* key, EGLsizei keySize, void* value, EGLsizei valueSize);
typedef khronos_ssize_t EGLsizeiANDROID;
typedef void (*EGLSetBlobFuncANDROID) (const void* key, EGLsizeiANDROID keySize, const void* value, EGLsizeiANDROID valueSize);
typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void* key, EGLsizeiANDROID keySize, void* value, EGLsizeiANDROID valueSize);
#ifdef EGL_EGLEXT_PROTOTYPES
EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncs(EGLDisplay dpy, EGLSetBlobFunc set, EGLGetBlobFunc get);
EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID(EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
#endif /* EGL_EGLEXT_PROTOTYPES */
typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSPROC) (EGLDisplay dpy,
        EGLSetBlobFunc set, EGLGetBlobFunc get);
typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy,
        EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
#endif

#ifdef __cplusplus
+1 −1
Original line number Diff line number Diff line
@@ -860,7 +860,7 @@ __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname)

    // The EGL_ANDROID_blob_cache extension should not be exposed to
    // applications.  It is used internally by the Android EGL layer.
    if (!strcmp(procname, "eglSetBlobCacheFuncs")) {
    if (!strcmp(procname, "eglSetBlobCacheFuncsANDROID")) {
        return NULL;
    }

+21 −19
Original line number Diff line number Diff line
@@ -46,13 +46,13 @@ namespace android {
//
// Callback functions passed to EGL.
//
static void setBlob(const void* key, EGLsizei keySize, const void* value,
        EGLsizei valueSize) {
static void setBlob(const void* key, EGLsizeiANDROID keySize,
        const void* value, EGLsizeiANDROID valueSize) {
    egl_cache_t::get()->setBlob(key, keySize, value, valueSize);
}

static EGLsizei getBlob(const void* key, EGLsizei keySize, void* value,
        EGLsizei valueSize) {
static EGLsizeiANDROID getBlob(const void* key, EGLsizeiANDROID keySize,
        void* value, EGLsizeiANDROID valueSize) {
    return egl_cache_t::get()->getBlob(key, keySize, value, valueSize);
}

@@ -87,22 +87,23 @@ void egl_cache_t::initialize(egl_display_t *display) {
                    !strcmp(" " BC_EXT_STR, exts + extsLen - (bcExtLen+1));
            bool inMiddle = strstr(" " BC_EXT_STR " ", exts);
            if (equal || atStart || atEnd || inMiddle) {
                PFNEGLSETBLOBCACHEFUNCSPROC eglSetBlobCacheFuncs;
                eglSetBlobCacheFuncs =
                        reinterpret_cast<PFNEGLSETBLOBCACHEFUNCSPROC>(
                            cnx->egl.eglGetProcAddress("eglSetBlobCacheFuncs"));
                if (eglSetBlobCacheFuncs == NULL) {
                PFNEGLSETBLOBCACHEFUNCSANDROIDPROC eglSetBlobCacheFuncsANDROID;
                eglSetBlobCacheFuncsANDROID =
                        reinterpret_cast<PFNEGLSETBLOBCACHEFUNCSANDROIDPROC>(
                            cnx->egl.eglGetProcAddress(
                                    "eglSetBlobCacheFuncsANDROID"));
                if (eglSetBlobCacheFuncsANDROID == NULL) {
                    LOGE("EGL_ANDROID_blob_cache advertised by display %d, "
                            "but unable to get eglSetBlobCacheFuncs", i);
                            "but unable to get eglSetBlobCacheFuncsANDROID", i);
                    continue;
                }

                eglSetBlobCacheFuncs(display->disp[i].dpy, android::setBlob,
                        android::getBlob);
                eglSetBlobCacheFuncsANDROID(display->disp[i].dpy,
                        android::setBlob, android::getBlob);
                EGLint err = cnx->egl.eglGetError();
                if (err != EGL_SUCCESS) {
                    LOGE("eglSetBlobCacheFuncs resulted in an error: %#x",
                            err);
                    LOGE("eglSetBlobCacheFuncsANDROID resulted in an error: "
                            "%#x", err);
                }
            }
        }
@@ -119,8 +120,8 @@ void egl_cache_t::terminate() {
    mInitialized = false;
}

void egl_cache_t::setBlob(const void* key, EGLsizei keySize, const void* value,
        EGLsizei valueSize) {
void egl_cache_t::setBlob(const void* key, EGLsizeiANDROID keySize,
        const void* value, EGLsizeiANDROID valueSize) {
    Mutex::Autolock lock(mMutex);

    if (keySize < 0 || valueSize < 0) {
@@ -158,8 +159,8 @@ void egl_cache_t::setBlob(const void* key, EGLsizei keySize, const void* value,
    }
}

EGLsizei egl_cache_t::getBlob(const void* key, EGLsizei keySize, void* value,
        EGLsizei valueSize) {
EGLsizeiANDROID egl_cache_t::getBlob(const void* key, EGLsizeiANDROID keySize,
        void* value, EGLsizeiANDROID valueSize) {
    Mutex::Autolock lock(mMutex);

    if (keySize < 0 || valueSize < 0) {
@@ -323,7 +324,8 @@ void egl_cache_t::loadBlobCacheLocked() {
            return;
        }

        status_t err = mBlobCache->unflatten(buf + headerSize, cacheSize, NULL, 0);
        status_t err = mBlobCache->unflatten(buf + headerSize, cacheSize, NULL,
                0);
        if (err != OK) {
            LOGE("error reading cache contents: %s (%d)", strerror(-err),
                    -err);
+4 −4
Original line number Diff line number Diff line
@@ -52,14 +52,14 @@ public:
    // setBlob attempts to insert a new key/value blob pair into the cache.
    // This will be called by the hardware vendor's EGL implementation via the
    // EGL_ANDROID_blob_cache extension.
    void setBlob(const void* key, EGLsizei keySize, const void* value,
        EGLsizei valueSize);
    void setBlob(const void* key, EGLsizeiANDROID keySize, const void* value,
        EGLsizeiANDROID valueSize);

    // getBlob attempts to retrieve the value blob associated with a given key
    // blob from cache.  This will be called by the hardware vendor's EGL
    // implementation via the EGL_ANDROID_blob_cache extension.
    EGLsizei getBlob(const void* key, EGLsizei keySize, void* value,
        EGLsizei valueSize);
    EGLsizeiANDROID getBlob(const void* key, EGLsizeiANDROID keySize,
        void* value, EGLsizeiANDROID valueSize);

    // setCacheFilename sets the name of the file that should be used to store
    // cache contents from one program invocation to another.
+27 −27
Original line number Diff line number Diff line
@@ -63,31 +63,31 @@ Overview
New Types

    /*
     * EGLsizei is a signed integer type for representing the size of a memory
     * buffer.
     * EGLsizeiANDROID is a signed integer type for representing the size of a
     * memory buffer.
     */
    #include <khrplatform.h>
    typedef khronos_ssize_t EGLsizei;
    typedef khronos_ssize_t EGLsizeiANDROID;

    /*
     * EGLSetBlobFunc is a pointer to an application-provided function that a
     * client API implementation may use to insert a key/value pair into the
     * cache.
     */
    typedef void (*EGLSetBlobFunc) (const void* key, EGLsizei keySize,
        const void* value, EGLsizei valueSize)
    typedef void (*EGLSetBlobFuncANDROID) (const void* key,
        EGLsizeiANDROID keySize, const void* value, EGLsizeiANDROID valueSize)

    /*
     * EGLGetBlobFunc is a pointer to an application-provided function that a
     * client API implementation may use to retrieve a cached value from the
     * cache.
     */
    typedef EGLsizei (*EGLGetBlobFunc) (const void* key, EGLsizei keySize,
        void* value, EGLsizei valueSize)
    typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void* key,
        EGLsizeiANDROID keySize, void* value, EGLsizeiANDROID valueSize)

New Procedures and Functions

    void eglSetBlobCacheFuncs(EGLDisplay dpy,
    void eglSetBlobCacheFuncsANDROID(EGLDisplay dpy,
                                     EGLSetBlobFunc set,
                                     EGLGetBlobFunc get);

@@ -107,8 +107,8 @@ Changes to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)
    function pointers through which the client APIs can request data be cached
    and retrieved.  The command

        void eglSetBlobCacheFuncs(EGLDisplay dpy,
            EGLSetBlobFunc set, EGLGetBlobFunc get);
        void eglSetBlobCacheFuncsANDROID(EGLDisplay dpy,
            EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);

    sets the callback function pointers that client APIs associated with
    display <dpy> can use to interact with caching functionality provided by
@@ -120,17 +120,17 @@ Changes to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)

    Cache functions may only be specified once during the lifetime of an
    EGLDisplay.  The <set> and <get> functions may be called at any time and
    from any thread from the time at which eglSetBlobCacheFuncs is called until
    the time that the last resource associated with <dpy> is deleted and <dpy>
    itself is terminated.  Concurrent calls to these functions from different
    threads is also allowed.

    If eglSetBlobCacheFuncs generates an error then all client APIs must behave
    as though eglSetBlobCacheFuncs was not called for the display <dpy>.  If
    <set> or <get> is NULL then an EGL_BAD_PARAMETER error is generated.  If a
    successful eglSetBlobCacheFuncs call was already made for <dpy> and the
    display has not since been terminated then an EGL_BAD_PARAMETER error is
    generated.
    from any thread from the time at which eglSetBlobCacheFuncsANDROID is
    called until the time that the last resource associated with <dpy> is
    deleted and <dpy> itself is terminated.  Concurrent calls to these
    functions from different threads is also allowed.

    If eglSetBlobCacheFuncsANDROID generates an error then all client APIs must
    behave as though eglSetBlobCacheFuncsANDROID was not called for the display
    <dpy>.  If <set> or <get> is NULL then an EGL_BAD_PARAMETER error is
    generated.  If a successful eglSetBlobCacheFuncsANDROID call was already
    made for <dpy> and the display has not since been terminated then an
    EGL_BAD_PARAMETER error is generated.

    3.9.1 Cache Operations

@@ -138,8 +138,8 @@ Changes to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)
    key, a client API implementation can call the application-provided callback
    function

        void (*set) (const void* key, EGLsizei keySize, const void* value,
            EGLsizei valueSize)
        void (*set) (const void* key, EGLsizeiANDROID keySize,
            const void* value, EGLsizeiANDROID valueSize)

    <key> and <value> are pointers to the beginning of the key and value,
    respectively, that are to be inserted.  <keySize> and <valueSize> specify
@@ -157,8 +157,8 @@ Changes to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)
    client API implementation can call the application-provided callback
    function

        EGLsizei (*get) (const void* key, EGLsizei keySize, void* value,
            EGLsizei valueSize)
        EGLsizeiANDROID (*get) (const void* key, EGLsizeiANDROID keySize,
            void* value, EGLsizeiANDROID valueSize)

    <key> is a pointer to the beginning of the key.  <keySize> specifies the
    size in bytes of the binary key pointed to by <key>.  If the cache contains