Mir

Merge lp:~kdub/mir/require-streams-when-creating-surface into lp:mir

Proposed by Kevin DuBois
Status: Merged
Approved by: Alan Griffiths
Approved revision: no longer in the source branch.
Merged at revision: 3453
Proposed branch: lp:~kdub/mir/require-streams-when-creating-surface
Merge into: lp:mir
Prerequisite: lp:~kdub/mir/deprecate-next-buffer
Diff against target: 1228 lines (+343/-184)
16 files modified
examples/server_example_canonical_window_manager.cpp (+9/-3)
examples/server_example_window_management_info.h (+1/-0)
include/server/mir/scene/surface_creation_parameters.h (+1/-0)
src/client/mir_connection.cpp (+17/-1)
src/protobuf/mir_protobuf.proto (+1/-0)
src/server/frontend/buffer_stream_tracker.cpp (+24/-0)
src/server/frontend/buffer_stream_tracker.h (+7/-0)
src/server/frontend/session_mediator.cpp (+66/-18)
src/server/scene/application_session.cpp (+31/-27)
src/server/scene/application_session.h (+2/-0)
tests/integration-tests/session_management.cpp (+7/-2)
tests/integration-tests/test_session.cpp (+5/-1)
tests/unit-tests/frontend/test_session_mediator.cpp (+40/-56)
tests/unit-tests/scene/test_abstract_shell.cpp (+47/-21)
tests/unit-tests/scene/test_application_session.cpp (+80/-54)
tests/unit-tests/scene/test_session_manager.cpp (+5/-1)
To merge this branch: bzr merge lp:~kdub/mir/require-streams-when-creating-surface
Reviewer Review Type Date Requested Status
Mir CI Bot continuous-integration Approve
Andreas Pokorny (community) Approve
Cemil Azizoglu (community) Approve
Brandon Schaefer (community) Approve
Review via email: mp+290484@code.launchpad.net

Commit message

shell: no longer auto-create a 'default stream' on behalf of user creating a surface without specifying a stream. Session::create_surface() was creating two resources, and we were kludging around this by casting the mf::SurfaceId it returns to a mf::BufferStreamId, and assuming that the stream was created.

Now, BufferStreamId and SurfaceId are independent id sequences (whereas previously, every SurfaceId was a BufferStreamId, but not vice-versa)

