Mir

Merge lp:~albaguirre/mir/add-mirroring-support into lp:mir

Proposed by Alberto Aguirre
Status: Merged
Approved by: Brandon Schaefer
Approved revision: no longer in the source branch.
Merged at revision: 3430
Proposed branch: lp:~albaguirre/mir/add-mirroring-support
Merge into: lp:mir
Diff against target: 574 lines (+142/-47)
27 files modified
include/common/mir_toolkit/common.h (+8/-0)
include/platform/mir/graphics/display_buffer.h (+11/-0)
include/test/mir/test/doubles/null_display_buffer.h (+1/-0)
playground/demo-shell/demo_compositor.cpp (+1/-1)
src/include/server/mir/compositor/renderer.h (+3/-1)
src/platforms/android/server/display_buffer.cpp (+5/-0)
src/platforms/android/server/display_buffer.h (+1/-0)
src/platforms/mesa/server/kms/display_buffer.cpp (+5/-0)
src/platforms/mesa/server/kms/display_buffer.h (+1/-0)
src/platforms/mesa/server/x11/graphics/display_buffer.cpp (+5/-0)
src/platforms/mesa/server/x11/graphics/display_buffer.h (+1/-0)
src/renderers/gl/renderer.cpp (+56/-21)
src/renderers/gl/renderer.h (+5/-4)
src/server/compositor/default_display_buffer_compositor.cpp (+1/-1)
src/server/compositor/screencast_display_buffer.cpp (+5/-0)
src/server/compositor/screencast_display_buffer.h (+2/-0)
src/server/graphics/nested/display_buffer.cpp (+5/-0)
src/server/graphics/nested/display_buffer.h (+1/-0)
src/server/graphics/offscreen/display_buffer.cpp (+5/-0)
src/server/graphics/offscreen/display_buffer.h (+1/-0)
src/server/server.cpp (+1/-2)
src/server/symbols.map (+1/-1)
tests/include/mir/test/doubles/mock_display_buffer.h (+1/-0)
tests/include/mir/test/doubles/mock_renderer.h (+1/-1)
tests/include/mir/test/doubles/stub_renderer.h (+3/-11)
tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp (+11/-4)
tests/unit-tests/graphics/android/test_display_group.cpp (+1/-0)
To merge this branch: bzr merge lp:~albaguirre/mir/add-mirroring-support
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Brandon Schaefer (community) Approve
Cemil Azizoglu (community) Approve
Review via email: mp+290264@code.launchpad.net

Commit message

Add support for vertical/horizontal mirroring.

Description of the change

Will be useful to screencasting clients on android platforms, where a screencast buffers can be read directly by the client; currently android-platform screencasting clients have to read bottom-up to unflip rendering.

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

FAILED: Continuous integration, rev:3423
https://mir-jenkins.ubuntu.com/job/mir-ci/676/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/628/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/665
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/657
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/657
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/638
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/638/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/638
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/638/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/638/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/638/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/638
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/638/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/638
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/638/artifact/output/*zip*/output.zip

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Continuous integration, rev:3423
https://mir-jenkins.ubuntu.com/job/mir-ci/678/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/630/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/667
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/659
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/659
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/640
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/640/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/640
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/640/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/640/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/640/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/640
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/640/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/640
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/640/artifact/output/*zip*/output.zip

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Alberto Aguirre (albaguirre) wrote :

"01:32:26 Slave went offline during the build
01:32:26 ERROR: Connection was broken: java.io.EOFException
01:32:26 at org.jenkinsci.remoting.nio.NioChannelHub$3.run(NioChannelHub.java:613)
01:32:26 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
01:32:26 at java.util.concurrent.FutureTask.run(FutureTask.java:262)
01:32:26 at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
01:32:26 at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
01:32:26 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
01:32:26 at java.util.concurrent.FutureTask.run(FutureTask.java:262)
01:32:26 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
01:32:26 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
01:32:26 at java.lang.Thread.run(Thread.java:745)"

