Mir
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
buffer_queue.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2014 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() 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 
67 private:
68  void give_buffer_to_client(graphics::Buffer* buffer,
69  std::unique_lock<std::mutex> lock);
70  void release(graphics::Buffer* buffer,
71  std::unique_lock<std::mutex> lock);
72  void drop_frame(std::unique_lock<std::mutex> lock);
73 
74  mutable std::mutex guard;
75 
76  std::vector<std::shared_ptr<graphics::Buffer>> buffers;
77  std::deque<graphics::Buffer*> ready_to_composite_queue;
78  std::deque<graphics::Buffer*> buffers_owned_by_client;
79  std::vector<graphics::Buffer*> free_buffers;
80  std::vector<graphics::Buffer*> buffers_sent_to_compositor;
81  std::vector<graphics::Buffer*> pending_snapshots;
82 
83  std::vector<void const*> current_buffer_users;
84  graphics::Buffer* current_compositor_buffer;
85 
86  std::deque<Callback> pending_client_notifications;
87 
88  int nbuffers;
89  bool frame_dropping_enabled;
90  graphics::BufferProperties the_properties;
91  bool force_new_compositor_buffer;
92 
93  std::condition_variable snapshot_released;
94  std::shared_ptr<graphics::GraphicBufferAllocator> gralloc;
95 
96  // Ensure framedrop_policy gets destroyed first so the callback installed
97  // does not access dead objects.
98  std::unique_ptr<FrameDroppingPolicy> framedrop_policy;
99 };
100 
101 }
102 }
103 
104 #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:396
All things Mir.
Definition: aging_buffer.h:24
Definition: buffer_bundle.h:33
void force_requests_to_complete() override
Definition: buffer_queue.cpp:364
void allow_framedropping(bool dropping_allowed) override
Definition: buffer_queue.cpp:352
void drop_old_buffers() override
Definition: buffer_queue.cpp:487
std::shared_ptr< graphics::Buffer > snapshot_acquire() override
Definition: buffer_queue.cpp:327
void client_acquire(Callback complete) override
Definition: buffer_queue.cpp:172
void compositor_release(std::shared_ptr< graphics::Buffer > const &buffer) override
Definition: buffer_queue.cpp:287
bool framedropping_allowed() const
Definition: buffer_queue.cpp:358
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:234
int buffers_ready_for_compositor() const override
Definition: buffer_queue.cpp:385
bool is_a_current_buffer_user(void const *user_id) const
Definition: buffer_queue.cpp:450
void client_release(graphics::Buffer *buffer) override
Definition: buffer_queue.cpp:213
graphics::BufferProperties properties() const override
Definition: buffer_queue.cpp:346
Definition: buffer_queue.h:40
Buffer creation properties.
Definition: buffer_properties.h:48
void resize(const geometry::Size &newsize) override
Definition: buffer_queue.cpp:379
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:37
void snapshot_release(std::shared_ptr< graphics::Buffer > const &buffer) override
Definition: buffer_queue.cpp:334
std::function< void(graphics::Buffer *buffer)> Callback
Definition: buffer_queue.h:43

Copyright © 2012,2013 Canonical Ltd.
Generated on Fri Oct 10 14:07:14 UTC 2014