diff --git a/docs/changelog.rst b/docs/changelog.rst index dc64a835b..35ef9da19 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -43,6 +43,9 @@ To update |kitty|, :doc:`follow the instructions `. - X11: Recompile keymaps on XkbNewKeyboardNotify events (:iss:`2726`) +- X11: Reduce startup time by ~25% by only querying GLX for framebuffer + configurations once (:iss:`2754`) + - macOS: Notarize the kitty application (:iss:`2040`) diff --git a/glfw/glx_context.c b/glfw/glx_context.c index 5918b52f1..edf41a8ca 100644 --- a/glfw/glx_context.c +++ b/glfw/glx_context.c @@ -58,6 +58,13 @@ static bool chooseGLXFBConfig(const _GLFWfbconfig* desired, int i, nativeCount, usableCount; const char* vendor; bool trustWindowBit = true; + static _GLFWfbconfig prev_desired = {0}; + static uintptr_t prev_result = 0; + if (prev_result != 0 && memcmp(&prev_desired, desired, sizeof(_GLFWfbconfig)) == 0) { + *result = (GLXFBConfig)prev_result; + return true; + } + prev_desired = *desired; // HACK: This is a (hopefully temporary) workaround for Chromium // (VirtualBox GL) not setting the window bit on any GLXFBConfigs @@ -133,8 +140,10 @@ static bool chooseGLXFBConfig(const _GLFWfbconfig* desired, } closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount); - if (closest) + if (closest) { *result = (GLXFBConfig) closest->handle; + prev_result = (uintptr_t) closest->handle; + } XFree(nativeConfigs); free(usableConfigs);