Nux

Merge lp:~smspillaz/nux/nux.3.0.fix_1036521 into lp:nux/3.0

Proposed by Sam Spilsbury
Status: Merged
Approved by: Neil J. Patel
Approved revision: 657
Merged at revision: 659
Proposed branch: lp:~smspillaz/nux/nux.3.0.fix_1036521
Merge into: lp:nux/3.0
Diff against target: 274 lines (+168/-63)
3 files modified
Nux/WindowCompositor.cpp (+87/-63)
Nux/WindowCompositor.h (+1/-0)
tests/gtest-nux-windowcompositor.cpp (+80/-0)
To merge this branch: bzr merge lp:~smspillaz/nux/nux.3.0.fix_1036521
Reviewer Review Type Date Requested Status
Daniel van Vugt Approve
Review via email: mp+125106@code.launchpad.net

Commit message

Added a method to WindowCompositor RestoreMainFramebuffer which either restores the reference framebuffer or binds us to the backbuffer depending on what is available.

Description of the change

Added a method to WindowCompositor RestoreMainFramebuffer which either restores the reference framebuffer or binds us to the backbuffer depending on what is available. Test suite added.

To post a comment you must log in.
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Seems to work. I've verified both bugs fixed (with the Unity fix).

We could do better than giant switch statements, but they were pre-existing...

review: Approve
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

On Wed, 19 Sep 2012, Daniel van Vugt wrote:

> Review: Approve
>
> Seems to work. I've verified both bugs fixed (with the Unity fix).
>
> We could do better than giant switch statements, but they were pre-existing...

I'd like to say this too, however its really required for the operation of
framebuffer objects

