egl_cache.cpp revision aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9
1aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis/*
2aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Copyright 2011, The Android Open Source Project
3aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
4aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Licensed under the Apache License, Version 2.0 (the "License");
5aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** you may not use this file except in compliance with the License.
6aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** You may obtain a copy of the License at
7aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
8aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **     http://www.apache.org/licenses/LICENSE-2.0
9aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
10aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Unless required by applicable law or agreed to in writing, software
11aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** distributed under the License is distributed on an "AS IS" BASIS,
12aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** See the License for the specific language governing permissions and
14aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** limitations under the License.
15aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis */
16aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
17aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis#include "egl_cache.h"
18aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis#include "egl_display.h"
19aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis#include "egl_impl.h"
20aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis#include "egldefs.h"
21aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
22aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
23aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisnamespace android {
24aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
25aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
26aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis#define BC_EXT_STR "EGL_ANDROID_blob_cache"
27aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
28aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis//
29aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// EGL_ANDROID_blob_cache types and functions
30aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis//
31aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennistypedef khronos_ssize_t EGLsizei;
32aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
33aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennistypedef void (*EGLSetBlobFunc) (const void* key, EGLsizei keySize,
34aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        const void* value, EGLsizei valueSize);
35aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
36aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennistypedef EGLsizei (*EGLGetBlobFunc) (const void* key, EGLsizei keySize,
37aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        void* value, EGLsizei valueSize);
38aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
39aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennistypedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSPROC) (EGLDisplay dpy,
40aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        EGLSetBlobFunc set, EGLGetBlobFunc get);
41aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
42aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis//
43aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// egl_cache_t definition
44aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis//
45aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisstatic void setBlob(const void* key, EGLsizei keySize, const void* value,
46aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        EGLsizei valueSize) {
47aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}
48aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
49aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisstatic EGLsizei getBlob(const void* key, EGLsizei keySize, void* value,
50aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        EGLsizei valueSize) {
51aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    return 0;
52aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}
53aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
54aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisegl_cache_t* egl_cache_t::get() {
55aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    static egl_cache_t theCache;
56aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    return &theCache;
57aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}
58aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
59aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisvoid egl_cache_t::initialize(egl_display_t *display) {
60aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
61aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        egl_connection_t* const cnx = &gEGLImpl[i];
62aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        if (cnx->dso && cnx->major >= 0 && cnx->minor >= 0) {
63aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            const char* exts = display->disp[i].queryString.extensions;
64aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            size_t bcExtLen = strlen(BC_EXT_STR);
65aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            size_t extsLen = strlen(exts);
66aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            bool equal = !strcmp(BC_EXT_STR, exts);
67aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            bool atStart = !strncmp(BC_EXT_STR " ", exts, bcExtLen+1);
68aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            bool atEnd = (bcExtLen+1) < extsLen &&
69aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                    !strcmp(" " BC_EXT_STR, exts + extsLen - (bcExtLen+1));
70aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            bool inMiddle = strstr(" " BC_EXT_STR " ", exts);
71aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            if (equal || atStart || atEnd || inMiddle) {
72aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                PFNEGLSETBLOBCACHEFUNCSPROC eglSetBlobCacheFuncs;
73aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                eglSetBlobCacheFuncs =
74aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                        reinterpret_cast<PFNEGLSETBLOBCACHEFUNCSPROC>(
75aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                            cnx->egl.eglGetProcAddress("eglSetBlobCacheFuncs"));
76aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                if (eglSetBlobCacheFuncs == NULL) {
77aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                    LOGE("EGL_ANDROID_blob_cache advertised by display %d, "
78aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                            "but unable to get eglSetBlobCacheFuncs", i);
79aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                    continue;
80aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                }
81aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
82aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                eglSetBlobCacheFuncs(display->disp[i].dpy, setBlob, getBlob);
83aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                EGLint err = cnx->egl.eglGetError();
84aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                if (err != EGL_SUCCESS) {
85aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                    LOGE("eglSetBlobCacheFuncs resulted in an error: %#x",
86aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                            err);
87aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis                }
88aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis            }
89aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis        }
90aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    }
91aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}
92aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
93aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
94aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}; // namespace android
95aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
96