Mir

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

Proposed by Alberto Aguirre
Status: Merged
Approved by: Alberto Aguirre
Approved revision: no longer in the source branch.
Merged at revision: 1866
Proposed branch: lp:~albaguirre/mir/fix-1359406
Merge into: lp:mir
Diff against target: 229 lines (+73/-27)
6 files modified
common-ABI-sha1sums (+1/-1)
include/shared/mir/graphics/android/mir_native_window.h (+4/-1)
platform-ABI-sha1sums (+1/-1)
server-ABI-sha1sums (+1/-1)
src/shared/graphics/android/mir_native_window.cpp (+29/-9)
tests/unit-tests/client/android/test_android_native_window.cpp (+37/-14)
To merge this branch: bzr merge lp:~albaguirre/mir/fix-1359406
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
Alan Griffiths Approve
Alexandros Frantzis (community) Approve
Kevin DuBois (community) Approve
Daniel van Vugt Approve
Review via email: mp+231647@code.launchpad.net

Commit message

android: do not post driver cancelled buffers (LP: #1359406)

Description of the change

android: do not post driver cancelled buffers (LP: #1359406)

This is the least obtrusive change that I could think of since the rest of the stack does not support the concept of returning a buffer without posting it.

To post a comment you must log in.
Revision history for this message
Alberto Aguirre (albaguirre) :
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Seems OK.

This may trigger spurious ABI breaks: mir_native_window.h
However my analysis as recently as last night tells me that header file is not used either directly or indirectly by external projects. So not really an ABI break.

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

Needs Info:
A bit of a different memory, but I tried something similar when I was spiking n10 support a long time ago, and remember some problem popping up. What devices were tested?

The 'proper' fix in my estimation involves modifying the protocol to support multiple client buffers or to indicate a 'nonrendered buffer'.

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

> A bit of a different memory, but I tried something similar when I was spiking

A bit of a _distant_ memory

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

@Kevin,

I tested n4, n10, n7 and krillin.

Note only the devices with mali drivers call cancelBuffer (n10, krillin) and consequently the ones that were showed blank frames when an app is opening up (so one sees a flash of whatever content was behind - usually the dash).

Yes the ideal proper fix is for the stack to understand the concept of clients wanting to drop buffers completely without them being composited/displayed but I'm trying to keep the public ABI from breaking.

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

okay, lgtm given the avoid-abi-break constraint. Having the android platform handle cancel buffers will be an easier task once the next_buffer rpc call is deprecated.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Alexandros Frantzis (afrantzis) wrote :

Looks sensible.

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

Not tested across devices, but looks sane.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
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
1=== modified file 'common-ABI-sha1sums'
2--- common-ABI-sha1sums 2014-08-14 05:44:09 +0000
3+++ common-ABI-sha1sums 2014-08-26 22:48:11 +0000
4@@ -14,7 +14,7 @@
5 76d576231de039e25f4cf30829504552dcb9fc53 include/shared/mir/graphics/android/android_driver_interpreter.h
6 c02a1e68d5a8ccfd8710440e166c9e32bc974f1e include/shared/mir/graphics/android/android_native_buffer.h
7 05e7b043ccf49582a78e880967b3bc1f3512e010 include/shared/mir/graphics/android/fence.h
8-9956c408e05c5785143c491f868d8be5c17ea40c include/shared/mir/graphics/android/mir_native_window.h
9+0168b68dea12355c22cd39fbfc50bca0e21fd6e5 include/shared/mir/graphics/android/mir_native_window.h
10 8f6d9dc681f3e0d212e6a74f9170ea7b3eb2607f include/shared/mir/graphics/android/native_buffer.h
11 424d1ff5b9bc299fc43f0afe961c4dafc3227992 include/shared/mir/graphics/android/sync_fence.h
12 e1be9faee8b844ca2ce617f8fd82c9ee08d56bed include/shared/mir/graphics/native_buffer.h
13
14=== modified file 'include/shared/mir/graphics/android/mir_native_window.h'
15--- include/shared/mir/graphics/android/mir_native_window.h 2014-03-06 06:05:17 +0000
16+++ include/shared/mir/graphics/android/mir_native_window.h 2014-08-26 22:48:11 +0000
17@@ -22,6 +22,7 @@
18 #include <system/window.h>
19 #include <cstdarg>
20 #include <memory>
21+#include <vector>
22
23 namespace mir
24 {
25@@ -30,6 +31,7 @@
26 namespace android
27 {
28 class AndroidDriverInterpreter;
29+class SyncFileOps;
30
31 class MirNativeWindow : public ANativeWindow
32 {
33@@ -44,8 +46,9 @@
34 int cancelBuffer(struct ANativeWindowBuffer* buffer, int fence);
35 int setSwapInterval(int interval);
36 private:
37-
38 std::shared_ptr<AndroidDriverInterpreter> const driver_interpreter;
39+ std::shared_ptr<SyncFileOps> const sync_ops;
40+ std::vector<struct ANativeWindowBuffer*> cancelled_buffers;
41 };
42
43 }
44
45=== modified file 'platform-ABI-sha1sums'
46--- platform-ABI-sha1sums 2014-08-20 11:58:29 +0000
47+++ platform-ABI-sha1sums 2014-08-26 22:48:11 +0000
48@@ -58,7 +58,7 @@
49 76d576231de039e25f4cf30829504552dcb9fc53 include/shared/mir/graphics/android/android_driver_interpreter.h
50 c02a1e68d5a8ccfd8710440e166c9e32bc974f1e include/shared/mir/graphics/android/android_native_buffer.h
51 05e7b043ccf49582a78e880967b3bc1f3512e010 include/shared/mir/graphics/android/fence.h
52-9956c408e05c5785143c491f868d8be5c17ea40c include/shared/mir/graphics/android/mir_native_window.h
53+0168b68dea12355c22cd39fbfc50bca0e21fd6e5 include/shared/mir/graphics/android/mir_native_window.h
54 8f6d9dc681f3e0d212e6a74f9170ea7b3eb2607f include/shared/mir/graphics/android/native_buffer.h
55 424d1ff5b9bc299fc43f0afe961c4dafc3227992 include/shared/mir/graphics/android/sync_fence.h
56 e1be9faee8b844ca2ce617f8fd82c9ee08d56bed include/shared/mir/graphics/native_buffer.h
57
58=== modified file 'server-ABI-sha1sums'
59--- server-ABI-sha1sums 2014-08-14 20:14:12 +0000
60+++ server-ABI-sha1sums 2014-08-26 22:48:11 +0000
61@@ -167,7 +167,7 @@
62 76d576231de039e25f4cf30829504552dcb9fc53 include/shared/mir/graphics/android/android_driver_interpreter.h
63 c02a1e68d5a8ccfd8710440e166c9e32bc974f1e include/shared/mir/graphics/android/android_native_buffer.h
64 05e7b043ccf49582a78e880967b3bc1f3512e010 include/shared/mir/graphics/android/fence.h
65-9956c408e05c5785143c491f868d8be5c17ea40c include/shared/mir/graphics/android/mir_native_window.h
66+0168b68dea12355c22cd39fbfc50bca0e21fd6e5 include/shared/mir/graphics/android/mir_native_window.h
67 8f6d9dc681f3e0d212e6a74f9170ea7b3eb2607f include/shared/mir/graphics/android/native_buffer.h
68 424d1ff5b9bc299fc43f0afe961c4dafc3227992 include/shared/mir/graphics/android/sync_fence.h
69 e1be9faee8b844ca2ce617f8fd82c9ee08d56bed include/shared/mir/graphics/native_buffer.h
70
71=== modified file 'src/shared/graphics/android/mir_native_window.cpp'
72--- src/shared/graphics/android/mir_native_window.cpp 2014-08-05 22:36:37 +0000
73+++ src/shared/graphics/android/mir_native_window.cpp 2014-08-26 22:48:11 +0000
74@@ -132,7 +132,7 @@
75 }
76
77 mga::MirNativeWindow::MirNativeWindow(std::shared_ptr<AndroidDriverInterpreter> const& interpreter)
78- : driver_interpreter(interpreter)
79+ : driver_interpreter(interpreter), sync_ops(std::make_shared<mga::RealSyncFileOps>())
80 {
81 ANativeWindow::query = &query_static;
82 ANativeWindow::perform = &perform_static;
83@@ -168,11 +168,20 @@
84 int mga::MirNativeWindow::dequeueBuffer(struct ANativeWindowBuffer** buffer_to_driver, int* fence_fd)
85 try
86 {
87- auto buffer = driver_interpreter->driver_requests_buffer();
88+ if (cancelled_buffers.size() != 0)
89+ {
90+ *buffer_to_driver = cancelled_buffers.back();
91+ cancelled_buffers.pop_back();
92+ *fence_fd = -1; //no fence associated with cancelled buffers
93+ }
94+ else
95+ {
96+ auto buffer = driver_interpreter->driver_requests_buffer();
97
98- //EGL driver is responsible for closing this native handle
99- *fence_fd = buffer->copy_fence();
100- *buffer_to_driver = buffer->anwb();
101+ //EGL driver is responsible for closing this native handle
102+ *fence_fd = buffer->copy_fence();
103+ *buffer_to_driver = buffer->anwb();
104+ }
105 return 0;
106 }
107 catch (std::exception const& e)
108@@ -184,9 +193,17 @@
109 int mga::MirNativeWindow::dequeueBufferAndWait(struct ANativeWindowBuffer** buffer_to_driver)
110 try
111 {
112- auto buffer = driver_interpreter->driver_requests_buffer();
113- *buffer_to_driver = buffer->anwb();
114- buffer->ensure_available_for(mga::BufferAccess::write);
115+ if (cancelled_buffers.size() != 0)
116+ {
117+ *buffer_to_driver = cancelled_buffers.back();
118+ cancelled_buffers.pop_back();
119+ }
120+ else
121+ {
122+ auto buffer = driver_interpreter->driver_requests_buffer();
123+ *buffer_to_driver = buffer->anwb();
124+ buffer->ensure_available_for(mga::BufferAccess::write);
125+ }
126 return 0;
127 }
128 catch (std::exception const& e)
129@@ -210,7 +227,10 @@
130 int mga::MirNativeWindow::cancelBuffer(struct ANativeWindowBuffer* buffer, int fence)
131 try
132 {
133- driver_interpreter->driver_returns_buffer(buffer, fence);
134+ mga::SyncFence sync_fence(sync_ops, mir::Fd(fence));
135+ sync_fence.wait();
136+
137+ cancelled_buffers.push_back(buffer);
138 return 0;
139 }
140 catch (std::exception const& e)
141
142=== modified file 'tests/unit-tests/client/android/test_android_native_window.cpp'
143--- tests/unit-tests/client/android/test_android_native_window.cpp 2014-08-05 22:36:37 +0000
144+++ tests/unit-tests/client/android/test_android_native_window.cpp 2014-08-26 22:48:11 +0000
145@@ -152,6 +152,24 @@
146 EXPECT_EQ(fake_fd, fence_fd);
147 }
148
149+TEST_F(AndroidNativeWindowTest, native_window_dequeue_returns_previously_cancelled_buffer)
150+{
151+ using namespace testing;
152+ ANativeWindowBuffer buffer;
153+ int fence_fd = 33;
154+
155+ auto rc = window.cancelBuffer(&window, &buffer, fence_fd);
156+ EXPECT_EQ(0, rc);
157+
158+ EXPECT_CALL(*mock_driver_interpreter, driver_requests_buffer())
159+ .Times(0);
160+
161+ ANativeWindowBuffer* dequeued_buffer;
162+ ANativeWindowBuffer* expected_buffer = &buffer;
163+ window.dequeueBuffer(&window, &dequeued_buffer, &fence_fd);
164+ EXPECT_EQ(dequeued_buffer, expected_buffer);
165+}
166+
167 TEST_F(AndroidNativeWindowTest, native_window_dequeue_deprecated_hook_callable)
168 {
169 ANativeWindowBuffer* tmp;
170@@ -179,6 +197,23 @@
171 EXPECT_EQ(mock_buffer->anwb(), returned_buffer);
172 }
173
174+TEST_F(AndroidNativeWindowTest, native_window_dequeue_deprecated_returns_previously_cancelled_buffer)
175+{
176+ using namespace testing;
177+ ANativeWindowBuffer buffer;
178+
179+ auto rc = window.cancelBuffer_DEPRECATED(&window, &buffer);
180+ EXPECT_EQ(0, rc);
181+
182+ EXPECT_CALL(*mock_driver_interpreter, driver_requests_buffer())
183+ .Times(0);
184+
185+ ANativeWindowBuffer* dequeued_buffer;
186+ ANativeWindowBuffer* expected_buffer = &buffer;
187+ window.dequeueBuffer_DEPRECATED(&window, &dequeued_buffer);
188+ EXPECT_EQ(dequeued_buffer, expected_buffer);
189+}
190+
191 /* queue hook tests */
192 TEST_F(AndroidNativeWindowTest, native_window_queue_hook_callable)
193 {
194@@ -268,14 +303,14 @@
195 EXPECT_EQ(0, ret);
196 }
197
198-TEST_F(AndroidNativeWindowTest, native_window_cancel_hook_behavior)
199+TEST_F(AndroidNativeWindowTest, native_window_cancel_hook_does_not_call_driver_interpreter)
200 {
201 using namespace testing;
202 ANativeWindowBuffer buffer;
203 int fence_fd = 33;
204
205 EXPECT_CALL(*mock_driver_interpreter, driver_returns_buffer(&buffer, _))
206- .Times(1);
207+ .Times(0);
208
209 auto rc = window.cancelBuffer(&window, &buffer, fence_fd);
210 EXPECT_EQ(0, rc);
211@@ -305,18 +340,6 @@
212 EXPECT_THAT(window.queueBuffer_DEPRECATED(&window, nullptr), Eq(failure_code));
213 }
214
215-TEST_F(AndroidNativeWindowTest, returns_error_on_cancel_buffer_failure)
216-{
217- using namespace testing;
218-
219- EXPECT_CALL(*mock_driver_interpreter, driver_returns_buffer(_, _))
220- .WillOnce(Throw(std::runtime_error("")))
221- .WillOnce(Throw(std::runtime_error("")));
222-
223- EXPECT_THAT(window.cancelBuffer(&window, nullptr, 0), Eq(failure_code));
224- EXPECT_THAT(window.cancelBuffer_DEPRECATED(&window, nullptr), Eq(failure_code));
225-}
226-
227 TEST_F(AndroidNativeWindowTest, returns_error_on_query_failure)
228 {
229 using namespace testing;

Subscribers

People subscribed via source and target branches