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