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

Commit 20f066ca authored by “Shadman's avatar “Shadman
Browse files

render thread early preload optimizations

  1. preload eglContext when renderthread preload is called so setSurface
work is not waiting for this work during app launch crit path.
  2. Additionally queue GraphicBufferAllocator instance get, so
allocateBuffer does not wait for initialization during app launch
critical path.

Impact: Large improvement in app launch latency for low core devices
 - ~70ms of improvement in our view based app launch
 - ~27ms of improvement in material3 compose base app launch

Test: manual built and flashed
Bug: 383612849
Flag: early_preload_gl_context
Change-Id: I580e31de1d3a9878cf102dfdcad39bfd64bf2c53
parent 11608e9f
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -54,6 +54,9 @@ constexpr bool resample_gainmap_regions() {
constexpr bool query_global_priority() {
    return false;
}
constexpr bool early_preload_gl_context() {
    return false;
}
}  // namespace hwui_flags
#endif

@@ -291,5 +294,10 @@ bool Properties::resampleGainmapRegions() {
    return sResampleGainmapRegions;
}

bool Properties::earlyPreloadGlContext() {
    return base::GetBoolProperty(PROPERTY_EARLY_PRELOAD_GL_CONTEXT,
                                 hwui_flags::early_preload_gl_context());
}

}  // namespace uirenderer
}  // namespace android
+3 −0
Original line number Diff line number Diff line
@@ -236,6 +236,8 @@ enum DebugLevel {

#define PROPERTY_SKIP_EGLMANAGER_TELEMETRY "debug.hwui.skip_eglmanager_telemetry"

#define PROPERTY_EARLY_PRELOAD_GL_CONTEXT "debug.hwui.early_preload_gl_context"

///////////////////////////////////////////////////////////////////////////////
// Misc
///////////////////////////////////////////////////////////////////////////////
@@ -381,6 +383,7 @@ public:

    static bool initializeGlAlways();
    static bool resampleGainmapRegions();
    static bool earlyPreloadGlContext();

private:
    static StretchEffectBehavior stretchEffectBehavior;
+7 −0
Original line number Diff line number Diff line
@@ -167,3 +167,10 @@ flag {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "early_preload_gl_context"
  namespace: "core_graphics"
  description: "Initialize GL context and GraphicBufferAllocater init on renderThread preload. This improves app startup time for apps using GL."
  bug: "383612849"
}
 No newline at end of file
+10 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <private/android/choreographer.h>
#include <sys/resource.h>
#include <ui/FatVector.h>
#include <ui/GraphicBufferAllocator.h>
#include <utils/Condition.h>
#include <utils/Log.h>
#include <utils/Mutex.h>
@@ -518,11 +519,18 @@ bool RenderThread::isCurrent() {
void RenderThread::preload() {
    // EGL driver is always preloaded only if HWUI renders with GL.
    if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
        if (Properties::earlyPreloadGlContext()) {
            queue().post([this]() { requireGlContext(); });
        } else {
            std::thread eglInitThread([]() { eglGetDisplay(EGL_DEFAULT_DISPLAY); });
            eglInitThread.detach();
        }
    } else {
        requireVkContext();
    }
    if (Properties::earlyPreloadGlContext()) {
        queue().post([]() { GraphicBufferAllocator::getInstance(); });
    }
    HardwareBitmapUploader::initialize();
}