Only open X Display once for all test GLX contexts
authorbsalomon <bsalomon@google.com>
Thu, 11 Aug 2016 21:58:34 +0000 (14:58 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 11 Aug 2016 21:58:34 +0000 (14:58 -0700)
Saves about 4 seconds of runtime for 'dm --src gm --config gpu' on my system.

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2240673002

Review-Url: https://codereview.chromium.org/2240673002

tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp

index c483fecabec5f751fef470cd2f3cce4d92f308a3..1da245d87c3264c0ea59c159de2f1b14f8557eaa 100644 (file)
@@ -4,7 +4,9 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
+
 #include "gl/GLTestContext.h"
+#include "SkOnce.h"
 
 #include <X11/Xlib.h>
 #include <GL/glx.h>
@@ -69,12 +71,31 @@ private:
     GLXPixmap fGlxPixmap;
 };
 
+static Display* get_display() {
+    class AutoDisplay {
+    public:
+        AutoDisplay() { fDisplay = XOpenDisplay(nullptr); };
+        ~AutoDisplay() {
+            if (fDisplay) {
+                XCloseDisplay(fDisplay);
+            }
+        }
+        Display* display() const { return fDisplay; }
+    private:
+        Display* fDisplay;
+    };
+    static std::unique_ptr<AutoDisplay> ad;
+    static SkOnce once;
+    once([] { ad.reset(new AutoDisplay{}); });
+    return ad->display();
+}
+
 GLXGLTestContext::GLXGLTestContext(GrGLStandard forcedGpuAPI, GLXGLTestContext* shareContext)
     : fContext(nullptr)
     , fDisplay(nullptr)
     , fPixmap(0)
     , fGlxPixmap(0) {
-    fDisplay = XOpenDisplay(0);
+    fDisplay = get_display();
 
     GLXContext glxShareContext = shareContext ? shareContext->fContext : nullptr;
 
@@ -239,7 +260,6 @@ void GLXGLTestContext::destroyGLContext() {
             fPixmap = 0;
         }
 
-        XCloseDisplay(fDisplay);
         fDisplay = nullptr;
     }
 }