Merge lp:~nick-dedekind/qtubuntu/bad-context into lp:qtubuntu

Proposed by Nick Dedekind
Status: Rejected
Rejected by: Gerry Boland
Proposed branch: lp:~nick-dedekind/qtubuntu/bad-context
Merge into: lp:qtubuntu
Prerequisite: lp:~nick-dedekind/qtubuntu/cross-build-support
Diff against target: 163 lines (+60/-23)
4 files modified
src/ubuntumirclient/glcontext.cpp (+53/-7)
src/ubuntumirclient/glcontext.h (+4/-0)
src/ubuntumirclient/screen.cpp (+0/-14)
src/ubuntumirclient/window.cpp (+3/-2)
To merge this branch: bzr merge lp:~nick-dedekind/qtubuntu/bad-context
Reviewer Review Type Date Requested Status
Gerry Boland (community) Needs Fixing
Unity8 CI Bot continuous-integration Approve
Review via email: mp+291267@code.launchpad.net

Commit message

Moved setSwapInterval to glContext to fix bad context. Added better logging for egl failures.

Description of the change

Moved setSwapInterval to glContext to fix bad context. Added better logging for egl failures.

To post a comment you must log in.
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :

PASSED: Continuous integration, rev:317
https://unity8-jenkins.ubuntu.com/job/lp-qtubuntu-ci/34/
Executed test runs:
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-0-fetch/1297
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/1268
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/1268
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1266/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=amd64,release=xenial/1266/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1266/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=armhf,release=xenial/1266/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=vivid+overlay/1266/artifact/output/*zip*/output.zip
    SUCCESS: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial/1266
        deb: https://unity8-jenkins.ubuntu.com/job/build-2-binpkg/arch=i386,release=xenial/1266/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtubuntu-ci/34/rebuild

review: Approve (continuous-integration)
Revision history for this message
Gerry Boland (gerboland) wrote :

Code equivalent to that in Qt's QEglPlatformContext [1], so can't complain. Have you tested all devices to be sure it has zero impact, just in case?

+++ src/ubuntumirclient/window.cpp
+ if (!ok) return;
Let's print an error instead of just ignoring

[1] https://codereview.qt-project.org/#/c/62055/

review: Needs Fixing
Revision history for this message
Gerry Boland (gerboland) wrote :

Thanks for this, but I inadvertently ended up fixing this in this refactoring:
https://code.launchpad.net/~gerboland/qtubuntu/adopt-more-eglconvenience2/+merge/295248

Unmerged revisions

317. By Nick Dedekind

removed global

316. By Nick Dedekind

dont onBufferswapDone if failed swap

315. By Nick Dedekind

merged crossbuild

314. By Nick Dedekind

