reduce PB size from 2MB to 512KB

this allows us to enable h/w acceleration on low-end
devices while keeping memory usage down.

Bug: 6557760
Change-Id: I8af2de3038dc2579360b8b73aa452cb7a0e506a9
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 0b1016c..9ee3686 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -81,6 +81,24 @@
 
 // ----------------------------------------------------------------------------
 
+static char const * getProcessCmdline() {
+    long pid = getpid();
+    char procPath[128];
+    snprintf(procPath, 128, "/proc/%ld/cmdline", pid);
+    FILE * file = fopen(procPath, "r");
+    if (file) {
+        static char cmdline[256];
+        char *str = fgets(cmdline, sizeof(cmdline) - 1, file);
+        fclose(file);
+        if (str) {
+            return cmdline;
+        }
+    }
+    return NULL;
+}
+
+// ----------------------------------------------------------------------------
+
 Loader::driver_t::driver_t(void* gles) 
 {
     dso[0] = gles;
@@ -280,6 +298,35 @@
         ALOGE_IF(!getProcAddress, 
                 "can't find eglGetProcAddress() in %s", driver_absolute_path);
 
+#ifdef SYSTEMUI_PBSIZE_HACK
+#warning "SYSTEMUI_PBSIZE_HACK enabled"
+        /*
+         * TODO: replace SYSTEMUI_PBSIZE_HACK by something less hackish
+         *
+         * Here we adjust the PB size from its default value to 512KB which
+         * is the minimum acceptable for the systemui process.
+         * We do this on low-end devices only because it allows us to enable
+         * h/w acceleration in the systemui process while keeping the
+         * memory usage down.
+         *
+         * Obviously, this is the wrong place and wrong way to make this
+         * adjustment, but at the time of this writing this was the safest
+         * solution.
+         */
+        const char *cmdline = getProcessCmdline();
+        if (strstr(cmdline, "systemui")) {
+            void *imgegl = dlopen("/vendor/lib/libIMGegl.so", RTLD_LAZY);
+            if (imgegl) {
+                unsigned int *PVRDefaultPBS =
+                        (unsigned int *)dlsym(imgegl, "PVRDefaultPBS");
+                if (PVRDefaultPBS) {
+                    ALOGD("setting default PBS to 512KB, was %d KB", *PVRDefaultPBS / 1024);
+                    *PVRDefaultPBS = 512*1024;
+                }
+            }
+        }
+#endif
+
         egl_t* egl = &cnx->egl;
         __eglMustCastToProperFunctionPointerType* curr =
             (__eglMustCastToProperFunctionPointerType*)egl;