Mir

Merge lp:~alan-griffiths/mir/better-AdorningDisplayBufferCompositor-composite into lp:mir

Proposed by Alan Griffiths
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 3301
Proposed branch: lp:~alan-griffiths/mir/better-AdorningDisplayBufferCompositor-composite
Merge into: lp:mir
Diff against target: 80 lines (+59/-0)
1 file modified
examples/server_example_adorning_compositor.cpp (+59/-0)
To merge this branch: bzr merge lp:~alan-griffiths/mir/better-AdorningDisplayBufferCompositor-composite
Reviewer Review Type Date Requested Status
Kevin DuBois (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Mir CI Bot continuous-integration Approve
Review via email: mp+285392@code.launchpad.net

Commit message

examples: AdorningDisplayBufferCompositor::composite() no long ignores output boundaries and occlusions.

Description of the change

examples: AdorningDisplayBufferCompositor::composite() no long ignored output boundaries and occlusions.

Turns out this is significantly more efficient.

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

PASSED: Continuous integration, rev:3297
https://mir-jenkins.ubuntu.com/job/mir-ci/256/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build/44
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/50
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/46
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/46
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=amd64,compiler=gcc,platform=mesa,release=xenial/46
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=amd64,compiler=gcc,platform=mesa,release=xenial/46/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/46
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/46/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/46
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/46/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=i386,compiler=gcc,platform=mesa,release=xenial/46
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-advanced/arch=i386,compiler=gcc,platform=mesa,release=xenial/46/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://mir-jenkins.ubuntu.com/job/mir-ci/256/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:3297
http://jenkins.qa.ubuntu.com/job/mir-ci/6234/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-android-vivid-i386-build/5834
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-clang-vivid-amd64-build/4741
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-vivid-touch/5790
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-xenial-touch/406
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/558
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-amd64-ci/558/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/558
        deb: http://jenkins.qa.ubuntu.com/job/mir-xenial-i386-ci/558/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5787
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-vivid-armhf/5787/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-touch/8191
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27401
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/402
        deb: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-builder-xenial-armhf/402/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/mir-mediumtests-runner-xenial-touch/256
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/27406

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/mir-ci/6234/rebuild

review: Approve (continuous-integration)
Revision history for this message
Kevin DuBois (kdub) wrote :

lgtm. Its merely in this specific case that the default compositor and the adorning one need the same logic; so its better to dup than to share the internal code and have to publicly support occlusion detection that each compositor should be coming up with itself.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'examples/server_example_adorning_compositor.cpp'
2--- examples/server_example_adorning_compositor.cpp 2016-01-29 08:18:22 +0000
3+++ examples/server_example_adorning_compositor.cpp 2016-02-08 18:08:56 +0000
4@@ -118,10 +118,68 @@
5 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
6 }
7
8+namespace
9+{
10+bool renderable_is_occluded(
11+ mg::Renderable const& renderable,
12+ mir::geometry::Rectangle const& area,
13+ std::vector<mir::geometry::Rectangle>& coverage)
14+{
15+ static glm::mat4 const identity;
16+ static mir::geometry::Rectangle const empty{};
17+
18+ if (renderable.transformation() != identity)
19+ return false; // Weirdly transformed. Assume never occluded.
20+
21+ auto const& window = renderable.screen_position();
22+ auto const& clipped_window = window.intersection_with(area);
23+
24+ if (clipped_window == empty)
25+ return true; // Not in the area; definitely occluded.
26+
27+ bool occluded = false;
28+ for (auto const& r : coverage)
29+ {
30+ if (r.contains(clipped_window))
31+ {
32+ occluded = true;
33+ break;
34+ }
35+ }
36+
37+ if (!occluded && renderable.alpha() == 1.0f && !renderable.shaped())
38+ coverage.push_back(clipped_window);
39+
40+ return occluded;
41+}
42+
43+void remove_occlusions_from(mc::SceneElementSequence& elements, mir::geometry::Rectangle const& area)
44+{
45+ std::vector<mir::geometry::Rectangle> coverage;
46+
47+ auto it = elements.rbegin();
48+ while (it != elements.rend())
49+ {
50+ auto const renderable = (*it)->renderable();
51+ if (renderable_is_occluded(*renderable, area, coverage))
52+ {
53+ (*it)->occluded();
54+ it = mc::SceneElementSequence::reverse_iterator(elements.erase(std::prev(it.base())));
55+ }
56+ else
57+ {
58+ it++;
59+ }
60+ }
61+}
62+}
63+
64 void me::AdorningDisplayBufferCompositor::composite(compositor::SceneElementSequence&& scene_sequence)
65 {
66 report->began_frame(this);
67
68+ remove_occlusions_from(scene_sequence, db.view_area());
69+
70 //note: If what should be drawn is expressible as a SceneElementSequence,
71 // mg::DisplayBuffer::post_renderables_if_optimizable() should be used,
72 // to give the the display hardware a chance at an optimized render of
73@@ -133,6 +191,7 @@
74 auto display_height = db.view_area().size.height.as_float();
75
76 glUseProgram(program.program);
77+ glViewport(0, 0, display_width, display_height);
78 glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
79
80 mg::RenderableList renderable_list;

Subscribers

People subscribed via source and target branches