Mir
display.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2013 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Eleni Maria Stea <elenimaria.stea@canonical.com>
17  */
18 
19 #ifndef MIR_GRAPHICS_NESTED_DISPLAY_H_
20 #define MIR_GRAPHICS_NESTED_DISPLAY_H_
21 
22 #include "mir/graphics/display.h"
26 
28 
29 #include <EGL/egl.h>
30 
31 #include <mutex>
32 #include <unordered_map>
33 
34 namespace mir
35 {
36 namespace input
37 {
38 class InputDispatcher;
39 class CursorListener;
40 }
41 namespace geometry
42 {
43 struct Rectangle;
44 }
45 namespace graphics
46 {
47 class DisplayReport;
48 class DisplayBuffer;
49 class DisplayConfigurationPolicy;
50 class GLConfig;
51 class Platform;
52 
53 namespace nested
54 {
55 class NestedDisplayConfiguration;
56 
57 namespace detail
58 {
59 
61 {
62 public:
63  explicit EGLSurfaceHandle(EGLDisplay display, EGLNativeWindowType native_window, EGLConfig cfg);
64  ~EGLSurfaceHandle() noexcept;
65 
66  operator EGLSurface() const { return egl_surface; }
67 
68 private:
69  EGLDisplay const egl_display;
70  EGLSurface const egl_surface;
71 };
72 
74 {
75 public:
76  EGLDisplayHandle(EGLNativeDisplayType native_display,
77  std::shared_ptr<GLConfig> const& gl_config);
78  ~EGLDisplayHandle() noexcept;
79 
80  void initialize(MirPixelFormat format);
81  EGLConfig choose_windowed_es_config(MirPixelFormat format) const;
82  EGLContext egl_context() const;
83  std::unique_ptr<graphics::GLContext> create_gl_context();
84 
85  operator EGLDisplay() const { return egl_display; }
86 
87 private:
88  EGLDisplay egl_display;
89  EGLContext egl_context_;
90  std::shared_ptr<GLConfig> const gl_config;
91  MirPixelFormat pixel_format;
92 
93  EGLDisplayHandle(EGLDisplayHandle const&) = delete;
94  EGLDisplayHandle operator=(EGLDisplayHandle const&) = delete;
95 };
96 
97 class DisplayBuffer;
98 
100 {
101 public:
102  DisplaySyncGroup(std::shared_ptr<detail::DisplayBuffer> const& output);
103  void for_each_display_buffer(std::function<void(graphics::DisplayBuffer&)> const&) override;
104  void post() override;
105  std::chrono::milliseconds recommended_sleep() const override;
106 
107  geometry::Rectangle view_area() const;
108 private:
109  std::shared_ptr<detail::DisplayBuffer> const output;
110 };
111 
112 extern EGLint const nested_egl_context_attribs[];
113 }
114 
115 class HostConnection;
116 
118 {
119 public:
120  Display(
121  std::shared_ptr<Platform> const& platform,
122  std::shared_ptr<HostConnection> const& connection,
123  std::shared_ptr<input::InputDispatcher> const& dispatcher,
124  std::shared_ptr<DisplayReport> const& display_report,
125  std::shared_ptr<DisplayConfigurationPolicy> const& conf_policy,
126  std::shared_ptr<GLConfig> const& gl_config,
127  std::shared_ptr<input::CursorListener> const& cursor_listener);
128 
129  ~Display() noexcept;
130 
131  void for_each_display_sync_group(std::function<void(DisplaySyncGroup&)>const& f) override;
132 
133  std::unique_ptr<DisplayConfiguration> configuration() const override;
134  void configure(DisplayConfiguration const&) override;
135 
136  void register_configuration_change_handler(
137  EventHandlerRegister& handlers,
138  DisplayConfigurationChangeHandler const& conf_change_handler) override;
139 
140  void register_pause_resume_handlers(
141  EventHandlerRegister& handlers,
142  DisplayPauseHandler const& pause_handler,
143  DisplayResumeHandler const& resume_handler) override;
144 
145  void pause() override;
146  void resume() override;
147 
148  std::shared_ptr<graphics::Cursor> create_hardware_cursor(std::shared_ptr<CursorImage> const& initial_image) override;
149  std::unique_ptr<graphics::GLContext> create_gl_context() override;
150  std::unique_ptr<VirtualOutput> create_virtual_output(int width, int height) override;
151 
152 private:
153  std::shared_ptr<Platform> const platform;
154  std::shared_ptr<HostConnection> const connection;
155  std::shared_ptr<input::InputDispatcher> const dispatcher;
156  std::shared_ptr<DisplayReport> const display_report;
157  detail::EGLDisplayHandle egl_display;
158  std::shared_ptr<input::CursorListener> const cursor_listener;
159 
160  std::mutex outputs_mutex;
161  std::unordered_map<DisplayConfigurationOutputId, std::shared_ptr<detail::DisplaySyncGroup>> outputs;
162 
163  std::mutex mutable configuration_mutex;
164  std::unique_ptr<NestedDisplayConfiguration> current_configuration;
165 
166  void create_surfaces(mir::graphics::DisplayConfiguration const& configuration);
167  void complete_display_initialization(MirPixelFormat format);
168 };
169 
170 }
171 }
172 }
173 
174 #endif // MIR_GRAPHICS_NESTED_DISPLAY_H_
void initialize(std::shared_ptr< mir::logging::Logger > const &logger)
All things Mir.
Definition: atomic_callback.h:25
Interface to an output framebuffer.
Definition: display_buffer.h:47
DisplaySyncGroup represents a group of displays that need to be output in unison as a single post() c...
Definition: display.h:55
Definition: host_connection.h:40
Definition: display.h:117
std::function< bool()> DisplayResumeHandler
Definition: display.h:41
EGLint const nested_egl_context_attribs[]
unsigned int width
Definition: touchspot_image.c:4
MirPixelFormat
32-bit pixel formats (8888): The order of components in the enum matches the order of the components ...
Definition: common.h:134
Definition: display_buffer.h:44
std::function< bool()> DisplayPauseHandler
Definition: display.h:38
Definition: rectangle.h:33
unsigned int height
Definition: touchspot_image.c:5
#define EGLNativeWindowType
Definition: client_buffer_stream.h:56
Interface to the display subsystem.
Definition: display.h:88
std::function< void()> DisplayConfigurationChangeHandler
Definition: display.h:42
Interface to a configuration of display cards and outputs.
Definition: display_configuration.h:167
Definition: event_handler_register.h:32

Copyright © 2012-2015 Canonical Ltd.
Generated on Wed Mar 30 00:29:56 UTC 2016