Patch disables EGL_ANDROID_blob_cache and sets own get/set cache functions internally, this makes any EGL app to utilize cache automatically.
Signed-off-by: Tapani Pälli <[email protected]> --- src/egl/drivers/dri2/egl_dri2.c | 3 -- src/egl/main/eglapi.c | 77 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index f9d0223fe2..e24dab1589 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -728,9 +728,6 @@ dri2_setup_screen(_EGLDisplay *disp) } } - if (dri2_dpy->blob) - disp->Extensions.ANDROID_blob_cache = EGL_TRUE; - disp->Extensions.KHR_reusable_sync = EGL_TRUE; if (dri2_dpy->image) { diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index b8d64a913c..5cd70c1afe 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -790,6 +790,80 @@ eglDestroyContext(EGLDisplay dpy, EGLContext ctx) RETURN_EGL_EVAL(disp, ret); } +static void* +_load_file(const char *path, uint64_t *size) +{ + FILE *in = fopen(path, "r"); + + if (!in) + return NULL; + + fseek(in, 0, SEEK_END); + long file_size = ftell(in); + rewind(in); + + printf("%s: %s, size is %ld\n", __func__, path, file_size); + + char *data = (char *) malloc (file_size); + + fread(data, file_size, 1, in); + fclose(in); + + *size = file_size; + return data; +} + +static void +_save_file(const char *path, const void *data, uint64_t size) +{ + printf("%s: %s, size is %ld\n", __func__, path, size); + + FILE *out = fopen(path, "w"); + + if (!out) { + fprintf(stderr, "failed to open file for writing:\npath (%s)\n", path); + return; + } + + fwrite(data, size, 1, out); + fclose(out); +} + +static void +mesa_set(const void* key, EGLsizeiANDROID keySize, const void* value, EGLsizeiANDROID valueSize) +{ + if (valueSize < 2000) + return; + + char tmp[256]; + snprintf(tmp, 256, "/tmp/%s", key); + + _save_file(tmp, value, valueSize); +} + +static EGLsizeiANDROID +mesa_get(const void* key, EGLsizeiANDROID keySize, void* value, EGLsizeiANDROID valueSize) +{ + uint64_t size; + + char tmp[256]; + snprintf(tmp, 256, "/tmp/%s", key); + + void *data = _load_file(tmp, &size); + + if (!data) + return 0; + + if (size > valueSize) { + free(data); + return 0; + } + + memcpy(value, data, size); + free(data); + return size; +} + EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, @@ -845,6 +919,9 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context); + /* Debug EGL_ANDROID_blob_cache */ + drv->API.SetBlobCacheFuncsANDROID(drv, disp, mesa_set, mesa_get); + RETURN_EGL_EVAL(disp, ret); } -- 2.14.3 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