Umm what's going on with the devices?

Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3423
https://mir-jenkins.ubuntu.com/job/mir-ci/680/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/632
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/669
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/661
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/661
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/642
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/642/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/642
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/642/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/642
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/642/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/642
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/642/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/642
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/642/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Cemil Azizoglu (cemil-azizoglu) wrote :

Ok.

Nit:

s/appplied/applied
83 + // Mirroring should be appplied after orientation

review: Approve
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

+#include <iostream> :)

Also the set_rotation is public, even though the comment state it *shouldnt* be used else where. We are sure this doesnt break ABI for some random reason u8 is using it?

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

The headers for the renderer are not published. But in any case the server ABI has been bumped already.

"+#include <iostream> :)"

Fixed :)

Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

LGTM

review: Approve
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

PASSED: Continuous integration, rev:3425
https://mir-jenkins.ubuntu.com/job/mir-ci/693/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/648
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/685
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/677
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/677
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/658
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/658/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/658
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/658/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/658
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/658/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/658
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/658/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/658
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/658/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://mir-jenkins.ubuntu.com/job/mir-autolanding/147/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/651/console
    None: https://mir-jenkins.ubuntu.com/job/generic-land-mp/159/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/688
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/680
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/680
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/661
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/661/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/661
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/661/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/661/console
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/661/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/661
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/661/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/661
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/661/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Mir CI Bot (mir-ci-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'include/common/mir_toolkit/common.h'
2--- include/common/mir_toolkit/common.h 2016-01-29 08:18:22 +0000
3+++ include/common/mir_toolkit/common.h 2016-03-29 17:48:29 +0000
4@@ -169,6 +169,14 @@
5 mir_orientation_right = 270
6 } MirOrientation;
7
8+/** Mirroring axis relative to the "natural" orientation of the display */
9+typedef enum MirMirrorMode
10+{
11+ mir_mirror_mode_none,
12+ mir_mirror_mode_vertical,
13+ mir_mirror_mode_horizontal
14+} MirMirrorMode;
15+
16 typedef enum MirOrientationMode
17 {
18 mir_orientation_mode_portrait = 1 << 0,
19
20=== modified file 'include/platform/mir/graphics/display_buffer.h'
21--- include/platform/mir/graphics/display_buffer.h 2016-01-29 08:18:22 +0000
22+++ include/platform/mir/graphics/display_buffer.h 2016-03-29 17:48:29 +0000
23@@ -79,6 +79,17 @@
24 */
25 virtual MirOrientation orientation() const = 0;
26
27+ /** Returns the mirror mode of the display buffer relative to orientation
28+ *
29+ * If your DisplayBuffer can do the mirroring itself then this will
30+ * always return mir_mirror_mode_none. If the DisplayBuffer does not
31+ * implement the mirroring itself then this function will return the
32+ * mirror mode the renderer must do after rotation to make things
33+ * "look right".
34+ *
35+ */
36+ virtual MirMirrorMode mirror_mode() const = 0;
37+
38 /** Returns a pointer to the native display buffer object backing this
39 * display buffer.
40 *
41
42=== modified file 'include/test/mir/test/doubles/null_display_buffer.h'
43--- include/test/mir/test/doubles/null_display_buffer.h 2016-01-29 08:18:22 +0000
44+++ include/test/mir/test/doubles/null_display_buffer.h 2016-03-29 17:48:29 +0000
45@@ -34,6 +34,7 @@
46 geometry::Rectangle view_area() const override { return geometry::Rectangle(); }
47 bool post_renderables_if_optimizable(graphics::RenderableList const&) override { return false; }
48 MirOrientation orientation() const override { return mir_orientation_normal; }
49+ MirMirrorMode mirror_mode() const override { return mir_mirror_mode_none; }
50 NativeDisplayBuffer* native_display_buffer() override { return this; }
51 };
52
53
54=== modified file 'playground/demo-shell/demo_compositor.cpp'
55--- playground/demo-shell/demo_compositor.cpp 2016-01-29 08:18:22 +0000
56+++ playground/demo-shell/demo_compositor.cpp 2016-03-29 17:48:29 +0000
57@@ -125,7 +125,7 @@
58 }
59 else
60 {
61- renderer.set_rotation(display_buffer.orientation());
62+ renderer.set_output_transform(display_buffer.orientation(), display_buffer.mirror_mode());
63 renderer.set_viewport(viewport);
64 renderer.begin(std::move(decorated));
65 renderer.render(renderable_list);
66
67=== modified file 'src/include/server/mir/compositor/renderer.h'
68--- src/include/server/mir/compositor/renderer.h 2015-02-22 07:46:25 +0000
69+++ src/include/server/mir/compositor/renderer.h 2016-03-29 17:48:29 +0000
70@@ -21,6 +21,7 @@
71
72 #include "mir/geometry/rectangle.h"
73 #include "mir/graphics/renderable.h"
74+#include <mir_toolkit/common.h>
75
76 namespace mir
77 {
78@@ -35,7 +36,8 @@
79 virtual ~Renderer() = default;
80
81 virtual void set_viewport(geometry::Rectangle const& rect) = 0;
82- virtual void set_rotation(float degrees) = 0;
83+ // Mirroring is to be applied after orientation
84+ virtual void set_output_transform(MirOrientation orientation, MirMirrorMode mode) = 0;
85 virtual void render(graphics::RenderableList const&) const = 0;
86 virtual void suspend() = 0; // called when render() is skipped
87
88
89=== modified file 'src/platforms/android/server/display_buffer.cpp'
90--- src/platforms/android/server/display_buffer.cpp 2016-03-23 06:39:56 +0000
91+++ src/platforms/android/server/display_buffer.cpp 2016-03-29 17:48:29 +0000
92@@ -114,6 +114,11 @@
93 return orientation_;
94 }
95
96+MirMirrorMode mga::DisplayBuffer::mirror_mode() const
97+{
98+ return mir_mirror_mode_none;
99+}
100+
101 void mga::DisplayBuffer::configure(MirPowerMode power_mode, MirOrientation orientation, geom::Displacement offset)
102 {
103 power_mode_ = power_mode;
104
105=== modified file 'src/platforms/android/server/display_buffer.h'
106--- src/platforms/android/server/display_buffer.h 2016-01-29 08:18:22 +0000
107+++ src/platforms/android/server/display_buffer.h 2016-03-29 17:48:29 +0000
108@@ -66,6 +66,7 @@
109 bool post_renderables_if_optimizable(RenderableList const& renderlist) override;
110
111 MirOrientation orientation() const override;
112+ MirMirrorMode mirror_mode() const override;
113 NativeDisplayBuffer* native_display_buffer() override;
114
115 void configure(MirPowerMode power_mode, MirOrientation orientation, geometry::Displacement) override;
116
117=== modified file 'src/platforms/mesa/server/kms/display_buffer.cpp'
118--- src/platforms/mesa/server/kms/display_buffer.cpp 2016-01-29 08:18:22 +0000
119+++ src/platforms/mesa/server/kms/display_buffer.cpp 2016-03-29 17:48:29 +0000
120@@ -186,6 +186,11 @@
121 return rotation;
122 }
123
124+MirMirrorMode mgm::DisplayBuffer::mirror_mode() const
125+{
126+ return mir_mirror_mode_none;
127+}
128+
129 void mgm::DisplayBuffer::set_orientation(MirOrientation const rot, geometry::Rectangle const& a)
130 {
131 rotation = rot;
132
133=== modified file 'src/platforms/mesa/server/kms/display_buffer.h'
134--- src/platforms/mesa/server/kms/display_buffer.h 2016-01-29 08:18:22 +0000
135+++ src/platforms/mesa/server/kms/display_buffer.h 2016-03-29 17:48:29 +0000
136@@ -74,6 +74,7 @@
137 std::chrono::milliseconds recommended_sleep() const override;
138
139 MirOrientation orientation() const override;
140+ MirMirrorMode mirror_mode() const override;
141 NativeDisplayBuffer* native_display_buffer() override;
142
143 void set_orientation(MirOrientation const rot, geometry::Rectangle const& a);
144
145=== modified file 'src/platforms/mesa/server/x11/graphics/display_buffer.cpp'
146--- src/platforms/mesa/server/x11/graphics/display_buffer.cpp 2016-01-29 08:18:22 +0000
147+++ src/platforms/mesa/server/x11/graphics/display_buffer.cpp 2016-03-29 17:48:29 +0000
148@@ -72,6 +72,11 @@
149 return orientation_;
150 }
151
152+MirMirrorMode mgx::DisplayBuffer::mirror_mode() const
153+{
154+ return mir_mirror_mode_none;
155+}
156+
157 void mgx::DisplayBuffer::set_orientation(MirOrientation const new_orientation)
158 {
159 orientation_ = new_orientation;
160
161=== modified file 'src/platforms/mesa/server/x11/graphics/display_buffer.h'
162--- src/platforms/mesa/server/x11/graphics/display_buffer.h 2016-01-29 08:18:22 +0000
163+++ src/platforms/mesa/server/x11/graphics/display_buffer.h 2016-03-29 17:48:29 +0000
164@@ -53,6 +53,7 @@
165 void set_orientation(MirOrientation const new_orientation);
166
167 MirOrientation orientation() const override;
168+ MirMirrorMode mirror_mode() const override;
169 NativeDisplayBuffer* native_display_buffer() override;
170
171 private:
172
173=== modified file 'src/renderers/gl/renderer.cpp'
174--- src/renderers/gl/renderer.cpp 2016-01-29 08:18:22 +0000
175+++ src/renderers/gl/renderer.cpp 2016-03-29 17:48:29 +0000
176@@ -43,6 +43,40 @@
177 namespace mrg = mir::renderer::gl;
178 namespace geom = mir::geometry;
179
180+namespace
181+{
182+float cos_for(MirOrientation orientation)
183+{
184+ switch(orientation)
185+ {
186+ case mir_orientation_normal:
187+ return 1.0f;
188+ case mir_orientation_inverted:
189+ return -1.0f;
190+ case mir_orientation_left:
191+ case mir_orientation_right:
192+ return 0.0f;
193+ default:
194+ BOOST_THROW_EXCEPTION(std::logic_error("Invalid orientation"));
195+ }
196+}
197+
198+float sine_for(MirOrientation orientation)
199+{
200+ switch(orientation)
201+ {
202+ case mir_orientation_left:
203+ return 1.0f;
204+ case mir_orientation_right:
205+ return -1.0f;
206+ case mir_orientation_normal:
207+ case mir_orientation_inverted:
208+ return 0.0f;
209+ default:
210+ BOOST_THROW_EXCEPTION(std::logic_error("Invalid orientation"));
211+ }
212+}
213+}
214 mrg::CurrentRenderTarget::CurrentRenderTarget(mg::DisplayBuffer* display_buffer)
215 : render_target{
216 dynamic_cast<renderer::gl::RenderTarget*>(display_buffer->native_display_buffer())}
217@@ -126,7 +160,8 @@
218 default_program(family.add_program(vshader, default_fshader)),
219 alpha_program(family.add_program(vshader, alpha_fshader)),
220 texture_cache(mgl::DefaultProgramFactory().create_texture_cache()),
221- rotation(NAN) // ensure the first set_rotation succeeds
222+ orientation(mir_orientation_normal),
223+ mirror_mode(mir_mirror_mode_none)
224 {
225 EGLDisplay disp = eglGetCurrentDisplay();
226 if (disp != EGL_NO_DISPLAY)
227@@ -177,7 +212,6 @@
228 glBindBuffer(GL_ARRAY_BUFFER, 0);
229
230 set_viewport(display_buffer.view_area());
231- set_rotation(0.0f);
232 }
233
234 mrg::Renderer::~Renderer()
235@@ -218,7 +252,7 @@
236 prog.last_used_frameno = frameno;
237 glUniform1i(prog.tex_uniform, 0);
238 glUniformMatrix4fv(prog.display_transform_uniform, 1, GL_FALSE,
239- glm::value_ptr(screen_rotation));
240+ glm::value_ptr(display_transform));
241 glUniformMatrix4fv(prog.screen_to_gl_coords_uniform, 1, GL_FALSE,
242 glm::value_ptr(screen_to_gl_coords));
243 }
244@@ -356,27 +390,28 @@
245 viewport = rect;
246 }
247
248-void mrg::Renderer::set_rotation(float degrees)
249+void mrg::Renderer::set_output_transform(MirOrientation new_orientation, MirMirrorMode new_mirror_mode)
250 {
251- if (degrees == rotation)
252+ if (new_orientation == orientation && new_mirror_mode == mirror_mode)
253 return;
254
255- float rad = degrees * M_PI / 180.0f;
256- GLfloat cos = cosf(rad);
257- GLfloat sin = sinf(rad);
258-
259- /*
260- * Transposed rotation matrix. You're reading it as transposed just
261- * because the C language is row-major. OpenGL however will load it as
262- * column-major. This is necessary because glUniformMatrix4fv in ES
263- * does not support the 'transpose' parameter, requiring it be GL_FALSE.
264- */
265- screen_rotation = {cos, sin, 0.0f, 0.0f,
266- -sin, cos, 0.0f, 0.0f,
267- 0.0f, 0.0f, 1.0f, 0.0f,
268- 0.0f, 0.0f, 0.0f, 1.0f};
269-
270- rotation = degrees;
271+ GLfloat const cos = cos_for(new_orientation);
272+ GLfloat const sin = sine_for(new_orientation);
273+
274+ glm::mat2 rotation_matrix(cos, sin, -sin, cos);
275+ glm::mat2 mirror_matrix;
276+ if (new_mirror_mode == mir_mirror_mode_horizontal)
277+ {
278+ mirror_matrix[0][0] = -1.0f;
279+ }
280+ else if (new_mirror_mode == mir_mirror_mode_vertical)
281+ {
282+ mirror_matrix[1][1] = -1.0f;
283+ }
284+
285+ display_transform = glm::mat4(mirror_matrix*rotation_matrix);
286+ orientation = new_orientation;
287+ mirror_mode = new_mirror_mode;
288 }
289
290 void mrg::Renderer::suspend()
291
292=== modified file 'src/renderers/gl/renderer.h'
293--- src/renderers/gl/renderer.h 2016-01-29 08:18:22 +0000
294+++ src/renderers/gl/renderer.h 2016-03-29 17:48:29 +0000
295@@ -63,7 +63,7 @@
296
297 // These are called with a valid GL context:
298 void set_viewport(geometry::Rectangle const& rect) override;
299- void set_rotation(float degrees) override;
300+ void set_output_transform(MirOrientation orientation, MirMirrorMode mode) override;
301 void render(graphics::RenderableList const&) const override;
302
303 // This is called _without_ a GL context:
304@@ -123,10 +123,11 @@
305
306 private:
307 std::unique_ptr<mir::gl::TextureCache> const texture_cache;
308- float rotation;
309+ MirOrientation orientation;
310+ MirMirrorMode mirror_mode;
311 geometry::Rectangle viewport;
312- glm::mat4 screen_to_gl_coords, screen_rotation;
313-
314+ glm::mat4 screen_to_gl_coords;
315+ glm::mat4 display_transform;
316 std::vector<mir::gl::Primitive> mutable primitives;
317 };
318
319
320=== modified file 'src/server/compositor/default_display_buffer_compositor.cpp'
321--- src/server/compositor/default_display_buffer_compositor.cpp 2016-03-23 06:39:56 +0000
322+++ src/server/compositor/default_display_buffer_compositor.cpp 2016-03-29 17:48:29 +0000
323@@ -79,7 +79,7 @@
324 }
325 else
326 {
327- renderer->set_rotation(display_buffer.orientation());
328+ renderer->set_output_transform(display_buffer.orientation(), display_buffer.mirror_mode());
329 renderer->render(renderable_list);
330
331 report->renderables_in_frame(this, renderable_list);
332
333=== modified file 'src/server/compositor/screencast_display_buffer.cpp'
334--- src/server/compositor/screencast_display_buffer.cpp 2016-01-29 08:18:22 +0000
335+++ src/server/compositor/screencast_display_buffer.cpp 2016-03-29 17:48:29 +0000
336@@ -107,6 +107,11 @@
337 return mir_orientation_normal;
338 }
339
340+MirMirrorMode mc::ScreencastDisplayBuffer::mirror_mode() const
341+{
342+ return mir_mirror_mode_none;
343+}
344+
345 mg::NativeDisplayBuffer* mc::ScreencastDisplayBuffer::native_display_buffer()
346 {
347 return this;
348
349=== modified file 'src/server/compositor/screencast_display_buffer.h'
350--- src/server/compositor/screencast_display_buffer.h 2016-01-29 08:18:22 +0000
351+++ src/server/compositor/screencast_display_buffer.h 2016-03-29 17:48:29 +0000
352@@ -69,6 +69,8 @@
353
354 MirOrientation orientation() const override;
355
356+ MirMirrorMode mirror_mode() const override;
357+
358 NativeDisplayBuffer* native_display_buffer() override;
359
360 private:
361
362=== modified file 'src/server/graphics/nested/display_buffer.cpp'
363--- src/server/graphics/nested/display_buffer.cpp 2016-01-29 08:18:22 +0000
364+++ src/server/graphics/nested/display_buffer.cpp 2016-03-29 17:48:29 +0000
365@@ -87,6 +87,11 @@
366 return mir_orientation_normal;
367 }
368
369+MirMirrorMode mgn::detail::DisplayBuffer::mirror_mode() const
370+{
371+ return mir_mirror_mode_none;
372+}
373+
374 mgn::detail::DisplayBuffer::~DisplayBuffer() noexcept
375 {
376 }
377
378=== modified file 'src/server/graphics/nested/display_buffer.h'
379--- src/server/graphics/nested/display_buffer.h 2016-01-29 08:18:22 +0000
380+++ src/server/graphics/nested/display_buffer.h 2016-03-29 17:48:29 +0000
381@@ -61,6 +61,7 @@
382 void release_current() override;
383 void swap_buffers() override;
384 MirOrientation orientation() const override;
385+ MirMirrorMode mirror_mode() const override;
386
387 bool post_renderables_if_optimizable(RenderableList const& renderlist) override;
388
389
390=== modified file 'src/server/graphics/offscreen/display_buffer.cpp'
391--- src/server/graphics/offscreen/display_buffer.cpp 2016-01-29 08:18:22 +0000
392+++ src/server/graphics/offscreen/display_buffer.cpp 2016-03-29 17:48:29 +0000
393@@ -158,6 +158,11 @@
394 return mir_orientation_normal;
395 }
396
397+MirMirrorMode mgo::DisplayBuffer::mirror_mode() const
398+{
399+ return mir_mirror_mode_none;
400+}
401+
402 mg::NativeDisplayBuffer* mgo::DisplayBuffer::native_display_buffer()
403 {
404 return this;
405
406=== modified file 'src/server/graphics/offscreen/display_buffer.h'
407--- src/server/graphics/offscreen/display_buffer.h 2016-01-29 08:18:22 +0000
408+++ src/server/graphics/offscreen/display_buffer.h 2016-03-29 17:48:29 +0000
409@@ -71,6 +71,7 @@
410 void swap_buffers() override;
411
412 MirOrientation orientation() const override;
413+ MirMirrorMode mirror_mode() const override;
414
415 bool post_renderables_if_optimizable(RenderableList const& renderlist) override;
416
417
418=== modified file 'src/server/server.cpp'
419--- src/server/server.cpp 2016-01-29 08:18:22 +0000
420+++ src/server/server.cpp 2016-03-29 17:48:29 +0000
421@@ -177,8 +177,7 @@
422 }
423
424 void set_viewport(mir::geometry::Rectangle const&) override {}
425-
426- void set_rotation(float) override {}
427+ void set_output_transform(MirOrientation, MirMirrorMode) override {}
428
429 void render(mir::graphics::RenderableList const& renderables) const override
430 {
431
432=== modified file 'src/server/symbols.map'
433--- src/server/symbols.map 2016-03-26 00:19:29 +0000
434+++ src/server/symbols.map 2016-03-29 17:48:29 +0000
435@@ -642,7 +642,7 @@
436 mir::renderer::gl::Renderer::Program::Program*;
437 mir::renderer::gl::Renderer::draw*;
438 mir::renderer::gl::Renderer::render*;
439- mir::renderer::gl::Renderer::set_rotation*;
440+ mir::renderer::gl::Renderer::set_output_transform*;
441 mir::renderer::gl::Renderer::set_viewport*;
442 mir::renderer::gl::Renderer::suspend*;
443 mir::renderer::gl::Renderer::tessellate*;
444
445=== modified file 'tests/include/mir/test/doubles/mock_display_buffer.h'
446--- tests/include/mir/test/doubles/mock_display_buffer.h 2016-01-29 08:18:22 +0000
447+++ tests/include/mir/test/doubles/mock_display_buffer.h 2016-03-29 17:48:29 +0000
448@@ -45,6 +45,7 @@
449 MOCK_CONST_METHOD0(view_area, geometry::Rectangle());
450 MOCK_METHOD1(post_renderables_if_optimizable, bool(graphics::RenderableList const&));
451 MOCK_CONST_METHOD0(orientation, MirOrientation());
452+ MOCK_CONST_METHOD0(mirror_mode, MirMirrorMode());
453 MOCK_METHOD0(native_display_buffer, graphics::NativeDisplayBuffer*());
454 };
455
456
457=== modified file 'tests/include/mir/test/doubles/mock_renderer.h'
458--- tests/include/mir/test/doubles/mock_renderer.h 2015-02-22 07:46:25 +0000
459+++ tests/include/mir/test/doubles/mock_renderer.h 2016-03-29 17:48:29 +0000
460@@ -32,7 +32,7 @@
461 struct MockRenderer : public compositor::Renderer
462 {
463 MOCK_METHOD1(set_viewport, void(geometry::Rectangle const&));
464- MOCK_METHOD1(set_rotation, void(float));
465+ MOCK_METHOD2(set_output_transform, void(MirOrientation, MirMirrorMode));
466 MOCK_CONST_METHOD1(render, void(graphics::RenderableList const&));
467 MOCK_METHOD0(suspend, void());
468
469
470=== modified file 'tests/include/mir/test/doubles/stub_renderer.h'
471--- tests/include/mir/test/doubles/stub_renderer.h 2015-06-18 02:46:16 +0000
472+++ tests/include/mir/test/doubles/stub_renderer.h 2016-03-29 17:48:29 +0000
473@@ -33,13 +33,9 @@
474 class StubRenderer : public compositor::Renderer
475 {
476 public:
477- void set_viewport(geometry::Rectangle const&) override
478- {
479- }
480-
481- void set_rotation(float) override
482- {
483- }
484+ void set_viewport(geometry::Rectangle const&) override {}
485+ void set_output_transform(MirOrientation, MirMirrorMode) override {}
486+ void suspend() override {}
487
488 void render(graphics::RenderableList const& renderables) const override
489 {
490@@ -48,10 +44,6 @@
491 // Yield to reduce runtime under valgrind
492 std::this_thread::yield();
493 }
494-
495- void suspend() override
496- {
497- }
498 };
499
500
501
502=== modified file 'tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp'
503--- tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2016-01-29 08:18:22 +0000
504+++ tests/unit-tests/compositor/test_default_display_buffer_compositor.cpp 2016-03-29 17:48:29 +0000
505@@ -100,6 +100,8 @@
506 using namespace testing;
507 ON_CALL(display_buffer, orientation())
508 .WillByDefault(Return(mir_orientation_normal));
509+ ON_CALL(display_buffer, mirror_mode())
510+ .WillByDefault(Return(mir_mirror_mode_none));
511 ON_CALL(display_buffer, view_area())
512 .WillByDefault(Return(screen));
513 ON_CALL(display_buffer, post_renderables_if_optimizable(_))
514@@ -195,9 +197,10 @@
515 EXPECT_CALL(mock_renderer, suspend())
516 .Times(0);
517 EXPECT_CALL(display_buffer, orientation())
518- .InSequence(render_seq)
519 .WillOnce(Return(mir_orientation_normal));
520- EXPECT_CALL(mock_renderer, set_rotation(_))
521+ EXPECT_CALL(display_buffer, mirror_mode())
522+ .WillOnce(Return(mir_mirror_mode_none));
523+ EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
524 .InSequence(render_seq);
525 EXPECT_CALL(mock_renderer, render(ContainerEq(mg::RenderableList{big, small})))
526 .InSequence(render_seq);
527@@ -220,6 +223,8 @@
528 .WillByDefault(Return(screen));
529 ON_CALL(display_buffer, orientation())
530 .WillByDefault(Return(mir_orientation_normal));
531+ ON_CALL(display_buffer, mirror_mode())
532+ .WillByDefault(Return(mir_mirror_mode_none));
533
534 Sequence seq;
535 EXPECT_CALL(display_buffer, post_renderables_if_optimizable(_))
536@@ -228,7 +233,7 @@
537
538 EXPECT_CALL(display_buffer, orientation())
539 .InSequence(seq);
540- EXPECT_CALL(mock_renderer, set_rotation(mir_orientation_normal))
541+ EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
542 .InSequence(seq);
543 EXPECT_CALL(mock_renderer, render(IsEmpty()))
544 .InSequence(seq);
545@@ -243,7 +248,7 @@
546 .WillOnce(Return(false));
547 EXPECT_CALL(display_buffer, orientation())
548 .InSequence(seq);
549- EXPECT_CALL(mock_renderer, set_rotation(mir_orientation_normal))
550+ EXPECT_CALL(mock_renderer, set_output_transform(mir_orientation_normal, mir_mirror_mode_none))
551 .InSequence(seq);
552 EXPECT_CALL(mock_renderer, render(IsEmpty()))
553 .InSequence(seq);
554@@ -267,6 +272,8 @@
555 .WillRepeatedly(Return(screen));
556 EXPECT_CALL(display_buffer, orientation())
557 .WillOnce(Return(mir_orientation_normal));
558+ EXPECT_CALL(display_buffer, mirror_mode())
559+ .WillOnce(Return(mir_mirror_mode_none));
560 EXPECT_CALL(display_buffer, post_renderables_if_optimizable(_))
561 .WillRepeatedly(Return(false));
562
563
564=== modified file 'tests/unit-tests/graphics/android/test_display_group.cpp'
565--- tests/unit-tests/graphics/android/test_display_group.cpp 2016-01-29 08:18:22 +0000
566+++ tests/unit-tests/graphics/android/test_display_group.cpp 2016-03-29 17:48:29 +0000
567@@ -37,6 +37,7 @@
568 mir::geometry::Rectangle view_area() const override { return {}; }
569 bool post_renderables_if_optimizable(mg::RenderableList const&) override { return false; }
570 MirOrientation orientation() const override { return mir_orientation_normal; }
571+ MirMirrorMode mirror_mode() const override { return mir_mirror_mode_none; }
572 mg::NativeDisplayBuffer* native_display_buffer() override { return this; }
573 void configure(MirPowerMode, MirOrientation, mir::geometry::Displacement) override {}
574 mga::DisplayContents contents() override

Subscribers

People subscribed via source and target branches