We got into the situation where create_surface() creates a stream and a surface when we split the stream concept from the surface concept a long time ago. Now that we want to create more elaborate stream configurations at startup (see lp: #1563278), we should just have the user tell us what they want via SurfaceCreationParameters instead of guessing and trying to compensate with an automatically created stream.

Its currently necessary to have some content with a Surface (due to existing interfaces that need changing), but soon enough we could probably have content-less surfaces, if that's useful anywhere...

Downstreams (usc/qtmir) are not using Session to create their own surfaces apart from actual ipc clients, so although its an ABI break, they should be compatible.

Description of the change

shell: no longer auto-create a 'default stream' on behalf of user creating a surface without specifying a stream. Session::create_surface() was creating two resources, and we were kludging around this by casting the mf::SurfaceId it returns to a mf::BufferStreamId, and assuming that the stream was created.

We got into the situation where create_surface() creates a stream and a surface when we split the stream concept from the surface concept a long time ago. Now that we want to create more elaborate stream configurations at startup (see lp: #1563278), we should just have the user tell us what they want via SurfaceCreationParameters instead of guessing and trying to compensate with an automatically created stream.

Its currently necessary to have some content with a Surface (due to existing interfaces that need changing), but soon enough we could probably have content-less surfaces, if that's useful anywhere...

Downstreams (usc/qtmir) are not using Session to create their own surfaces apart from actual ipc clients, so although its an ABI break, they should be compatible.

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

FAILED: Continuous integration, rev:3440
https://mir-jenkins.ubuntu.com/job/mir-ci/701/
Executed test runs:

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

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

conflict

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

PASSED: Continuous integration, rev:3443
https://mir-jenkins.ubuntu.com/job/mir-ci/734/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/701
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/738
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/729
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/729
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/710
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/710/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/710
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/710/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/710
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/710/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/710
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/710/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/710
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/710/artifact/output/*zip*/output.zip

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

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

Nit. Couldnt a_surface() take a mir::graphics::BufferProperties? Since we use all the same arguments in both. Such as of_buffer_properties(...) or something... though either way we have to use those values twice :)
+ auto params = ms::a_surface()

Dont see this namespace used in the header.
+class Session;

Shared ptr are defaulted to a nullptr, no need to set it.
+ std::shared_ptr<mf::BufferStream> legacy_stream = nullptr;

// /usr/include/c++/5/tr1/shared_ptr.h:546
      __shared_ptr()
      : _M_ptr(0), _M_refcount() // never throws
      { }

This could be a bit simpler, as you have right now:
!(A || (B && C))
This could turn into:
!A && (B || C)

(wanted to do a truth table just to check haha: http://paste.ubuntu.com/15635820/)

Not super sure if its *simpler* just reads a bit easier :)

+ if (!((the_params.content_id.is_set()) ||
+ (the_params.streams.is_set() && the_params.streams.value().size() > 0

Would turn into:

if (!the_params.content_id.is_set() && (the_params.streams.is_set() || the_params.streams.value().size() > 0))

Up to you :)

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

> Nit. Couldnt a_surface() take a mir::graphics::BufferProperties? Since we use
> all the same arguments in both. Such as of_buffer_properties(...) or
> something... though either way we have to use those values twice :)
> + auto params = ms::a_surface()
>

Surfaces don't really have pixel_format and usage, these are really just properties of buffers. (although surfaces do have pf/usage fields still from un-cleaned-up cruft).

> Dont see this namespace used in the header.
> +class Session;
This is needed in the remove_content_for() function added to the header

> Shared ptr are defaulted to a nullptr, no need to set it.
> + std::shared_ptr<mf::BufferStream> legacy_stream = nullptr;
>
> // /usr/include/c++/5/tr1/shared_ptr.h:546
> __shared_ptr()
> : _M_ptr(0), _M_refcount() // never throws
> { }

fixed

> This could be a bit simpler, as you have right now:
> !(A || (B && C))
> This could turn into:
> !A && (B || C)
>
> (wanted to do a truth table just to check haha:
> http://paste.ubuntu.com/15635820/)
>
> Not super sure if its *simpler* just reads a bit easier :)
>

Line 6 in the pastebin isn't correct. (the original expression is not computed correctly, the new expression is)

The expression could be reduced I suppose:
!(A || (B && C))
to
!A && !(B && C)
to
!A && (!B || !C)

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

Opps youre right! (Dang truth table :).

LGTM

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

The name added_streams is a bit confusing since streams may later be removed as well. How about just calling it 'streams'.
180 + std::unordered_map<SurfaceId, frontend::BufferStreamId> added_streams;
-------------------

We should just call them add_buffer_stream_for() and remove_buffer_stream_for() instead of
170 + void add_content_for(frontend::SurfaceId id, frontend::BufferStreamId);
171 + void remove_content_for(frontend::SurfaceId, frontend::Session&);

review: Needs Fixing
Revision history for this message
Andreas Pokorny (andreas-pokorny) wrote :

Hm. Why does the BufferStream Tracker care about the frontend::Session in the remove_content_for method. It seems unbalanced in comparison to the add call. Correct me if I got the wrong picture..

Otherwise it looks fine

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

PASSED: Continuous integration, rev:3445
https://mir-jenkins.ubuntu.com/job/mir-ci/809/
Executed test runs:
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-mir/808
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/845
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/836
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/817
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/817/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/817
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/817/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/817
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/817/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/817
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/817/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/817
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/817/artifact/output/*zip*/output.zip

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

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

Ok

review: Approve
Revision history for this message
Andreas Pokorny (andreas-pokorny) wrote :

Ok my needs info is gone ..

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

noticed that (for consistency's sake) we should throw when trying to delete a bufferstream that doesnt exist. will fix in this MP before TA.

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

FAILED: Continuous integration, rev:3447
https://mir-jenkins.ubuntu.com/job/mir-ci/816/
Executed test runs:
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-mir/818/console
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-0-fetch/855
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=vivid+overlay/846
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-1-sourcepkg/release=xenial/846
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/828
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=clang,platform=mesa,release=vivid+overlay/828/artifact/output/*zip*/output.zip
    SUCCESS: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/828
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=amd64,compiler=gcc,platform=mesa,release=xenial/828/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/828
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=cross-armhf,compiler=gcc,platform=android,release=vivid+overlay/828/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/828
        deb: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=android,release=vivid+overlay/828/artifact/output/*zip*/output.zip
    FAILURE: https://mir-jenkins.ubuntu.com/job/build-2-binpkg-mir/arch=i386,compiler=gcc,platform=mesa,release=xenial/828/console

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

review: Needs Fixing (continuous-integration)
Revision history for this message
Alan Griffiths (alan-griffiths) wrote :

I've a feeling this has been seen before, but I can't find the bug...

14:41:46 11: /��BUILDDIR��/mir-0.22.0+xenial846bzr3447/tests/acceptance-tests/test_nested_mir.cpp:1076: Failure
14:41:46 11: Value of: client_config_changed.raised()
14:41:46 11: Actual: false
14:41:46 11: Expected: true
14:41:46 11: [2016-04-12 14:41:46.324381] mirserver: Stopping
14:41:46 11: [2016-04-12 14:41:46.602429] mirserver: Stopping
14:41:46 11: [ FAILED ] NestedServer.when_monitor_plugged_in_client_is_notified_of_new_display_configuration (4453 ms)

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
=== modified file 'examples/server_example_canonical_window_manager.cpp'
--- examples/server_example_canonical_window_manager.cpp 2016-04-05 11:59:12 +0000
+++ examples/server_example_canonical_window_manager.cpp 2016-04-12 14:23:09 +0000
@@ -251,13 +251,17 @@
251 return;251 return;
252252
253 auto format = mir_pixel_format_xrgb_8888;253 auto format = mir_pixel_format_xrgb_8888;
254 ms::SurfaceCreationParameters params;254 mir::graphics::BufferProperties properties(titlebar_size_for_window(surface->size()),
255 params.of_size(titlebar_size_for_window(surface->size()))255 format, mir::graphics::BufferUsage::software);
256 auto stream_id = session->create_buffer_stream(properties);
257 auto params = ms::a_surface()
258 .of_size(titlebar_size_for_window(surface->size()))
256 .of_name("decoration")259 .of_name("decoration")
257 .of_pixel_format(format)260 .of_pixel_format(format)
258 .of_buffer_usage(mir::graphics::BufferUsage::software)261 .of_buffer_usage(mir::graphics::BufferUsage::software)
259 .of_position(titlebar_position_for_window(surface->top_left()))262 .of_position(titlebar_position_for_window(surface->top_left()))
260 .of_type(mir_surface_type_gloss);263 .of_type(mir_surface_type_gloss)
264 .with_buffer_stream(stream_id);
261 auto id = build(session, params);265 auto id = build(session, params);
262 auto titlebar = session->surface(id);266 auto titlebar = session->surface(id);
263 titlebar->set_alpha(0.9);267 titlebar->set_alpha(0.9);
@@ -265,6 +269,7 @@
265 auto& surface_info = tools->info_for(surface);269 auto& surface_info = tools->info_for(surface);
266 surface_info.titlebar = titlebar;270 surface_info.titlebar = titlebar;
267 surface_info.titlebar_id = id;271 surface_info.titlebar_id = id;
272 surface_info.titlebar_stream_id = stream_id;
268 surface_info.children.push_back(titlebar);273 surface_info.children.push_back(titlebar);
269274
270 SurfaceInfo& titlebar_info =275 SurfaceInfo& titlebar_info =
@@ -437,6 +442,7 @@
437 if (info.titlebar)442 if (info.titlebar)
438 {443 {
439 session->destroy_surface(info.titlebar_id);444 session->destroy_surface(info.titlebar_id);
445 session->destroy_buffer_stream(info.titlebar_stream_id);
440 tools->forget(info.titlebar);446 tools->forget(info.titlebar);
441 }447 }
442448
443449
=== modified file 'examples/server_example_window_management_info.h'
--- examples/server_example_window_management_info.h 2016-01-29 08:18:22 +0000
+++ examples/server_example_window_management_info.h 2016-04-12 14:23:09 +0000
@@ -65,6 +65,7 @@
65 std::vector <std::weak_ptr<scene::Surface>> children;65 std::vector <std::weak_ptr<scene::Surface>> children;
66 std::shared_ptr <scene::Surface> titlebar;66 std::shared_ptr <scene::Surface> titlebar;
67 frontend::SurfaceId titlebar_id;67 frontend::SurfaceId titlebar_id;
68 frontend::BufferStreamId titlebar_stream_id;
68 bool is_titlebar = false;69 bool is_titlebar = false;
69 geometry::Width min_width;70 geometry::Width min_width;
70 geometry::Height min_height;71 geometry::Height min_height;
7172
=== modified file 'include/server/mir/scene/surface_creation_parameters.h'
--- include/server/mir/scene/surface_creation_parameters.h 2016-01-29 08:18:22 +0000
+++ include/server/mir/scene/surface_creation_parameters.h 2016-04-12 14:23:09 +0000
@@ -101,6 +101,7 @@
101101
102 mir::optional_value<std::vector<geometry::Rectangle>> input_shape;102 mir::optional_value<std::vector<geometry::Rectangle>> input_shape;
103 mir::optional_value<MirShellChrome> shell_chrome;103 mir::optional_value<MirShellChrome> shell_chrome;
104 mir::optional_value<std::vector<shell::StreamSpecification>> streams;
104};105};
105106
106bool operator==(const SurfaceCreationParameters& lhs, const SurfaceCreationParameters& rhs);107bool operator==(const SurfaceCreationParameters& lhs, const SurfaceCreationParameters& rhs);
107108
=== modified file 'src/client/mir_connection.cpp'
--- src/client/mir_connection.cpp 2016-03-23 06:39:56 +0000
+++ src/client/mir_connection.cpp 2016-04-12 14:23:09 +0000
@@ -172,6 +172,22 @@
172 }172 }
173 }173 }
174174
175 if (spec.streams.is_set())
176 {
177 for(auto const& stream : spec.streams.value())
178 {
179 auto const new_stream = message.add_stream();
180 new_stream->set_displacement_x(stream.displacement.dx.as_int());
181 new_stream->set_displacement_y(stream.displacement.dy.as_int());
182 new_stream->mutable_id()->set_value(stream.stream_id);
183 if (stream.size.is_set())
184 {
185 new_stream->set_width(stream.size.value().width.as_int());
186 new_stream->set_height(stream.size.value().height.as_int());
187 }
188 }
189 }
190
175 return message;191 return message;
176}192}
177193
@@ -400,7 +416,7 @@
400 this, server, &debug, stream, input_platform, spec, *surface_proto, request->wh);416 this, server, &debug, stream, input_platform, spec, *surface_proto, request->wh);
401417
402 surface_map->insert(mf::SurfaceId{surface_proto->id().value()}, surf);418 surface_map->insert(mf::SurfaceId{surface_proto->id().value()}, surf);
403 surface_map->insert(mf::BufferStreamId{surface_proto->id().value()}, stream);419 surface_map->insert(mf::BufferStreamId{surface_proto->buffer_stream().id().value()}, stream);
404 }420 }
405421
406 callback(surf.get(), context);422 callback(surf.get(), context);
407423
=== modified file 'src/protobuf/mir_protobuf.proto'
--- src/protobuf/mir_protobuf.proto 2016-03-23 06:39:56 +0000
+++ src/protobuf/mir_protobuf.proto 2016-04-12 14:23:09 +0000
@@ -39,6 +39,7 @@
39 optional PersistentSurfaceId parent_persistent_id = 21;39 optional PersistentSurfaceId parent_persistent_id = 21;
40 repeated Rectangle input_shape = 22;40 repeated Rectangle input_shape = 22;
41 optional int32 shell_chrome = 24;41 optional int32 shell_chrome = 24;
42 repeated StreamConfiguration stream = 25;
42}43}
4344
44message SurfaceAspectRatio45message SurfaceAspectRatio
4546
=== modified file 'src/server/frontend/buffer_stream_tracker.cpp'
--- src/server/frontend/buffer_stream_tracker.cpp 2015-06-17 05:20:42 +0000
+++ src/server/frontend/buffer_stream_tracker.cpp 2016-04-12 14:23:09 +0000
@@ -21,6 +21,7 @@
2121
22#include "mir/graphics/buffer.h"22#include "mir/graphics/buffer.h"
23#include "mir/graphics/buffer_id.h"23#include "mir/graphics/buffer_id.h"
24#include "mir/frontend/session.h"
2425
25#include <boost/throw_exception.hpp>26#include <boost/throw_exception.hpp>
26#include <stdexcept>27#include <stdexcept>
@@ -93,3 +94,26 @@
93 }94 }
94 BOOST_THROW_EXCEPTION(std::logic_error("Buffer is not tracked"));95 BOOST_THROW_EXCEPTION(std::logic_error("Buffer is not tracked"));
95}96}
97
98void mf::BufferStreamTracker::set_default_stream(mf::SurfaceId id, mf::BufferStreamId content)
99{
100 std::lock_guard<decltype(mutex)> lock{mutex};
101 default_streams[id] = content;
102}
103
104mir::optional_value<mf::BufferStreamId> mf::BufferStreamTracker::default_stream(mf::SurfaceId id)
105{
106 std::lock_guard<decltype(mutex)> lock{mutex};
107 auto it = default_streams.find(id);
108 if (it != default_streams.end())
109 return it->second;
110 return {};
111}
112
113void mf::BufferStreamTracker::remove_default_stream(mf::SurfaceId id)
114{
115 std::lock_guard<decltype(mutex)> lock{mutex};
116 auto it = default_streams.find(id);
117 if (it != default_streams.end())
118 default_streams.erase(it);
119}
96120
=== modified file 'src/server/frontend/buffer_stream_tracker.h'
--- src/server/frontend/buffer_stream_tracker.h 2015-06-17 05:20:42 +0000
+++ src/server/frontend/buffer_stream_tracker.h 2016-04-12 14:23:09 +0000
@@ -19,8 +19,10 @@
19#ifndef MIR_FRONTEND_BUFFER_STREAM_TRACKER_H_19#ifndef MIR_FRONTEND_BUFFER_STREAM_TRACKER_H_
20#define MIR_FRONTEND_BUFFER_STREAM_TRACKER_H_20#define MIR_FRONTEND_BUFFER_STREAM_TRACKER_H_
2121
22#include "mir/frontend/surface_id.h"
22#include "mir/frontend/buffer_stream_id.h"23#include "mir/frontend/buffer_stream_id.h"
23#include "mir/graphics/buffer_id.h"24#include "mir/graphics/buffer_id.h"
25#include "mir/optional_value.h"
2426
25#include <unordered_map>27#include <unordered_map>
26#include <memory>28#include <memory>
@@ -56,6 +58,10 @@
56 /* Access the buffer resource that the id corresponds to. */58 /* Access the buffer resource that the id corresponds to. */
57 graphics::Buffer* buffer_from(graphics::BufferID) const;59 graphics::Buffer* buffer_from(graphics::BufferID) const;
5860
61 void set_default_stream(frontend::SurfaceId id, frontend::BufferStreamId);
62 optional_value<BufferStreamId> default_stream(SurfaceId id);
63 void remove_default_stream(frontend::SurfaceId);
64
59private:65private:
60 size_t const client_cache_size;66 size_t const client_cache_size;
61 std::unordered_map<BufferStreamId, std::shared_ptr<ClientBufferTracker>> client_buffer_tracker;67 std::unordered_map<BufferStreamId, std::shared_ptr<ClientBufferTracker>> client_buffer_tracker;
@@ -67,6 +73,7 @@
67private:73private:
68 mutable std::mutex mutex;74 mutable std::mutex mutex;
69 std::unordered_map<BufferStreamId, graphics::Buffer*> client_buffer_resource;75 std::unordered_map<BufferStreamId, graphics::Buffer*> client_buffer_resource;
76 std::unordered_map<SurfaceId, frontend::BufferStreamId> default_streams;
70};77};
7178
72}79}
7380
=== modified file 'src/server/frontend/session_mediator.cpp'
--- src/server/frontend/session_mediator.cpp 2016-04-05 03:47:49 +0000
+++ src/server/frontend/session_mediator.cpp 2016-04-12 14:23:09 +0000
@@ -286,6 +286,40 @@
286286
287 #undef COPY_IF_SET287 #undef COPY_IF_SET
288288
289 mf::BufferStreamId buffer_stream_id;
290 std::shared_ptr<mf::BufferStream> legacy_stream = nullptr;
291 if (request->stream_size() > 0)
292 {
293 std::vector<msh::StreamSpecification> stream_spec;
294 for (auto& stream : request->stream())
295 {
296 if (stream.has_width() && stream.has_height())
297 {
298 stream_spec.emplace_back(
299 msh::StreamSpecification{
300 mf::BufferStreamId{stream.id().value()},
301 geom::Displacement{stream.displacement_x(), stream.displacement_y()},
302 geom::Size{stream.width(), stream.height()}});
303 }
304 else
305 {
306 stream_spec.emplace_back(
307 msh::StreamSpecification{
308 mf::BufferStreamId{stream.id().value()},
309 geom::Displacement{stream.displacement_x(), stream.displacement_y()},
310 {}});
311 }
312 }
313 params.streams = std::move(stream_spec);
314 }
315 else
316 {
317 buffer_stream_id = session->create_buffer_stream(
318 {params.size, params.pixel_format, params.buffer_usage});
319 legacy_stream = session->get_buffer_stream(buffer_stream_id);
320 params.content_id = buffer_stream_id;
321 }
322
289 if (request->has_min_aspect())323 if (request->has_min_aspect())
290 params.min_aspect = { request->min_aspect().width(), request->min_aspect().height()};324 params.min_aspect = { request->min_aspect().width(), request->min_aspect().height()};
291325
@@ -298,10 +332,9 @@
298 std::shared_ptr<mf::EventSink> sink = sink_factory->create_sink(buffering_sender);332 std::shared_ptr<mf::EventSink> sink = sink_factory->create_sink(buffering_sender);
299333
300 auto const surf_id = shell->create_surface(session, params, sink);334 auto const surf_id = shell->create_surface(session, params, sink);
301 auto stream_id = mf::BufferStreamId(surf_id.as_value());
302335
303 auto surface = session->get_surface(surf_id);336 auto surface = session->get_surface(surf_id);
304 auto stream = session->get_buffer_stream(stream_id);337 auto stream = session->get_buffer_stream(buffer_stream_id);
305 auto const& client_size = surface->client_size();338 auto const& client_size = surface->client_size();
306 response->mutable_id()->set_value(surf_id.as_value());339 response->mutable_id()->set_value(surf_id.as_value());
307 response->set_width(client_size.width.as_uint32_t());340 response->set_width(client_size.width.as_uint32_t());
@@ -326,21 +359,29 @@
326 setting->set_ivalue(shell->get_surface_attribute(session, surf_id, static_cast<MirSurfaceAttrib>(i)));359 setting->set_ivalue(shell->get_surface_attribute(session, surf_id, static_cast<MirSurfaceAttrib>(i)));
327 }360 }
328361
329 advance_buffer(stream_id, *stream, buffer_stream_tracker.last_buffer(stream_id),362 if (legacy_stream)
330 [this, buffering_sender, surf_id, response, done, session]363 {
331 (graphics::Buffer* client_buffer, graphics::BufferIpcMsgType msg_type)364 buffer_stream_tracker.set_default_stream(surf_id, buffer_stream_id);
332 {365 response->mutable_buffer_stream()->mutable_id()->set_value(buffer_stream_id.as_value());
333 response->mutable_buffer_stream()->mutable_id()->set_value(surf_id.as_value());366 advance_buffer(buffer_stream_id, *legacy_stream, buffer_stream_tracker.last_buffer(buffer_stream_id),
334 if (client_buffer)367 [this, buffering_sender, response, done, session]
335 pack_protobuf_buffer(*response->mutable_buffer_stream()->mutable_buffer(), client_buffer, msg_type);368 (graphics::Buffer* client_buffer, graphics::BufferIpcMsgType msg_type)
336369 {
337370 if (client_buffer)
338 // Send the create_surface reply first...371 pack_protobuf_buffer(*response->mutable_buffer_stream()->mutable_buffer(), client_buffer, msg_type);
339 done->Run();372
340373 // Send the create_surface reply first...
341 // ...then uncork the message sender, sending all buffered surface events.374 done->Run();
342 buffering_sender->uncork();375
343 });376 // ...then uncork the message sender, sending all buffered surface events.
377 buffering_sender->uncork();
378 });
379 }
380 else
381 {
382 done->Run();
383 buffering_sender->uncork();
384 }
344}385}
345386
346void mf::SessionMediator::exchange_buffer(387void mf::SessionMediator::exchange_buffer(
@@ -469,7 +510,14 @@
469 auto const id = SurfaceId(request->value());510 auto const id = SurfaceId(request->value());
470511
471 shell->destroy_surface(session, id);512 shell->destroy_surface(session, id);
472 buffer_stream_tracker.remove_buffer_stream(BufferStreamId(request->value()));513
514 auto default_stream = buffer_stream_tracker.default_stream(id);
515 if (default_stream.is_set())
516 {
517 session->destroy_buffer_stream(default_stream.value());
518 buffer_stream_tracker.remove_buffer_stream(default_stream.value());
519 buffer_stream_tracker.remove_default_stream(id);
520 }
473521
474 // TODO: We rely on this sending responses synchronously.522 // TODO: We rely on this sending responses synchronously.
475 done->Run();523 done->Run();
476524
=== modified file 'src/server/scene/application_session.cpp'
--- src/server/scene/application_session.cpp 2016-04-06 08:44:01 +0000
+++ src/server/scene/application_session.cpp 2016-04-12 14:23:09 +0000
@@ -90,27 +90,31 @@
90 std::shared_ptr<mf::EventSink> const& surface_sink)90 std::shared_ptr<mf::EventSink> const& surface_sink)
91{91{
92 auto const id = next_id();92 auto const id = next_id();
93 mf::BufferStreamId const stream_id{the_params.content_id.is_set() ?93
94 the_params.content_id.value().as_value() : id.as_value()};94 //TODO: we take either the content_id or the first streams content for now.
95 // Once the surface factory interface takes more than one stream,
96 // we can take all the streams as content.
97 if (!((the_params.content_id.is_set()) ||
98 (the_params.streams.is_set() && the_params.streams.value().size() > 0)))
99 {
100 BOOST_THROW_EXCEPTION(std::logic_error("surface must have content"));
101 }
95102
96 auto params = the_params;103 auto params = the_params;
97104
105 mf::BufferStreamId stream_id;
106 if (params.content_id.is_set())
107 stream_id = params.content_id.value();
108 else
109 stream_id = params.streams.value()[0].stream_id;
110
98 if (params.parent_id.is_set())111 if (params.parent_id.is_set())
99 params.parent = checked_find(the_params.parent_id.value())->second;112 params.parent = checked_find(the_params.parent_id.value())->second;
100113
101 std::shared_ptr<compositor::BufferStream> buffer_stream;114 auto buffer_stream = checked_find(params.content_id.value())->second;
102 if (params.content_id.is_set())115 if (params.size != buffer_stream->stream_size())
103 {116 buffer_stream->resize(params.size);
104 buffer_stream = checked_find(params.content_id.value())->second;117
105 }
106 else
107 {
108 mg::BufferProperties buffer_properties{params.size,
109 params.pixel_format,
110 params.buffer_usage};
111 buffer_stream = buffer_stream_factory->create_buffer_stream(
112 stream_id, surface_sink, buffer_properties);
113 }
114 auto surface = surface_factory->create_surface(buffer_stream, params);118 auto surface = surface_factory->create_surface(buffer_stream, params);
115 surface_stack->add_surface(surface, params.input_mode);119 surface_stack->add_surface(surface, params.input_mode);
116120
@@ -133,7 +137,7 @@
133 {137 {
134 std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);138 std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
135 surfaces[id] = surface;139 surfaces[id] = surface;
136 streams[stream_id] = buffer_stream;140 default_content_map[id] = stream_id;
137 }141 }
138142
139 observer->moved_to(surface->top_left());143 observer->moved_to(surface->top_left());
@@ -154,7 +158,7 @@
154{158{
155 auto p = streams.find(id);159 auto p = streams.find(id);
156 if (p == streams.end())160 if (p == streams.end())
157 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid SurfaceId"));161 BOOST_THROW_EXCEPTION(std::runtime_error("Invalid BufferStreamId"));
158 return p;162 return p;
159}163}
160164
@@ -220,7 +224,7 @@
220 {224 {
221 if (default_surface() == surface_it.second)225 if (default_surface() == surface_it.second)
222 {226 {
223 auto id = mf::BufferStreamId(surface_it.first.as_value());227 auto id = default_content_map[surface_it.first];
224 snapshot_strategy->take_snapshot_of(checked_find(id)->second, snapshot_taken);228 snapshot_strategy->take_snapshot_of(checked_find(id)->second, snapshot_taken);
225 return;229 return;
226 }230 }
@@ -360,7 +364,12 @@
360void ms::ApplicationSession::destroy_buffer_stream(mf::BufferStreamId id)364void ms::ApplicationSession::destroy_buffer_stream(mf::BufferStreamId id)
361{365{
362 std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);366 std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
363 streams.erase(checked_find(id));367 auto stream_it = streams.find(mir::frontend::BufferStreamId(id.as_value()));
368 if (stream_it == streams.end())
369 BOOST_THROW_EXCEPTION(std::runtime_error("cannot destroy stream: Invalid BufferStreamId"));
370
371 stream_it->second->drop_outstanding_requests();
372 streams.erase(stream_it);
364}373}
365374
366void ms::ApplicationSession::configure_streams(375void ms::ApplicationSession::configure_streams(
@@ -391,17 +400,12 @@
391void ms::ApplicationSession::destroy_surface(std::unique_lock<std::mutex>& lock, Surfaces::const_iterator in_surfaces)400void ms::ApplicationSession::destroy_surface(std::unique_lock<std::mutex>& lock, Surfaces::const_iterator in_surfaces)
392{401{
393 auto const surface = in_surfaces->second;402 auto const surface = in_surfaces->second;
394 auto const id = in_surfaces->first;403 auto it = default_content_map.find(in_surfaces->first);
395
396 session_listener->destroying_surface(*this, surface);404 session_listener->destroying_surface(*this, surface);
397 surfaces.erase(in_surfaces);405 surfaces.erase(in_surfaces);
398406
399 auto stream_it = streams.find(mir::frontend::BufferStreamId(id.as_value()));407 if (it != default_content_map.end())
400 if (stream_it != streams.end())408 default_content_map.erase(it);
401 {
402 stream_it->second->drop_outstanding_requests();
403 streams.erase(stream_it);
404 }
405409
406 lock.unlock();410 lock.unlock();
407411
408412
=== modified file 'src/server/scene/application_session.h'
--- src/server/scene/application_session.h 2016-04-06 08:44:01 +0000
+++ src/server/scene/application_session.h 2016-04-12 14:23:09 +0000
@@ -126,6 +126,8 @@
126 Surfaces surfaces;126 Surfaces surfaces;
127 Streams streams;127 Streams streams;
128128
129 std::map<frontend::SurfaceId, frontend::BufferStreamId> default_content_map;
130
129 void destroy_surface(std::unique_lock<std::mutex>& lock, Surfaces::const_iterator in_surfaces);131 void destroy_surface(std::unique_lock<std::mutex>& lock, Surfaces::const_iterator in_surfaces);
130};132};
131133
132134
=== modified file 'tests/integration-tests/session_management.cpp'
--- tests/integration-tests/session_management.cpp 2016-01-29 08:18:22 +0000
+++ tests/integration-tests/session_management.cpp 2016-04-12 14:23:09 +0000
@@ -95,8 +95,6 @@
95 std::shared_ptr<mf::EventSink> const event_sink = std::make_shared<mtd::NullEventSink>();95 std::shared_ptr<mf::EventSink> const event_sink = std::make_shared<mtd::NullEventSink>();
96 std::shared_ptr<mf::Shell> const session_manager = builder.the_frontend_shell();96 std::shared_ptr<mf::Shell> const session_manager = builder.the_frontend_shell();
97 std::shared_ptr<TestSurfaceStack> const& test_surface_stack = builder.test_surface_stack;97 std::shared_ptr<TestSurfaceStack> const& test_surface_stack = builder.test_surface_stack;
98 ms::SurfaceCreationParameters const params = ms::SurfaceCreationParameters().of_size(100,100).of_type(mir_surface_type_normal);
99
100 void SetUp()98 void SetUp()
101 {99 {
102 ASSERT_THAT(test_surface_stack, Ne(nullptr));100 ASSERT_THAT(test_surface_stack, Ne(nullptr));
@@ -117,6 +115,13 @@
117{115{
118 auto const session = session_manager->open_session(0, __PRETTY_FUNCTION__, event_sink);116 auto const session = session_manager->open_session(0, __PRETTY_FUNCTION__, event_sink);
119117
118 mir::graphics::BufferProperties properties(
119 mir::geometry::Size{1,1}, mir_pixel_format_abgr_8888, mir::graphics::BufferUsage::software);
120 ms::SurfaceCreationParameters const params = ms::SurfaceCreationParameters()
121 .of_size(100,100)
122 .of_type(mir_surface_type_normal)
123 .with_buffer_stream(session->create_buffer_stream(properties));
124
120 EXPECT_CALL(*test_surface_stack, add_surface(_,_)).Times(1);125 EXPECT_CALL(*test_surface_stack, add_surface(_,_)).Times(1);
121 session_manager->create_surface(session, params, event_sink);126 session_manager->create_surface(session, params, event_sink);
122}127}
123128
=== modified file 'tests/integration-tests/test_session.cpp'
--- tests/integration-tests/test_session.cpp 2016-01-29 08:18:22 +0000
+++ tests/integration-tests/test_session.cpp 2016-04-12 14:23:09 +0000
@@ -126,7 +126,11 @@
126 mtd::StubDisplayConfig{},126 mtd::StubDisplayConfig{},
127 std::make_shared<mtd::NullEventSink>()127 std::make_shared<mtd::NullEventSink>()
128 };128 };
129 session.create_surface(ms::a_surface(), std::make_shared<mtd::NullEventSink>());129
130 mg::BufferProperties properties(geom::Size{1,1}, mir_pixel_format_abgr_8888, mg::BufferUsage::software);
131 session.create_surface(
132 ms::a_surface().with_buffer_stream(session.create_buffer_stream(properties)),
133 std::make_shared<mtd::NullEventSink>());
130134
131 auto compositor = conf.the_compositor();135 auto compositor = conf.the_compositor();
132136
133137
=== modified file 'tests/unit-tests/frontend/test_session_mediator.cpp'
--- tests/unit-tests/frontend/test_session_mediator.cpp 2016-04-05 03:47:49 +0000
+++ tests/unit-tests/frontend/test_session_mediator.cpp 2016-04-12 14:23:09 +0000
@@ -111,11 +111,6 @@
111class StubbedSession : public mtd::StubSession111class StubbedSession : public mtd::StubSession
112{112{
113public:113public:
114 StubbedSession() :
115 last_surface_id{0}
116 {
117 }
118
119 std::shared_ptr<mf::Surface> get_surface(mf::SurfaceId surface) const114 std::shared_ptr<mf::Surface> get_surface(mf::SurfaceId surface) const
120 {115 {
121 if (mock_surfaces.find(surface) == mock_surfaces.end())116 if (mock_surfaces.find(surface) == mock_surfaces.end())
@@ -126,7 +121,7 @@
126 std::shared_ptr<mf::BufferStream> get_buffer_stream(mf::BufferStreamId stream) const override121 std::shared_ptr<mf::BufferStream> get_buffer_stream(mf::BufferStreamId stream) const override
127 {122 {
128 if (mock_streams.find(stream) == mock_streams.end())123 if (mock_streams.find(stream) == mock_streams.end())
129 BOOST_THROW_EXCEPTION(std::logic_error("Invalid SurfaceId"));124 BOOST_THROW_EXCEPTION(std::logic_error("Invalid StreamId"));
130 return mock_streams.at(stream);125 return mock_streams.at(stream);
131 }126 }
132127
@@ -137,43 +132,37 @@
137 return mock_surfaces.at(id);132 return mock_surfaces.at(id);
138 }133 }
139134
140 std::shared_ptr<mtd::MockBufferStream> mock_primary_stream_at(mf::SurfaceId id)135 std::shared_ptr<mtd::MockBufferStream> mock_stream_at(mf::BufferStreamId id)
141 {136 {
142 if (mock_surfaces.end() == mock_surfaces.find(id))137 if (mock_streams.end() == mock_streams.find(id))
143 create_mock_surface(id);138 return create_mock_stream(id);
144 return mock_streams.at(mf::BufferStreamId(id.as_value()));139 return mock_streams.at(id);
145 }140 }
146141
147 std::shared_ptr<mtd::MockFrontendSurface> create_mock_surface(mf::SurfaceId id)142 std::shared_ptr<mtd::MockFrontendSurface> create_mock_surface(mf::SurfaceId id)
148 {143 {
149 using namespace testing;144 using namespace testing;
145 mg::BufferProperties properties;
146 create_buffer_stream(properties);
150 auto surface = std::make_shared<testing::NiceMock<mtd::MockFrontendSurface>>(testing_client_input_fd);147 auto surface = std::make_shared<testing::NiceMock<mtd::MockFrontendSurface>>(testing_client_input_fd);
151 auto stream = std::make_shared<testing::NiceMock<mtd::MockBufferStream>>();148 mock_surfaces[id] = surface;
149 return surface;
150 }
152151
152 std::shared_ptr<mtd::MockBufferStream> create_mock_stream(mf::BufferStreamId id)
153 {
154 mock_streams[id] = std::make_shared<testing::NiceMock<mtd::MockBufferStream>>();
153 auto buffer1 = std::make_shared<mtd::StubBuffer>();155 auto buffer1 = std::make_shared<mtd::StubBuffer>();
154 auto buffer2 = std::make_shared<mtd::StubBuffer>();156 auto buffer2 = std::make_shared<mtd::StubBuffer>();
155 ON_CALL(*stream, swap_buffers(testing::_,testing::_))157 ON_CALL(*mock_streams[id], swap_buffers(testing::_,testing::_))
156 .WillByDefault(testing::Invoke(158 .WillByDefault(testing::Invoke(
157 [buffer1, buffer2](mg::Buffer* b, std::function<void(mg::Buffer* new_buffer)> complete)159 [buffer1, buffer2](mg::Buffer* b, std::function<void(mg::Buffer* new_buffer)> complete)
158 {160 {
159 if ((!b) || (b == buffer1.get()))161 if ((!b) || (b == buffer1.get()))
160 complete(buffer2.get());162 complete(buffer2.get());
161 if (b == buffer2.get())163 if (b == buffer2.get())
162 complete(buffer1.get()); 164 complete(buffer1.get());
163 }));165 }));
164
165 ON_CALL(*surface, primary_buffer_stream())
166 .WillByDefault(Return(stream));
167
168
169 mock_surfaces[id] = surface;
170 mock_streams[mf::BufferStreamId(id.as_value())] = stream;
171 return surface;
172 }
173
174 std::shared_ptr<mtd::MockBufferStream> create_mock_stream(mf::BufferStreamId id)
175 {
176 mock_streams[id] = std::make_shared<testing::NiceMock<mtd::MockBufferStream>>();
177 return mock_streams[id];166 return mock_streams[id];
178 }167 }
179168
@@ -190,10 +179,10 @@
190179
191 mf::BufferStreamId create_buffer_stream(mg::BufferProperties const&)180 mf::BufferStreamId create_buffer_stream(mg::BufferProperties const&)
192 {181 {
193 mf::BufferStreamId id{last_surface_id};182 mf::BufferStreamId id{last_stream_id};
194 if (mock_streams.end() == mock_streams.find(id))183 if (mock_streams.end() == mock_streams.find(id))
195 create_mock_stream(id);184 create_mock_stream(id);
196 last_surface_id++;185 last_stream_id++;
197 return id;186 return id;
198 }187 }
199188
@@ -205,7 +194,8 @@
205 std::map<mf::BufferStreamId, std::shared_ptr<mtd::MockBufferStream>> mock_streams;194 std::map<mf::BufferStreamId, std::shared_ptr<mtd::MockBufferStream>> mock_streams;
206 std::map<mf::SurfaceId, std::shared_ptr<mtd::MockFrontendSurface>> mock_surfaces;195 std::map<mf::SurfaceId, std::shared_ptr<mtd::MockFrontendSurface>> mock_surfaces;
207 static int const testing_client_input_fd;196 static int const testing_client_input_fd;
208 int last_surface_id;197 int last_surface_id = 0;
198 int last_stream_id = 0;
209};199};
210200
211int const StubbedSession::testing_client_input_fd{11};201int const StubbedSession::testing_client_input_fd{11};
@@ -298,6 +288,7 @@
298 mp::Buffer buffer_response;288 mp::Buffer buffer_response;
299 mp::BufferRequest buffer_request;289 mp::BufferRequest buffer_request;
300};290};
291
301}292}
302293
303TEST_F(SessionMediator, disconnect_releases_session)294TEST_F(SessionMediator, disconnect_releases_session)
@@ -388,10 +379,6 @@
388 }, std::logic_error);379 }, std::logic_error);
389380
390 EXPECT_THROW({381 EXPECT_THROW({
391 mediator.exchange_buffer(&buffer_request, &buffer_response, null_callback.get());
392 }, std::logic_error);
393
394 EXPECT_THROW({
395 mediator.release_surface(&surface_id_request, nullptr, null_callback.get());382 mediator.release_surface(&surface_id_request, nullptr, null_callback.get());
396 }, std::logic_error);383 }, std::logic_error);
397384
@@ -510,7 +497,7 @@
510 mp::SurfaceParameters surface_request;497 mp::SurfaceParameters surface_request;
511 mp::Surface surface_response;498 mp::Surface surface_response;
512499
513 auto stream1 = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});500 auto stream1 = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
514 ON_CALL(*stream1, swap_buffers(_,_))501 ON_CALL(*stream1, swap_buffers(_,_))
515 .WillByDefault(InvokeArgument<1>(&buffer));502 .WillByDefault(InvokeArgument<1>(&buffer));
516503
@@ -653,7 +640,7 @@
653TEST_F(SessionMediator, exchange_buffer)640TEST_F(SessionMediator, exchange_buffer)
654{641{
655 using namespace testing;642 using namespace testing;
656 auto const& mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});643 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
657 mp::Buffer exchanged_buffer;644 mp::Buffer exchanged_buffer;
658 mtd::StubBuffer stub_buffer1;645 mtd::StubBuffer stub_buffer1;
659 mtd::StubBuffer stub_buffer2;646 mtd::StubBuffer stub_buffer2;
@@ -682,10 +669,10 @@
682{669{
683 using namespace testing;670 using namespace testing;
684 mp::Buffer exchanged_buffer;671 mp::Buffer exchanged_buffer;
685 mf::SurfaceId surf_id{0};672 mf::BufferStreamId stream_id{0};
686 mtd::StubBuffer buffer1;673 mtd::StubBuffer buffer1;
687 mtd::StubBuffer buffer2;674 mtd::StubBuffer buffer2;
688 auto stream = stubbed_session->mock_primary_stream_at(surf_id);675 auto stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
689 ON_CALL(*stream, swap_buffers(nullptr,_))676 ON_CALL(*stream, swap_buffers(nullptr,_))
690 .WillByDefault(InvokeArgument<1>(&buffer2));677 .WillByDefault(InvokeArgument<1>(&buffer2));
691 ON_CALL(*stream, swap_buffers(&buffer1,_))678 ON_CALL(*stream, swap_buffers(&buffer1,_))
@@ -732,7 +719,7 @@
732TEST_F(SessionMediator, exchange_buffer_throws_if_client_submits_bad_request)719TEST_F(SessionMediator, exchange_buffer_throws_if_client_submits_bad_request)
733{720{
734 using namespace testing;721 using namespace testing;
735 auto const& mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});722 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
736 mp::Buffer exchanged_buffer;723 mp::Buffer exchanged_buffer;
737 mtd::StubBuffer stub_buffer1;724 mtd::StubBuffer stub_buffer1;
738 mtd::StubBuffer stub_buffer2;725 mtd::StubBuffer stub_buffer2;
@@ -765,8 +752,8 @@
765 mp::SurfaceParameters surface_request;752 mp::SurfaceParameters surface_request;
766 mp::BufferRequest req1;753 mp::BufferRequest req1;
767 mp::BufferRequest req2;754 mp::BufferRequest req2;
768 auto const& mock_stream1 = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});755 auto mock_stream1 = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
769 auto const& mock_stream2 = stubbed_session->mock_primary_stream_at(mf::SurfaceId{1});756 auto mock_stream2 = stubbed_session->mock_stream_at(mf::BufferStreamId{2});
770 Sequence seq;757 Sequence seq;
771 EXPECT_CALL(*mock_stream1, swap_buffers(_,_))758 EXPECT_CALL(*mock_stream1, swap_buffers(_,_))
772 .InSequence(seq);759 .InSequence(seq);
@@ -780,10 +767,10 @@
780 mediator.connect(&connect_parameters, &connection, null_callback.get());767 mediator.connect(&connect_parameters, &connection, null_callback.get());
781768
782 mediator.create_surface(&surface_request, &surface_response, null_callback.get());769 mediator.create_surface(&surface_request, &surface_response, null_callback.get());
783 req1.mutable_id()->set_value(surface_response.id().value());770 req1.mutable_id()->set_value(surface_response.buffer_stream().id().value());
784 *req1.mutable_buffer() = surface_response.buffer_stream().buffer();771 *req1.mutable_buffer() = surface_response.buffer_stream().buffer();
785 mediator.create_surface(&surface_request, &surface_response, null_callback.get());772 mediator.create_surface(&surface_request, &surface_response, null_callback.get());
786 req2.mutable_id()->set_value(surface_response.id().value());773 req2.mutable_id()->set_value(surface_response.buffer_stream().id().value());
787 *req2.mutable_buffer() = surface_response.buffer_stream().buffer();774 *req2.mutable_buffer() = surface_response.buffer_stream().buffer();
788 mediator.exchange_buffer(&req2, &buffer_response, null_callback.get());775 mediator.exchange_buffer(&req2, &buffer_response, null_callback.get());
789 mediator.exchange_buffer(&req1, &buffer_response, null_callback.get());776 mediator.exchange_buffer(&req1, &buffer_response, null_callback.get());
@@ -840,7 +827,7 @@
840TEST_F(SessionMediator, completes_exchange_buffer_when_completion_is_invoked_asynchronously_from_thread_that_initiated_exchange)827TEST_F(SessionMediator, completes_exchange_buffer_when_completion_is_invoked_asynchronously_from_thread_that_initiated_exchange)
841{828{
842 using namespace testing;829 using namespace testing;
843 auto const& mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});830 auto const& mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
844 mtd::StubBuffer stub_buffer1;831 mtd::StubBuffer stub_buffer1;
845 mtd::StubBuffer stub_buffer2;832 mtd::StubBuffer stub_buffer2;
846 std::function<void(mg::Buffer*)> completion_func;833 std::function<void(mg::Buffer*)> completion_func;
@@ -954,7 +941,7 @@
954 mediator.connect(&connect_parameters, &connection, null_callback.get());941 mediator.connect(&connect_parameters, &connection, null_callback.get());
955 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());942 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());
956943
957 auto mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});944 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
958 request.mutable_id()->set_value(surface_response.id().value());945 request.mutable_id()->set_value(surface_response.id().value());
959 request.mutable_buffer()->set_buffer_id(buffer1->id().as_value());946 request.mutable_buffer()->set_buffer_id(buffer1->id().as_value());
960947
@@ -989,7 +976,7 @@
989 mediator.connect(&connect_parameters, &connection, null_callback.get());976 mediator.connect(&connect_parameters, &connection, null_callback.get());
990 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());977 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());
991978
992 auto mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});979 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
993 EXPECT_CALL(*mock_stream, allocate_buffer(properties))980 EXPECT_CALL(*mock_stream, allocate_buffer(properties))
994 .Times(num_requests)981 .Times(num_requests)
995 .WillRepeatedly(Return(mg::BufferID{}));982 .WillRepeatedly(Return(mg::BufferID{}));
@@ -1016,7 +1003,7 @@
1016 mediator.connect(&connect_parameters, &connection, null_callback.get());1003 mediator.connect(&connect_parameters, &connection, null_callback.get());
1017 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());1004 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());
10181005
1019 auto mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});1006 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
1020 EXPECT_CALL(*mock_stream, remove_buffer(mg::BufferID{buffer_id}))1007 EXPECT_CALL(*mock_stream, remove_buffer(mg::BufferID{buffer_id}))
1021 .Times(num_requests);1008 .Times(num_requests);
10221009
@@ -1026,7 +1013,7 @@
1026TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_submit)1013TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_submit)
1027{1014{
1028 using namespace testing;1015 using namespace testing;
1029 auto mock_stream = stubbed_session->mock_primary_stream_at(mf::SurfaceId{0});1016 auto mock_stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
1030 ON_CALL(*mock_stream, swap_buffers(_,_))1017 ON_CALL(*mock_stream, swap_buffers(_,_))
1031 .WillByDefault(InvokeArgument<1>(nullptr));1018 .WillByDefault(InvokeArgument<1>(nullptr));
1032 auto buffer1 = std::make_shared<mtd::StubBuffer>();1019 auto buffer1 = std::make_shared<mtd::StubBuffer>();
@@ -1062,10 +1049,9 @@
1062TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_create)1049TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_create)
1063{1050{
1064 using namespace testing;1051 using namespace testing;
1065 mf::SurfaceId surf_id{0};
1066 mtd::StubBuffer buffer;1052 mtd::StubBuffer buffer;
10671053
1068 auto stream = stubbed_session->mock_primary_stream_at(surf_id);1054 auto stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
1069 ON_CALL(*stream, swap_buffers(_,_))1055 ON_CALL(*stream, swap_buffers(_,_))
1070 .WillByDefault(InvokeArgument<1>(nullptr));1056 .WillByDefault(InvokeArgument<1>(nullptr));
10711057
@@ -1081,10 +1067,9 @@
1081TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_bstream_create)1067TEST_F(SessionMediator, doesnt_mind_swap_buffers_returning_nullptr_in_bstream_create)
1082{1068{
1083 using namespace testing;1069 using namespace testing;
1084 mf::SurfaceId surf_id{0};
1085 mtd::StubBuffer buffer;1070 mtd::StubBuffer buffer;
10861071
1087 auto stream = stubbed_session->mock_primary_stream_at(surf_id);1072 auto stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
1088 ON_CALL(*stream, swap_buffers(_,_))1073 ON_CALL(*stream, swap_buffers(_,_))
1089 .WillByDefault(InvokeArgument<1>(nullptr));1074 .WillByDefault(InvokeArgument<1>(nullptr));
10901075
@@ -1100,20 +1085,20 @@
1100TEST_F(SessionMediator, configures_swap_intervals_on_streams)1085TEST_F(SessionMediator, configures_swap_intervals_on_streams)
1101{1086{
1102 using namespace testing;1087 using namespace testing;
1103 mf::SurfaceId surf_id{0};1088 mf::BufferStreamId stream_id{0};
1104 mp::StreamConfiguration request;1089 mp::StreamConfiguration request;
1105 mp::Void response;1090 mp::Void response;
11061091
1107 auto interval = 0u;1092 auto interval = 0u;
1108 mtd::StubBuffer buffer;1093 mtd::StubBuffer buffer;
11091094
1110 auto stream = stubbed_session->mock_primary_stream_at(surf_id);1095 auto stream = stubbed_session->mock_stream_at(stream_id);
1111 EXPECT_CALL(*stream, allow_framedropping(true));1096 EXPECT_CALL(*stream, allow_framedropping(true));
11121097
1113 mediator.connect(&connect_parameters, &connection, null_callback.get());1098 mediator.connect(&connect_parameters, &connection, null_callback.get());
1114 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());1099 mediator.create_surface(&surface_parameters, &surface_response, null_callback.get());
11151100
1116 request.mutable_id()->set_value(surf_id.as_value());1101 request.mutable_id()->set_value(stream_id.as_value());
1117 request.set_swapinterval(interval);1102 request.set_swapinterval(interval);
1118 mediator.configure_buffer_stream(&request, &response, null_callback.get());1103 mediator.configure_buffer_stream(&request, &response, null_callback.get());
1119}1104}
@@ -1209,10 +1194,9 @@
1209TEST_F(SessionMediator, doesnt_inadventently_set_buffer_field_when_theres_no_buffer)1194TEST_F(SessionMediator, doesnt_inadventently_set_buffer_field_when_theres_no_buffer)
1210{1195{
1211 mp::Void null;1196 mp::Void null;
1212 mf::SurfaceId surf_id{0};
1213 mp::BufferStreamParameters stream_request;1197 mp::BufferStreamParameters stream_request;
1214 mp::BufferStream stream_response;1198 mp::BufferStream stream_response;
1215 auto stream = stubbed_session->mock_primary_stream_at(surf_id);1199 auto stream = stubbed_session->mock_stream_at(mf::BufferStreamId{0});
1216 ON_CALL(*stream, swap_buffers(nullptr,testing::_))1200 ON_CALL(*stream, swap_buffers(nullptr,testing::_))
1217 .WillByDefault(testing::InvokeArgument<1>(nullptr));1201 .WillByDefault(testing::InvokeArgument<1>(nullptr));
1218 mediator.connect(&connect_parameters, &connection, null_callback.get());1202 mediator.connect(&connect_parameters, &connection, null_callback.get());
12191203
=== modified file 'tests/unit-tests/scene/test_abstract_shell.cpp'
--- tests/unit-tests/scene/test_abstract_shell.cpp 2016-01-29 08:18:22 +0000
+++ tests/unit-tests/scene/test_abstract_shell.cpp 2016-04-12 14:23:09 +0000
@@ -145,6 +145,7 @@
145145
146 std::chrono::nanoseconds const event_timestamp = std::chrono::nanoseconds(0);146 std::chrono::nanoseconds const event_timestamp = std::chrono::nanoseconds(0);
147 std::vector<uint8_t> const cookie;147 std::vector<uint8_t> const cookie;
148 mg::BufferProperties properties { geom::Size{1,1}, mir_pixel_format_abgr_8888, mg::BufferUsage::software};
148};149};
149}150}
150151
@@ -197,9 +198,12 @@
197 WillOnce(Return(mt::fake_shared(surface3)));198 WillOnce(Return(mt::fake_shared(surface3)));
198199
199 auto const session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());200 auto const session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
200 auto const surface_id1 = shell.create_surface(session, ms::a_surface(), nullptr);201 auto const surface_id1 = shell.create_surface(session,
201 auto const surface_id2 = shell.create_surface(session, ms::a_surface(), nullptr);202 ms::a_surface().with_buffer_stream(session->create_buffer_stream(properties)), nullptr);
202 auto const surface_id3 = shell.create_surface(session, ms::a_surface(), nullptr);203 auto const surface_id2 = shell.create_surface(session,
204 ms::a_surface().with_buffer_stream(session->create_buffer_stream(properties)), nullptr);
205 auto const surface_id3 = shell.create_surface(session,
206 ms::a_surface().with_buffer_stream(session->create_buffer_stream(properties)), nullptr);
203207
204 session->destroy_surface(surface_id2);208 session->destroy_surface(surface_id2);
205209
@@ -217,8 +221,8 @@
217 std::shared_ptr<ms::Session> session =221 std::shared_ptr<ms::Session> session =
218 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());222 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
219223
220 auto params = ms::a_surface();224 auto params = ms::a_surface()
221225 .with_buffer_stream(session->create_buffer_stream(properties));
222 EXPECT_CALL(*wm, add_surface(session, Ref(params), _));226 EXPECT_CALL(*wm, add_surface(session, Ref(params), _));
223227
224 shell.create_surface(session, params, nullptr);228 shell.create_surface(session, params, nullptr);
@@ -229,7 +233,8 @@
229 std::shared_ptr<ms::Session> const session =233 std::shared_ptr<ms::Session> const session =
230 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());234 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
231235
232 auto params = ms::a_surface();236 auto params = ms::a_surface()
237 .with_buffer_stream(session->create_buffer_stream(properties));
233 auto placed_params = params;238 auto placed_params = params;
234 placed_params.size.width = geom::Width{100};239 placed_params.size.width = geom::Width{100};
235240
@@ -246,9 +251,10 @@
246251
247TEST_F(AbstractShell, destroy_surface_removes_surface_from_window_manager)252TEST_F(AbstractShell, destroy_surface_removes_surface_from_window_manager)
248{253{
249 auto const params = ms::a_surface();
250 std::shared_ptr<ms::Session> const session =254 std::shared_ptr<ms::Session> const session =
251 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());255 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
256 auto const params = ms::a_surface()
257 .with_buffer_stream(session->create_buffer_stream(properties));
252258
253 auto const surface_id = shell.create_surface(session, params, nullptr);259 auto const surface_id = shell.create_surface(session, params, nullptr);
254 auto const surface = session->surface(surface_id);260 auto const surface = session->surface(surface_id);
@@ -357,7 +363,9 @@
357 std::shared_ptr<ms::Session> const session =363 std::shared_ptr<ms::Session> const session =
358 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());364 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
359365
360 auto const surface_id = shell.create_surface(session, ms::a_surface(), nullptr);366 auto const params = ms::a_surface()
367 .with_buffer_stream(session->create_buffer_stream(properties));
368 auto const surface_id = shell.create_surface(session, params, nullptr);
361 auto const surface = session->surface(surface_id);369 auto const surface = session->surface(surface_id);
362370
363 MirSurfaceState const state{mir_surface_state_fullscreen};371 MirSurfaceState const state{mir_surface_state_fullscreen};
@@ -392,8 +400,12 @@
392 msh::FocusController& focus_controller = shell;400 msh::FocusController& focus_controller = shell;
393 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());401 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
394 auto session1 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());402 auto session1 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());
395 shell.create_surface(session, ms::a_surface(), nullptr);403 auto const params = ms::a_surface()
396 shell.create_surface(session1, ms::a_surface(), nullptr);404 .with_buffer_stream(session->create_buffer_stream(properties));
405 auto const params2 = ms::a_surface()
406 .with_buffer_stream(session1->create_buffer_stream(properties));
407 shell.create_surface(session, params, nullptr);
408 shell.create_surface(session1, params2, nullptr);
397409
398 focus_controller.set_focus_to(session, {});410 focus_controller.set_focus_to(session, {});
399411
@@ -409,8 +421,12 @@
409{421{
410 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());422 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
411 auto session1 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());423 auto session1 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());
412 shell.create_surface(session, ms::a_surface(), nullptr);424 auto const params = ms::a_surface()
413 shell.create_surface(session1, ms::a_surface(), nullptr);425 .with_buffer_stream(session->create_buffer_stream(properties));
426 auto const params2 = ms::a_surface()
427 .with_buffer_stream(session1->create_buffer_stream(properties));
428 shell.create_surface(session, params, nullptr);
429 shell.create_surface(session1, params2, nullptr);
414430
415 EXPECT_CALL(session_container, successor_of(session1)).431 EXPECT_CALL(session_container, successor_of(session1)).
416 WillOnce(Return(session));432 WillOnce(Return(session));
@@ -437,10 +453,13 @@
437 EXPECT_CALL(session_container, successor_of(session1)).453 EXPECT_CALL(session_container, successor_of(session1)).
438 WillOnce(Return(session0));454 WillOnce(Return(session0));
439455
440456 auto const params = ms::a_surface()
441 auto const surface0_id = shell.create_surface(session0, ms::a_surface(), nullptr);457 .with_buffer_stream(session0->create_buffer_stream(properties));
458 auto const params2 = ms::a_surface()
459 .with_buffer_stream(session1->create_buffer_stream(properties));
460 auto const surface0_id = shell.create_surface(session0, params, nullptr);
442 auto const surface0 = session0->surface(surface0_id);461 auto const surface0 = session0->surface(surface0_id);
443 auto const surface1_id = shell.create_surface(session1, ms::a_surface(), nullptr);462 auto const surface1_id = shell.create_surface(session1, params2, nullptr);
444 auto const surface1 = session1->surface(surface1_id);463 auto const surface1 = session1->surface(surface1_id);
445464
446 msh::FocusController& focus_controller = shell;465 msh::FocusController& focus_controller = shell;
@@ -477,8 +496,12 @@
477 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());496 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
478 auto session1 = shell.open_session(__LINE__, "Surfaceless", std::shared_ptr<mf::EventSink>());497 auto session1 = shell.open_session(__LINE__, "Surfaceless", std::shared_ptr<mf::EventSink>());
479 auto session2 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());498 auto session2 = shell.open_session(__LINE__, "Bla", std::shared_ptr<mf::EventSink>());
480 auto surface_id = shell.create_surface(session, ms::a_surface(), nullptr);499 auto const params = ms::a_surface()
481 shell.create_surface(session2, ms::a_surface(), nullptr);500 .with_buffer_stream(session->create_buffer_stream(properties));
501 auto surface_id = shell.create_surface(session, params, nullptr);
502 auto const params2 = ms::a_surface()
503 .with_buffer_stream(session2->create_buffer_stream(properties));
504 shell.create_surface(session2, params2, nullptr);
482505
483 focus_controller.set_focus_to(session, session->surface(surface_id));506 focus_controller.set_focus_to(session, session->surface(surface_id));
484507
@@ -498,7 +521,9 @@
498 msh::FocusController& focus_controller = shell;521 msh::FocusController& focus_controller = shell;
499 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());522 auto session = shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
500 auto session1 = shell.open_session(__LINE__, "Surfaceless", std::shared_ptr<mf::EventSink>());523 auto session1 = shell.open_session(__LINE__, "Surfaceless", std::shared_ptr<mf::EventSink>());
501 auto surface_id = shell.create_surface(session, ms::a_surface(), nullptr);524 auto creation_params = ms::a_surface()
525 .with_buffer_stream(session->create_buffer_stream(properties));
526 auto surface_id = shell.create_surface(session, creation_params, nullptr);
502527
503 focus_controller.set_focus_to(session, session->surface(surface_id));528 focus_controller.set_focus_to(session, session->surface(surface_id));
504529
@@ -519,8 +544,8 @@
519 std::shared_ptr<ms::Session> session =544 std::shared_ptr<ms::Session> session =
520 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());545 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
521546
522 auto creation_params = ms::a_surface();547 auto creation_params = ms::a_surface()
523548 .with_buffer_stream(session->create_buffer_stream(properties));
524 auto surface_id = shell.create_surface(session, creation_params, nullptr);549 auto surface_id = shell.create_surface(session, creation_params, nullptr);
525 auto surface = session->surface(surface_id);550 auto surface = session->surface(surface_id);
526551
@@ -537,7 +562,8 @@
537 std::shared_ptr<ms::Session> session =562 std::shared_ptr<ms::Session> session =
538 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());563 shell.open_session(__LINE__, "XPlane", std::shared_ptr<mf::EventSink>());
539564
540 auto creation_params = ms::a_surface();565 auto creation_params = ms::a_surface()
566 .with_buffer_stream(session->create_buffer_stream(properties));
541567
542 auto surface_id = shell.create_surface(session, creation_params, nullptr);568 auto surface_id = shell.create_surface(session, creation_params, nullptr);
543 auto surface = session->surface(surface_id);569 auto surface = session->surface(surface_id);
544570
=== modified file 'tests/unit-tests/scene/test_application_session.cpp'
--- tests/unit-tests/scene/test_application_session.cpp 2016-04-04 03:30:04 +0000
+++ tests/unit-tests/scene/test_application_session.cpp 2016-04-12 14:23:09 +0000
@@ -223,6 +223,7 @@
223 std::shared_ptr<mtd::StubBufferStream> const stub_buffer_stream{std::make_shared<mtd::StubBufferStream>()};223 std::shared_ptr<mtd::StubBufferStream> const stub_buffer_stream{std::make_shared<mtd::StubBufferStream>()};
224 pid_t pid;224 pid_t pid;
225 std::string name;225 std::string name;
226 mg::BufferProperties properties { geom::Size{1,1}, mir_pixel_format_abgr_8888, mg::BufferUsage::hardware };
226};227};
227228
228struct MockSurfaceFactory : ms::SurfaceFactory229struct MockSurfaceFactory : ms::SurfaceFactory
@@ -246,10 +247,48 @@
246 auto session = make_application_session(247 auto session = make_application_session(
247 mt::fake_shared(surface_stack), mt::fake_shared(mock_surface_factory));248 mt::fake_shared(surface_stack), mt::fake_shared(mock_surface_factory));
248249
249 ms::SurfaceCreationParameters params;250 ms::SurfaceCreationParameters params = ms::a_surface()
250 auto surf = session->create_surface(params, event_sink);251 .with_buffer_stream(session->create_buffer_stream(properties));
251252 auto surf = session->create_surface(params, event_sink);
252 session->destroy_surface(surf);253
254 session->destroy_surface(surf);
255}
256
257TEST_F(ApplicationSession, attempt_to_destroy_non_existent_stream_throws)
258{
259 using namespace ::testing;
260 NiceMock<MockSurfaceFactory> mock_surface_factory;
261 NiceMock<mtd::MockSurfaceStack> surface_stack;
262 auto session = make_application_session(
263 mt::fake_shared(surface_stack), mt::fake_shared(mock_surface_factory));
264
265 mf::BufferStreamId made_up_id{332};
266 EXPECT_THROW({
267 session->destroy_buffer_stream(made_up_id);
268 }, std::runtime_error);
269}
270
271TEST_F(ApplicationSession, can_destroy_buffer_stream_after_destroying_surface)
272{
273 using namespace ::testing;
274
275 NiceMock<MockSurfaceFactory> mock_surface_factory;
276 NiceMock<mtd::MockSurfaceStack> surface_stack;
277 std::shared_ptr<ms::Surface> mock_surface = make_mock_surface();
278
279 EXPECT_CALL(mock_surface_factory, create_surface(_,_))
280 .WillOnce(Return(mock_surface));
281 EXPECT_CALL(surface_stack, add_surface(mock_surface,_));
282 auto session = make_application_session(
283 mt::fake_shared(surface_stack), mt::fake_shared(mock_surface_factory));
284
285 auto buffer_stream = session->create_buffer_stream(properties);
286 ms::SurfaceCreationParameters params = ms::a_surface()
287 .with_buffer_stream(buffer_stream);
288 auto surf = session->create_surface(params, event_sink);
289
290 session->destroy_surface(surf);
291 session->destroy_buffer_stream(buffer_stream);
253}292}
254293
255TEST_F(ApplicationSession, notifies_listener_of_create_and_destroy_surface)294TEST_F(ApplicationSession, notifies_listener_of_create_and_destroy_surface)
@@ -264,7 +303,8 @@
264303
265 auto session = make_application_session_with_listener(mt::fake_shared(listener));304 auto session = make_application_session_with_listener(mt::fake_shared(listener));
266305
267 ms::SurfaceCreationParameters params;306 ms::SurfaceCreationParameters params = ms::a_surface()
307 .with_buffer_stream(session->create_buffer_stream(properties));
268 auto surf = session->create_surface(params, event_sink);308 auto surf = session->create_surface(params, event_sink);
269309
270 session->destroy_surface(surf);310 session->destroy_surface(surf);
@@ -283,7 +323,8 @@
283 {323 {
284 auto session = make_application_session_with_listener(mt::fake_shared(listener));324 auto session = make_application_session_with_listener(mt::fake_shared(listener));
285325
286 ms::SurfaceCreationParameters params;326 ms::SurfaceCreationParameters params = ms::a_surface()
327 .with_buffer_stream(session->create_buffer_stream(properties));
287 session->create_surface(params, event_sink);328 session->create_surface(params, event_sink);
288 }329 }
289}330}
@@ -320,7 +361,8 @@
320361
321 auto app_session = make_application_session_with_stubs();362 auto app_session = make_application_session_with_stubs();
322363
323 ms::SurfaceCreationParameters params;364 ms::SurfaceCreationParameters params = ms::a_surface()
365 .with_buffer_stream(app_session->create_buffer_stream(properties));
324 auto id1 = app_session->create_surface(params, nullptr);366 auto id1 = app_session->create_surface(params, nullptr);
325 auto id2 = app_session->create_surface(params, nullptr);367 auto id2 = app_session->create_surface(params, nullptr);
326 auto id3 = app_session->create_surface(params, nullptr);368 auto id3 = app_session->create_surface(params, nullptr);
@@ -341,7 +383,8 @@
341TEST_F(ApplicationSession, foreign_surface_has_no_successor)383TEST_F(ApplicationSession, foreign_surface_has_no_successor)
342{384{
343 auto session1 = make_application_session_with_stubs();385 auto session1 = make_application_session_with_stubs();
344 ms::SurfaceCreationParameters params;386 ms::SurfaceCreationParameters params = ms::a_surface()
387 .with_buffer_stream(session1->create_buffer_stream(properties));
345 auto id1 = session1->create_surface(params, nullptr);388 auto id1 = session1->create_surface(params, nullptr);
346 auto surf1 = session1->surface(id1);389 auto surf1 = session1->surface(id1);
347 auto id2 = session1->create_surface(params, nullptr);390 auto id2 = session1->create_surface(params, nullptr);
@@ -358,7 +401,8 @@
358TEST_F(ApplicationSession, surface_after_one_is_self)401TEST_F(ApplicationSession, surface_after_one_is_self)
359{402{
360 auto session = make_application_session_with_stubs();403 auto session = make_application_session_with_stubs();
361 ms::SurfaceCreationParameters params;404 ms::SurfaceCreationParameters params = ms::a_surface()
405 .with_buffer_stream(session->create_buffer_stream(properties));
362 auto id = session->create_surface(params, nullptr);406 auto id = session->create_surface(params, nullptr);
363 auto surf = session->surface(id);407 auto surf = session->surface(id);
364408
@@ -371,7 +415,8 @@
371{415{
372 auto app_session = make_application_session_with_stubs();416 auto app_session = make_application_session_with_stubs();
373417
374 ms::SurfaceCreationParameters params;418 ms::SurfaceCreationParameters params = ms::a_surface()
419 .with_buffer_stream(app_session->create_buffer_stream(properties));
375420
376 int const N = 3;421 int const N = 3;
377 std::shared_ptr<ms::Surface> surf[N];422 std::shared_ptr<ms::Surface> surf[N];
@@ -412,7 +457,8 @@
412 EXPECT_CALL(*mock_surface, show()).Times(1);457 EXPECT_CALL(*mock_surface, show()).Times(1);
413 }458 }
414459
415 ms::SurfaceCreationParameters params;460 ms::SurfaceCreationParameters params = ms::a_surface()
461 .with_buffer_stream(app_session->create_buffer_stream(properties));
416 auto surf = app_session->create_surface(params, event_sink);462 auto surf = app_session->create_surface(params, event_sink);
417463
418 app_session->hide();464 app_session->hide();
@@ -447,7 +493,9 @@
447 mtd::StubDisplayConfig{},493 mtd::StubDisplayConfig{},
448 event_sink);494 event_sink);
449495
450 auto surface = app_session.create_surface(ms::SurfaceCreationParameters{}, event_sink);496 ms::SurfaceCreationParameters params = ms::a_surface()
497 .with_buffer_stream(app_session.create_buffer_stream(properties));
498 auto surface = app_session.create_surface(params, event_sink);
451 app_session.take_snapshot(ms::SnapshotCallback());499 app_session.take_snapshot(ms::SnapshotCallback());
452 app_session.destroy_surface(surface);500 app_session.destroy_surface(surface);
453}501}
@@ -492,42 +540,13 @@
492 EXPECT_THAT(app_session.process_id(), Eq(session_pid));540 EXPECT_THAT(app_session.process_id(), Eq(session_pid));
493}541}
494542
495TEST_F(ApplicationSession, surface_ids_are_bufferstream_ids)
496{
497 using namespace ::testing;
498
499 NiceMock<MockSurfaceFactory> mock_surface_factory;
500 NiceMock<MockBufferStreamFactory> mock_bufferstream_factory;
501 NiceMock<mtd::MockSurfaceStack> surface_stack;
502 std::shared_ptr<ms::Surface> mock_surface = make_mock_surface();
503 auto stub_bstream = std::make_shared<mtd::StubBufferStream>();
504 EXPECT_CALL(mock_bufferstream_factory, create_buffer_stream(_,_,_))
505 .WillOnce(Return(stub_bstream));
506 EXPECT_CALL(mock_surface_factory, create_surface(std::shared_ptr<mc::BufferStream>(stub_bstream),_))
507 .WillOnce(Return(mock_surface));
508 auto session = make_application_session(
509 mt::fake_shared(mock_bufferstream_factory),
510 mt::fake_shared(mock_surface_factory));
511
512 ms::SurfaceCreationParameters params;
513
514 auto id1 = session->create_surface(params, event_sink);
515 EXPECT_THAT(session->get_buffer_stream(mf::BufferStreamId(id1.as_value())), Eq(stub_bstream));
516 EXPECT_THAT(session->get_surface(id1), Eq(mock_surface));
517
518 session->destroy_surface(id1);
519
520 EXPECT_THROW({
521 session->get_buffer_stream(mf::BufferStreamId(id1.as_value()));
522 }, std::runtime_error);
523}
524
525TEST_F(ApplicationSession, can_destroy_surface_bstream)543TEST_F(ApplicationSession, can_destroy_surface_bstream)
526{544{
527 auto session = make_application_session_with_stubs();545 auto session = make_application_session_with_stubs();
528 ms::SurfaceCreationParameters params;546 mf::BufferStreamId stream_id = session->create_buffer_stream(properties);
547 ms::SurfaceCreationParameters params = ms::a_surface()
548 .with_buffer_stream(stream_id);
529 auto id = session->create_surface(params, event_sink);549 auto id = session->create_surface(params, event_sink);
530 mf::BufferStreamId stream_id(id.as_value());
531 session->destroy_buffer_stream(stream_id);550 session->destroy_buffer_stream(stream_id);
532 EXPECT_THROW({551 EXPECT_THROW({
533 session->get_buffer_stream(stream_id);552 session->get_buffer_stream(stream_id);
@@ -565,11 +584,8 @@
565 auto session = make_application_session(584 auto session = make_application_session(
566 mt::fake_shared(mock_bufferstream_factory),585 mt::fake_shared(mock_bufferstream_factory),
567 mt::fake_shared(mock_surface_factory));586 mt::fake_shared(mock_surface_factory));
568 auto stream_id0 = mf::BufferStreamId(
569 session->create_surface(
570 ms::a_surface().of_position({1,1}),
571 event_sink).as_value());
572587
588 auto stream_id0 = session->create_buffer_stream(stream_properties);
573 auto stream_id1 = session->create_buffer_stream(stream_properties);589 auto stream_id1 = session->create_buffer_stream(stream_properties);
574 auto stream_id2 = session->create_buffer_stream(stream_properties);590 auto stream_id2 = session->create_buffer_stream(stream_properties);
575591
@@ -578,6 +594,10 @@
578 {streams[0], geom::Displacement{-1,1}, {}},594 {streams[0], geom::Displacement{-1,1}, {}},
579 {streams[1], geom::Displacement{0,2}, {}}595 {streams[1], geom::Displacement{0,2}, {}}
580 };596 };
597
598 session->create_surface(
599 ms::a_surface().with_buffer_stream(stream_id0), event_sink);
600
581 EXPECT_CALL(*mock_surface, set_streams(Pointwise(StreamEq(), info)));601 EXPECT_CALL(*mock_surface, set_streams(Pointwise(StreamEq(), info)));
582 session->configure_streams(*mock_surface, {602 session->configure_streams(*mock_surface, {
583 {stream_id2, geom::Displacement{0,3}, {}},603 {stream_id2, geom::Displacement{0,3}, {}},
@@ -884,7 +904,8 @@
884 app_session.send_display_config(config);904 app_session.send_display_config(config);
885905
886 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}906 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
887 .of_size({100, 100});907 .of_size({100, 100})
908 .with_buffer_stream(app_session.create_buffer_stream(properties));
888 auto surf_id = app_session.create_surface(params, sender);909 auto surf_id = app_session.create_surface(params, sender);
889 auto surface = app_session.surface(surf_id);910 auto surface = app_session.surface(surf_id);
890911
@@ -909,7 +930,8 @@
909 }));930 }));
910931
911 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}932 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
912 .of_size({100, 100});933 .of_size({100, 100})
934 .with_buffer_stream(app_session.create_buffer_stream(properties));
913935
914 mf::SurfaceId ids[2];936 mf::SurfaceId ids[2];
915 std::shared_ptr<ms::Surface> surfaces[2];937 std::shared_ptr<ms::Surface> surfaces[2];
@@ -962,7 +984,8 @@
962 }));984 }));
963985
964 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}986 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
965 .of_size({100, 100});987 .of_size({100, 100})
988 .with_buffer_stream(app_session.create_buffer_stream(properties));
966989
967 auto id = app_session.create_surface(params, sender);990 auto id = app_session.create_surface(params, sender);
968 auto surface = app_session.surface(id);991 auto surface = app_session.surface(id);
@@ -1019,7 +1042,8 @@
1019 app_session.send_display_config(config);1042 app_session.send_display_config(config);
10201043
1021 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}1044 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
1022 .of_size({640, 480});1045 .of_size({640, 480})
1046 .with_buffer_stream(app_session.create_buffer_stream(properties));
10231047
1024 auto id = app_session.create_surface(params, sender);1048 auto id = app_session.create_surface(params, sender);
1025 auto surface = app_session.surface(id);1049 auto surface = app_session.surface(id);
@@ -1076,7 +1100,8 @@
1076 app_session.send_display_config(config);1100 app_session.send_display_config(config);
10771101
1078 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}1102 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
1079 .of_size({100, 100});1103 .of_size({100, 100})
1104 .with_buffer_stream(app_session.create_buffer_stream(properties));
10801105
1081 auto id = app_session.create_surface(params, sender);1106 auto id = app_session.create_surface(params, sender);
1082 auto surface = app_session.surface(id);1107 auto surface = app_session.surface(id);
@@ -1138,7 +1163,8 @@
1138 app_session.send_display_config(config);1163 app_session.send_display_config(config);
11391164
1140 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}1165 ms::SurfaceCreationParameters params = ms::SurfaceCreationParameters{}
1141 .of_size({100, 100});1166 .of_size({100, 100})
1167 .with_buffer_stream(app_session.create_buffer_stream(properties));
11421168
1143 auto id = app_session.create_surface(params, sender);1169 auto id = app_session.create_surface(params, sender);
1144 auto surface = app_session.surface(id);1170 auto surface = app_session.surface(id);
11451171
=== modified file 'tests/unit-tests/scene/test_session_manager.cpp'
--- tests/unit-tests/scene/test_session_manager.cpp 2016-01-29 08:18:22 +0000
+++ tests/unit-tests/scene/test_session_manager.cpp 2016-04-12 14:23:09 +0000
@@ -129,9 +129,13 @@
129 EXPECT_CALL(container, insert_session(_)).Times(1);129 EXPECT_CALL(container, insert_session(_)).Times(1);
130 EXPECT_CALL(container, remove_session(_)).Times(1);130 EXPECT_CALL(container, remove_session(_)).Times(1);
131131
132 mg::BufferProperties properties {
133 geom::Size{1,1}, mir_pixel_format_abgr_8888, mg::BufferUsage::software };
132 auto session = session_manager.open_session(__LINE__, "Visual Basic Studio", mt::fake_shared(event_sink));134 auto session = session_manager.open_session(__LINE__, "Visual Basic Studio", mt::fake_shared(event_sink));
133 session->create_surface(135 session->create_surface(
134 ms::a_surface().of_size(geom::Size{geom::Width{1024}, geom::Height{768}}),136 ms::a_surface()
137 .of_size(geom::Size{geom::Width{1024}, geom::Height{768}})
138 .with_buffer_stream(session->create_buffer_stream(properties)),
135 mt::fake_shared(event_sink));139 mt::fake_shared(event_sink));
136140
137 session_manager.close_session(session);141 session_manager.close_session(session);

Subscribers

People subscribed via source and target branches