29
29
mclg::GBMClientBufferDepository::GBMClientBufferDepository(
30
30
std::shared_ptr<DRMFDHandler> const& drm_fd_handler)
31
: drm_fd_handler{drm_fd_handler}
31
: current_buffer(buffers.end()), drm_fd_handler{drm_fd_handler}
35
35
void mclg::GBMClientBufferDepository::deposit_package(std::shared_ptr<mir_toolkit::MirBufferPackage>&& package, int id, geometry::Size size, geometry::PixelFormat pf)
37
auto buffer_it = buffers.begin();
38
while (buffer_it != buffers.end())
40
// C++ guarantees that buffers.erase() will only invalidate the iterator
41
// we erase. Move to the next buffer before we potentially invalidate our
43
auto current = buffer_it;
46
if (current->first == current_buffer)
48
current->second->mark_as_submitted();
52
if (current->second->age() >= 2 && (current->first != static_cast<uint32_t>(id)))
54
buffers.erase(current);
58
current->second->increment_age();
62
if (buffers.count(id) == 0)
63
buffers[id] = std::make_shared<mclg::GBMClientBuffer>(drm_fd_handler, std::move(package), size, pf);
37
for (auto next = buffers.begin(); next != buffers.end();)
39
// C++ guarantees that buffers.erase() will only invalidate the iterator we
40
// erase. Move to the next buffer before we potentially invalidate our iterator.
44
if (current != current_buffer &&
45
current->first != id &&
46
current->second->age() >= 2)
48
buffers.erase(current);
52
for (auto& current : buffers)
54
current.second->increment_age();
57
if (current_buffer != buffers.end())
59
current_buffer->second->mark_as_submitted();
62
current_buffer = buffers.find(id);
64
if (current_buffer == buffers.end())
66
auto new_buffer = std::make_shared<mclg::GBMClientBuffer>(drm_fd_handler, std::move(package), size, pf);
68
current_buffer = buffers.insert(current_buffer, std::make_pair(id, new_buffer));
67
72
std::shared_ptr<mcl::ClientBuffer> mclg::GBMClientBufferDepository::access_current_buffer()
69
return buffers[current_buffer];
74
return current_buffer->second;