summarylogtreecommitdiffstats
path: root/0006-egl-optimise-eglMakeCurrent-for-the-case-where-nothi.patch
blob: 277aead07b872da30abb045fbdbbe6544637e384 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
From 85d01b1ac0873c5c5f5886b24c36a0784e640324 Mon Sep 17 00:00:00 2001
From: Frank Binns <frank.binns@imgtec.com>
Date: Tue, 15 Sep 2015 14:15:31 +0100
Subject: [PATCH] egl: optimise eglMakeCurrent for the case where nothing has
 changed

When an application calls eglMakeCurrent with a context, draw surface and
read surface that match those that are currently bound to the calling
thread don't perform a flush as this is an expensive operation.

---
 src/egl/main/eglapi.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index ddad85d..7e2542b 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -858,6 +858,7 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
                EGLContext ctx)
 {
    _EGLDisplay *disp = _eglLockDisplay(dpy);
+   _EGLContext *current_context = _eglGetCurrentContext();
    _EGLContext *context = _eglLookupContext(ctx, disp);
    _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
    _EGLSurface *read_surf = _eglLookupSurface(read, disp);
@@ -911,7 +912,16 @@ eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
        draw_surf && !draw_surf->ProtectedContent)
       RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
 
-   ret = disp->Driver->MakeCurrent(disp, draw_surf, read_surf, context);
+   /* As an optimisation don't do anything unless something has changed */
+   if (context != current_context ||
+       (current_context &&
+        (draw_surf != current_context->DrawSurface ||
+         read_surf != current_context->ReadSurface)) ||
+       (!current_context && (draw_surf || read_surf))) {
+           ret = disp->Driver->MakeCurrent(disp, draw_surf, read_surf, context);
+   } else {
+	   ret = EGL_TRUE;
+   }
 
    RETURN_EGL_EVAL(disp, ret);
 }