> --
> https://code.launchpad.net/~smspillaz/nux/nux.3.0.fix_1036521/+merge/125106
> You are the owner of lp:~smspillaz/nux/nux.3.0.fix_1036521.
>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Nux/WindowCompositor.cpp'
--- Nux/WindowCompositor.cpp 2012-09-18 18:22:26 +0000
+++ Nux/WindowCompositor.cpp 2012-09-19 06:37:18 +0000
@@ -2277,80 +2277,104 @@
2277 reference_fbo_geometry_ = fbo_geometry;2277 reference_fbo_geometry_ = fbo_geometry;
2278 }2278 }
22792279
2280 namespace
2281 {
2282 bool CheckExternalFramebufferStatus (GLenum binding)
2283 {
2284 bool ok = false;
2285 // Nux does some sanity checks to make sure that the FBO is in good condition.
2286 GLenum status;
2287 status = glCheckFramebufferStatusEXT(binding);
2288 CHECKGL_MSG(glCheckFramebufferStatusEXT);
2289
2290 switch(status)
2291 {
2292 case GL_FRAMEBUFFER_COMPLETE_EXT: // Everything's OK
2293 ok = true;
2294 break;
2295 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
2296 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT");
2297 ok = false;
2298 break;
2299 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
2300 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT");
2301 ok = false;
2302 break;
2303 // See issue(87) of http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
2304 // case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT:
2305 // nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT");
2306 // ok = false;
2307 // break;
2308 case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
2309 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT");
2310 ok = false;
2311 break;
2312 #ifndef NUX_OPENGLES_20
2313 case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
2314 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT");
2315 ok = false;
2316 break;
2317 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
2318 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT");
2319 ok = false;
2320 break;
2321 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
2322 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT");
2323 ok = false;
2324 break;
2325 #endif
2326 // case GL_FRAMEBUFFER_STATUS_ERROR_EXT:
2327 // nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_STATUS_ERROR_EXT");
2328 // ok = false;
2329 // break;
2330 case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
2331 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_UNSUPPORTED_EXT");
2332 ok = false;
2333 break;
2334 default:
2335 nuxError("[GLFramebufferObject::IsValid] Unknown ERROR");
2336 ok = false;
2337 }
2338
2339 return ok;
2340 }
2341
2342 void SetReferenceFramebufferViewport (const nux::Geometry &reference_fbo_geometry_)
2343 {
2344 CHECKGL(glViewport(reference_fbo_geometry_.x,
2345 reference_fbo_geometry_.y,
2346 reference_fbo_geometry_.width,
2347 reference_fbo_geometry_.height));
2348 }
2349 }
2350
2280 bool WindowCompositor::RestoreReferenceFramebuffer()2351 bool WindowCompositor::RestoreReferenceFramebuffer()
2281 {2352 {
2353 if (!reference_fbo_)
2354 return false;
2355
2282 // It is assumed that the reference fbo contains valid textures.2356 // It is assumed that the reference fbo contains valid textures.
2283 // Nux does the following:2357 // Nux does the following:
2284 // - Bind the reference fbo (reference_fbo_)2358 // - Bind the reference fbo (reference_fbo_)
2285 // - Call glDrawBuffer with GL_COLOR_ATTACHMENT02359 // - Call glDrawBuffer with GL_COLOR_ATTACHMENT0
2286 // - Set the opengl viewport size (reference_fbo_geometry_)2360 // - Set the opengl viewport size (reference_fbo_geometry_)
22872361
2288 bool ok = false;
2289
2290 CHECKGL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, reference_fbo_));2362 CHECKGL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, reference_fbo_));
2291#ifndef NUX_OPENGLES_202363#ifndef NUX_OPENGLES_20
2292 CHECKGL(glDrawBuffer(GL_COLOR_ATTACHMENT0));2364 CHECKGL(glDrawBuffer(GL_COLOR_ATTACHMENT0));
2293#endif2365 CHECKGL(glReadBuffer(GL_COLOR_ATTACHMENT0));
2294 CHECKGL(glViewport(reference_fbo_geometry_.x,2366#endif
2295 reference_fbo_geometry_.y,2367
2296 reference_fbo_geometry_.width,2368 SetReferenceFramebufferViewport (reference_fbo_geometry_);
2297 reference_fbo_geometry_.height));2369
22982370 return CheckExternalFramebufferStatus (GL_FRAMEBUFFER_EXT);
2299 // Nux does some sanity checks to make sure that the FBO is in good condition.2371 }
2300 GLenum status;2372
2301 status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);2373 void WindowCompositor::RestoreMainFramebuffer()
2302 CHECKGL_MSG(glCheckFramebufferStatusEXT);2374 {
23032375 // This is a bit inefficient as we unbind and then rebind
2304 switch(status)2376 nux::GetGraphicsDisplay()->GetGpuDevice()->DeactivateFrameBuffer ();
2305 {2377 RestoreReferenceFramebuffer ();
2306 case GL_FRAMEBUFFER_COMPLETE_EXT: // Everything's OK
2307 ok = true;
2308 break;
2309 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
2310 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT");
2311 ok = false;
2312 break;
2313 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
2314 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT");
2315 ok = false;
2316 break;
2317 // See issue(87) of http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
2318 // case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT:
2319 // nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT");
2320 // ok = false;
2321 // break;
2322 case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
2323 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT");
2324 ok = false;
2325 break;
2326#ifndef NUX_OPENGLES_20
2327 case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
2328 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT");
2329 ok = false;
2330 break;
2331 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
2332 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT");
2333 ok = false;
2334 break;
2335 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
2336 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT");
2337 ok = false;
2338 break;
2339#endif
2340 // case GL_FRAMEBUFFER_STATUS_ERROR_EXT:
2341 // nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_STATUS_ERROR_EXT");
2342 // ok = false;
2343 // break;
2344 case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
2345 nuxError("[GLFramebufferObject::IsValid] GL_FRAMEBUFFER_UNSUPPORTED_EXT");
2346 ok = false;
2347 break;
2348 default:
2349 nuxError("[GLFramebufferObject::IsValid] Unknown ERROR");
2350 ok = false;
2351 }
2352
2353 return ok;
2354 }2378 }
23552379
2356#ifdef NUX_GESTURES_SUPPORT2380#ifdef NUX_GESTURES_SUPPORT
23572381
=== modified file 'Nux/WindowCompositor.h'
--- Nux/WindowCompositor.h 2012-09-18 18:22:26 +0000
+++ Nux/WindowCompositor.h 2012-09-19 06:37:18 +0000
@@ -216,6 +216,7 @@
216 @return True if no error was detected.216 @return True if no error was detected.
217 */217 */
218 bool RestoreReferenceFramebuffer();218 bool RestoreReferenceFramebuffer();
219 void RestoreMainFramebuffer();
219220
220 ObjectPtr<IOpenGLFrameBufferObject>& GetWindowFrameBufferObject()221 ObjectPtr<IOpenGLFrameBufferObject>& GetWindowFrameBufferObject()
221 {222 {
222223
=== modified file 'tests/gtest-nux-windowcompositor.cpp'
--- tests/gtest-nux-windowcompositor.cpp 2012-09-18 18:22:26 +0000
+++ tests/gtest-nux-windowcompositor.cpp 2012-09-19 06:37:18 +0000
@@ -143,6 +143,86 @@
143 boost::shared_ptr<nux::WindowThread> wnd_thread;143 boost::shared_ptr<nux::WindowThread> wnd_thread;
144};144};
145145
146namespace
147{
148 class ReferenceFramebuffer
149 {
150 public:
151
152 ReferenceFramebuffer ()
153 {
154 glGenFramebuffersEXT (1, &fboName);
155 glGenRenderbuffersEXT (1, &rbName);
156
157 glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, rbName);
158 glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_RGBA8_EXT, 300, 200);
159 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fboName);
160 glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rbName);
161 }
162
163 ~ReferenceFramebuffer ()
164 {
165 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
166 glDeleteRenderbuffers (1, &rbName);
167 glDeleteRenderbuffers (1, &fboName);
168 }
169
170 GLuint fboName, rbName;
171 };
172}
173TEST_F(TestWindowCompositor, TestRestoreReferenceFramebufferDirect)
174{
175 ReferenceFramebuffer reference;
176 GLint fbBinding;
177
178 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
179
180 ASSERT_EQ (fbBinding, reference.fboName);
181
182 wnd_thread->GetWindowCompositor().SetReferenceFramebuffer(fbBinding, nux::Geometry (0, 0, 300, 200));
183
184 ASSERT_TRUE (wnd_thread->GetWindowCompositor().RestoreReferenceFramebuffer());
185 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
186 ASSERT_EQ (fbBinding, reference.fboName);
187}
188
189TEST_F(TestWindowCompositor, TestRestoreReferenceFramebufferThroughRestoreMain)
190{
191 ReferenceFramebuffer reference;
192 GLint fbBinding;
193
194 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
195
196 ASSERT_EQ (fbBinding, reference.fboName);
197
198 wnd_thread->GetWindowCompositor().SetReferenceFramebuffer(fbBinding, nux::Geometry (0, 0, 300, 200));
199 wnd_thread->GetWindowCompositor().RestoreMainFramebuffer();
200 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
201 ASSERT_EQ (fbBinding, reference.fboName);
202}
203
204TEST_F(TestWindowCompositor, TestNoRestoreReferenceFramebufferDirectIfNoReferenceFramebuffer)
205{
206 GLint fbBinding;
207 ASSERT_FALSE (wnd_thread->GetWindowCompositor().RestoreReferenceFramebuffer());
208 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
209 ASSERT_EQ (fbBinding, 0);
210}
211
212TEST_F(TestWindowCompositor, TestRestoreBackbufferThroughRestoreMain)
213{
214 ReferenceFramebuffer reference;
215 GLint fbBinding;
216
217 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
218
219 ASSERT_EQ (fbBinding, reference.fboName);
220
221 wnd_thread->GetWindowCompositor().RestoreMainFramebuffer();
222 glGetIntegerv (GL_FRAMEBUFFER_BINDING_EXT, &fbBinding);
223 ASSERT_EQ (fbBinding, 0);
224}
225
146TEST_F(TestWindowCompositor, TestSetKeyFocusArea)226TEST_F(TestWindowCompositor, TestSetKeyFocusArea)
147{227{
148 nux::TestView* test_view0 = new nux::TestView();228 nux::TestView* test_view0 = new nux::TestView();

Subscribers

People subscribed via source and target branches