Mir

Merge lp:~albaguirre/mir/fix-1498045 into lp:mir

Proposed by Alberto Aguirre
Status: Merged
Approved by: Alberto Aguirre
Approved revision: no longer in the source branch.
Merged at revision: 2959
Proposed branch: lp:~albaguirre/mir/fix-1498045
Merge into: lp:mir
Diff against target: 72 lines (+26/-9)
1 file modified
src/server/compositor/multi_threaded_compositor.cpp (+26/-9)
To merge this branch: bzr merge lp:~albaguirre/mir/fix-1498045
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Kevin DuBois (community) Approve
Alan Griffiths Approve
Review via email: mp+271844@code.launchpad.net

Commit message

Use a different compositor ID per each display buffer.

When compositing a display sync group that contains multiple display buffers, use a unique compositor ID for each of those buffers instead of single ID. This avoids issues in the RenderingTracker which expects each compositor to have a unique ID.

Description of the change

Use a different compositor ID per each display buffer.

When compositing a display sync group that contains multiple display buffers, use a unique compositor ID for each of those buffers instead of single ID. This avoids issues in the RenderingTracker which expects each compositor to have a unique ID.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

Couldn't we use the address of the DisplayBufferCompositor as an ID instead of calculating offsets from "this"?

I.e. Get rid of comp_count, comp_id and std::get<2>() and just use std::get<1>().get()?

review: Needs Information
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

Yeah that seems better.

Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

LGTM

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

lgtm too. as noted in ~kdub/mir/nbs-multimonitor-guarantee, would help if we sourced id's from the swapping logic (so that logic knows how many ids are around. If IDs were opaque classes, they could even conveniently hide information in the ID!).

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/server/compositor/multi_threaded_compositor.cpp'
--- src/server/compositor/multi_threaded_compositor.cpp 2015-09-16 13:24:54 +0000
+++ src/server/compositor/multi_threaded_compositor.cpp 2015-09-22 14:53:46 +0000
@@ -82,15 +82,15 @@
8282
83 mir::set_thread_name("Mir/Comp");83 mir::set_thread_name("Mir/Comp");
8484
85 auto const comp_id = this;
86 std::vector<std::tuple<mg::DisplayBuffer*, std::unique_ptr<mc::DisplayBufferCompositor>>> compositors;85 std::vector<std::tuple<mg::DisplayBuffer*, std::unique_ptr<mc::DisplayBufferCompositor>>> compositors;
87 group.for_each_display_buffer(86 group.for_each_display_buffer(
88 [this, &compositors, &comp_id](mg::DisplayBuffer& buffer)87 [this, &compositors](mg::DisplayBuffer& buffer)
89 {88 {
90 compositors.emplace_back(89 compositors.emplace_back(
91 std::make_tuple(&buffer, compositor_factory->create_compositor_for(buffer)));90 std::make_tuple(&buffer, compositor_factory->create_compositor_for(buffer)));
9291
93 const auto& r = buffer.view_area();92 auto const& r = buffer.view_area();
93 auto const comp_id = std::get<1>(compositors.back()).get();
94 report->added_display(r.size.width.as_int(), r.size.height.as_int(),94 report->added_display(r.size.width.as_int(), r.size.height.as_int(),
95 r.top_left.x.as_int(), r.top_left.y.as_int(),95 r.top_left.x.as_int(), r.top_left.y.as_int(),
96 CompositorReport::SubCompositorId{comp_id});96 CompositorReport::SubCompositorId{comp_id});
@@ -103,8 +103,15 @@
103 { display_listener->remove_display(buffer.view_area()); });});103 { display_listener->remove_display(buffer.view_area()); });});
104104
105 auto compositor_registration = mir::raii::paired_calls(105 auto compositor_registration = mir::raii::paired_calls(
106 [this,&comp_id]{scene->register_compositor(comp_id);},106 [this,&compositors]
107 [this,&comp_id]{scene->unregister_compositor(comp_id);});107 {
108 for (auto& compositor : compositors)
109 scene->register_compositor(std::get<1>(compositor).get());
110 },
111 [this,&compositors]{
112 for (auto& compositor : compositors)
113 scene->unregister_compositor(std::get<1>(compositor).get());
114 });
108115
109 started.set_value();116 started.set_value();
110117
@@ -130,9 +137,11 @@
130 frames_scheduled--;137 frames_scheduled--;
131 lock.unlock();138 lock.unlock();
132139
133 for (auto& compositor : compositors)140 for (auto& tuple : compositors)
134 std::get<1>(compositor)->composite(scene->scene_elements_for(comp_id));141 {
135142 auto& compositor = std::get<1>(tuple);
143 compositor->composite(scene->scene_elements_for(compositor.get()));
144 }
136 group.post();145 group.post();
137146
138 /*147 /*
@@ -154,7 +163,15 @@
154 * important to re-count number of frames pending, separately163 * important to re-count number of frames pending, separately
155 * to the initial scene_elements_for()...164 * to the initial scene_elements_for()...
156 */165 */
157 int pending = scene->frames_pending(comp_id);166 int pending = 0;
167 for (auto& compositor : compositors)
168 {
169 auto const comp_id = std::get<1>(compositor).get();
170 int pend = scene->frames_pending(comp_id);
171 if (pend > pending)
172 pending = pend;
173 }
174
158 if (pending > frames_scheduled)175 if (pending > frames_scheduled)
159 frames_scheduled = pending;176 frames_scheduled = pending;
160 }177 }

Subscribers

People subscribed via source and target branches