Mir
buffer_queue.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2014-2015 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  */
17 
18 #ifndef MIR_BUFFER_QUEUE_H_
19 #define MIR_BUFFER_QUEUE_H_
20 
23 #include "buffer_bundle.h"
24 
25 #include <mutex>
26 #include <condition_variable>
27 #include <queue>
28 #include <vector>
29 
30 namespace mir
31 {
32 namespace graphics
33 {
34 class Buffer;
35 class GraphicBufferAllocator;
36 }
37 namespace compositor
38 {
39 
40 class BufferQueue : public BufferBundle
41 {
42 public:
43  typedef std::function<void(graphics::Buffer* buffer)> Callback;
44 
45  BufferQueue(int nbuffers,
46  std::shared_ptr<graphics::GraphicBufferAllocator> const& alloc,
47  graphics::BufferProperties const& props,
48  FrameDroppingPolicyFactory const& policy_provider);
49 
50  void client_acquire(Callback complete) override;
51  void client_release(graphics::Buffer* buffer) override;
52  std::shared_ptr<graphics::Buffer> compositor_acquire(void const* user_id) override;
53  void compositor_release(std::shared_ptr<graphics::Buffer> const& buffer) override;
54  std::shared_ptr<graphics::Buffer> snapshot_acquire() override;
55  void snapshot_release(std::shared_ptr<graphics::Buffer> const& buffer) override;
56 
57  graphics::BufferProperties properties() const override;
58  void allow_framedropping(bool dropping_allowed) override;
59  void force_requests_to_complete() override;
60  void resize(const geometry::Size &newsize) override;
61  int buffers_ready_for_compositor(void const* user_id) const override;
62  int buffers_free_for_client() const override;
63  bool framedropping_allowed() const;
64  bool is_a_current_buffer_user(void const* user_id) const;
65  void drop_old_buffers() override;
66  void drop_client_requests() override;
67 
68 private:
69  enum SnapshotWait
70  {
71  wait_for_snapshot,
72  ignore_snapshot
73  };
74  void give_buffer_to_client(graphics::Buffer* buffer,
75  std::unique_lock<std::mutex>& lock);
76  void give_buffer_to_client(graphics::Buffer* buffer,
77  std::unique_lock<std::mutex>& lock, SnapshotWait wait_type);
78  void release(graphics::Buffer* buffer,
79  std::unique_lock<std::mutex> lock);
80  void drop_frame(std::unique_lock<std::mutex>& lock, SnapshotWait wait_type);
81 
82  mutable std::mutex guard;
83  std::unique_lock<decltype(guard)> guard_lock;
84 
85  std::vector<std::shared_ptr<graphics::Buffer>> buffers;
86  std::deque<graphics::Buffer*> ready_to_composite_queue;
87  std::deque<graphics::Buffer*> buffers_owned_by_client;
88  std::vector<graphics::Buffer*> free_buffers;
89  std::vector<graphics::Buffer*> buffers_sent_to_compositor;
90  std::vector<graphics::Buffer*> pending_snapshots;
91 
92  std::vector<void const*> current_buffer_users;
93  graphics::Buffer* current_compositor_buffer;
94 
95  std::deque<Callback> pending_client_notifications;
96 
97  int nbuffers;
98  bool frame_dropping_enabled;
99  graphics::BufferProperties the_properties;
100  bool force_new_compositor_buffer;
101  bool callbacks_allowed;
102 
103  std::condition_variable snapshot_released;
104  std::shared_ptr<graphics::GraphicBufferAllocator> gralloc;
105 
106  // Ensure framedrop_policy gets destroyed first so the callback installed
107  // does not access dead objects.
108  std::unique_ptr<FrameDroppingPolicy> framedrop_policy;
109 };
110 
111 }
112 }
113 
114 #endif
Definition: size.h:30
int buffers_free_for_client() const override
Return the number of client acquisitions that can be completed synchronously without blocking...
Definition: buffer_queue.cpp:377
All things Mir.
Definition: buffer_stream.h:37
Definition: buffer_bundle.h:33
void force_requests_to_complete() override
Definition: buffer_queue.cpp:341
void allow_framedropping(bool dropping_allowed) override
Definition: buffer_queue.cpp:329
void drop_old_buffers() override
Definition: buffer_queue.cpp:538
std::shared_ptr< graphics::Buffer > snapshot_acquire() override
Definition: buffer_queue.cpp:304
void drop_client_requests() override
Definition: buffer_queue.cpp:557
void client_acquire(Callback complete) override
Definition: buffer_queue.cpp:149
void compositor_release(std::shared_ptr< graphics::Buffer > const &buffer) override
Definition: buffer_queue.cpp:264
bool framedropping_allowed() const
Definition: buffer_queue.cpp:335
std::shared_ptr< graphics::Buffer > compositor_acquire(void const *user_id) override
Acquire the next buffer that's ready to display/composite.
Definition: buffer_queue.cpp:211
bool is_a_current_buffer_user(void const *user_id) const
Definition: buffer_queue.cpp:442
void client_release(graphics::Buffer *buffer) override
Definition: buffer_queue.cpp:190
graphics::BufferProperties properties() const override
Definition: buffer_queue.cpp:323
Definition: buffer_queue.h:40
Buffer creation properties.
Definition: buffer_properties.h:48
void resize(const geometry::Size &newsize) override
Definition: buffer_queue.cpp:356
BufferQueue(int nbuffers, std::shared_ptr< graphics::GraphicBufferAllocator > const &alloc, graphics::BufferProperties const &props, FrameDroppingPolicyFactory const &policy_provider)
Definition: buffer_queue.cpp:94
Definition: buffer.h:34
Creator of FrameDroppingPolicies.
Definition: frame_dropping_policy_factory.h:38
void snapshot_release(std::shared_ptr< graphics::Buffer > const &buffer) override
Definition: buffer_queue.cpp:311
std::function< void(graphics::Buffer *buffer)> Callback
Definition: buffer_queue.h:43
int buffers_ready_for_compositor(void const *user_id) const override
Definition: buffer_queue.cpp:362

Copyright © 2012,2013 Canonical Ltd.
Generated on Tue Mar 24 16:15:19 UTC 2015