context fixes

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/ubuntumirclient/glcontext.cpp'
2--- src/ubuntumirclient/glcontext.cpp 2016-01-04 17:18:51 +0000
3+++ src/ubuntumirclient/glcontext.cpp 2016-04-07 14:36:32 +0000
4@@ -49,6 +49,9 @@
5 }
6
7 UbuntuOpenGLContext::UbuntuOpenGLContext(UbuntuScreen* screen, UbuntuOpenGLContext* share)
8+ : m_swapInterval(-1)
9+ , m_swapIntervalEnvChecked(false)
10+ , m_swapIntervalFromEnv(-1)
11 {
12 ASSERT(screen != NULL);
13 mEglDisplay = screen->eglDisplay();
14@@ -68,7 +71,9 @@
15
16 UbuntuOpenGLContext::~UbuntuOpenGLContext()
17 {
18- ASSERT(eglDestroyContext(mEglDisplay, mEglContext) == EGL_TRUE);
19+ if (mEglContext != EGL_NO_CONTEXT) {
20+ ASSERT(eglDestroyContext(mEglDisplay, mEglContext) == EGL_TRUE);
21+ }
22 }
23
24 bool UbuntuOpenGLContext::makeCurrent(QPlatformSurface* surface)
25@@ -83,29 +88,70 @@
26 }
27 return offscreen->buffer()->bind();
28 } else {
29+ ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
30+
31 EGLSurface eglSurface = static_cast<UbuntuWindow*>(surface)->eglSurface();
32- ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
33- ASSERT(eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext) == EGL_TRUE);
34+
35+ // shortcut: on some GPUs, eglMakeCurrent is not a cheap operation
36+ if (eglGetCurrentContext() == mEglContext &&
37+ eglGetCurrentDisplay() == mEglDisplay &&
38+ eglGetCurrentSurface(EGL_READ) == eglSurface &&
39+ eglGetCurrentSurface(EGL_DRAW) == eglSurface) {
40+ return true;
41+ }
42+
43+ const bool ok = eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
44+ if (ok) {
45+ if (!m_swapIntervalEnvChecked) {
46+ m_swapIntervalEnvChecked = true;
47+ if (qEnvironmentVariableIsSet("QTUBUNTU_SWAPINTERVAL")) {
48+ QByteArray swapIntervalString = qgetenv("QTUBUNTU_SWAPINTERVAL");
49+ bool intervalOk;
50+ const int swapInterval = swapIntervalString.toInt(&intervalOk);
51+ if (intervalOk) {
52+ m_swapIntervalFromEnv = swapInterval;
53+ }
54+ }
55+ }
56+ const int requestedSwapInterval = m_swapIntervalFromEnv >= 0 ? m_swapIntervalFromEnv
57+ : surface->format().swapInterval();
58+ if (requestedSwapInterval >= 0 && m_swapInterval != requestedSwapInterval) {
59+ m_swapInterval = requestedSwapInterval;
60+ eglSwapInterval(mEglDisplay, m_swapInterval);
61+ }
62+ } else {
63+ qCWarning(ubuntumirclient, "UbuntuOpenGLContext::makeCurrent: eglError: %x, this: %p", eglGetError(), this);
64+ }
65+
66 if (ubuntumirclient().isDebugEnabled()) {
67 printOpenGLESConfig();
68 }
69- return true;
70+ return ok;
71 }
72+ return false;
73 }
74
75 void UbuntuOpenGLContext::doneCurrent()
76 {
77 ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
78- ASSERT(eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) == EGL_TRUE);
79+
80+ bool ok = eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
81+ if (!ok) {
82+ qCWarning(ubuntumirclient, "UbuntuOpenGLContext::doneCurrent(): eglError: %d, this: %p", eglGetError(), this);
83+ }
84 }
85
86 void UbuntuOpenGLContext::swapBuffers(QPlatformSurface* surface)
87 {
88 UbuntuWindow *ubuntuWindow = static_cast<UbuntuWindow*>(surface);
89
90+ ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
91 EGLSurface eglSurface = ubuntuWindow->eglSurface();
92- ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
93- ASSERT(eglSwapBuffers(mEglDisplay, eglSurface) == EGL_TRUE);
94+ bool ok = eglSwapBuffers(mEglDisplay, eglSurface);
95+ if (!ok) {
96+ qCWarning(ubuntumirclient, "UbuntuOpenGLContext::swapBuffers(): eglError: %d, this: %p", eglGetError(), this);
97+ return;
98+ }
99
100 ubuntuWindow->onSwapBuffersDone();
101 }
102
103=== modified file 'src/ubuntumirclient/glcontext.h'
104--- src/ubuntumirclient/glcontext.h 2015-09-29 13:09:01 +0000
105+++ src/ubuntumirclient/glcontext.h 2016-04-07 14:36:32 +0000
106@@ -40,6 +40,10 @@
107 UbuntuScreen* mScreen;
108 EGLContext mEglContext;
109 EGLDisplay mEglDisplay;
110+
111+ int m_swapInterval;
112+ bool m_swapIntervalEnvChecked;
113+ int m_swapIntervalFromEnv;
114 };
115
116 #endif // UBUNTU_OPENGL_CONTEXT_H
117
118=== modified file 'src/ubuntumirclient/screen.cpp'
119--- src/ubuntumirclient/screen.cpp 2015-12-09 13:01:28 +0000
120+++ src/ubuntumirclient/screen.cpp 2016-04-07 14:36:32 +0000
121@@ -31,8 +31,6 @@
122
123 #include <memory>
124
125-static const int kSwapInterval = 1;
126-
127 static const char *orientationToStr(Qt::ScreenOrientation orientation) {
128 switch (orientation) {
129 case Qt::PrimaryOrientation:
130@@ -163,18 +161,6 @@
131 printEglConfig(mEglDisplay, mEglConfig);
132 }
133
134- // Set vblank swap interval.
135- int swapInterval = kSwapInterval;
136- QByteArray swapIntervalString = qgetenv("QTUBUNTU_SWAPINTERVAL");
137- if (!swapIntervalString.isEmpty()) {
138- bool ok;
139- swapInterval = swapIntervalString.toInt(&ok);
140- if (!ok)
141- swapInterval = kSwapInterval;
142- }
143- qCDebug(ubuntumirclient, "setting swap interval to %d", swapInterval);
144- eglSwapInterval(mEglDisplay, swapInterval);
145-
146 // Get screen resolution.
147 auto configDeleter = [](MirDisplayConfiguration *config) { mir_display_config_destroy(config); };
148 using configUp = std::unique_ptr<MirDisplayConfiguration, decltype(configDeleter)>;
149
150=== modified file 'src/ubuntumirclient/window.cpp'
151--- src/ubuntumirclient/window.cpp 2016-03-14 17:37:19 +0000
152+++ src/ubuntumirclient/window.cpp 2016-04-07 14:36:32 +0000
153@@ -438,8 +438,9 @@
154
155 EGLint eglSurfaceWidth = -1;
156 EGLint eglSurfaceHeight = -1;
157- eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &eglSurfaceWidth);
158- eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &eglSurfaceHeight);
159+ bool ok = eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &eglSurfaceWidth);
160+ ok &= eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &eglSurfaceHeight);
161+ if (!ok) return;
162
163 const bool validSize = eglSurfaceWidth > 0 && eglSurfaceHeight > 0;
164

Subscribers

People subscribed via source and target branches