16
16
* Authored by: Alexandros Frantzis <alexandros.frantzis@canonical.com>
19
20
#include "real_kms_output_container.h"
20
21
#include "real_kms_output.h"
22
#include "kms-utils/drm_mode_resources.h"
22
24
namespace mgm = mir::graphics::mesa;
24
26
mgm::RealKMSOutputContainer::RealKMSOutputContainer(
25
int drm_fd, std::shared_ptr<PageFlipper> const& page_flipper)
27
page_flipper{page_flipper}
31
std::shared_ptr<mgm::KMSOutput>
32
mgm::RealKMSOutputContainer::get_kms_output_for(uint32_t connector_id)
34
std::shared_ptr<KMSOutput> output;
36
auto output_iter = outputs.find(connector_id);
37
if (output_iter == outputs.end())
39
output = std::make_shared<RealKMSOutput>(drm_fd, connector_id, page_flipper);
40
outputs[connector_id] = output;
44
output = output_iter->second;
50
void mgm::RealKMSOutputContainer::for_each_output(std::function<void(KMSOutput&)> functor) const
52
for(auto& pair: outputs)
53
functor(*pair.second);
27
std::vector<int> const& drm_fds,
28
std::function<std::shared_ptr<PageFlipper>(int)> const& construct_page_flipper)
30
construct_page_flipper{construct_page_flipper}
34
void mgm::RealKMSOutputContainer::for_each_output(std::function<void(std::shared_ptr<KMSOutput> const&)> functor) const
36
for(auto& output: outputs)
40
void mgm::RealKMSOutputContainer::update_from_hardware_state()
42
decltype(outputs) new_outputs;
44
for (auto drm_fd : drm_fds)
46
kms::DRMModeResources resources{drm_fd};
49
for (auto &&connector : resources.connectors())
51
// Caution: O(n²) here, but n is the number of outputs, so should
52
// conservatively be << 100.
53
auto existing_output = std::find_if(
56
[&connector, drm_fd](auto const &candidate)
59
connector->connector_id == candidate->id() &&
60
drm_fd == candidate->drm_fd();
63
if (existing_output != outputs.end())
65
// We could drop this down to O(n) by being smarter about moving out
66
// of the outputs vector.
68
// That's a bit of a faff, so just do the simple thing for now.
69
new_outputs.push_back(*existing_output);
70
new_outputs.back()->refresh_hardware_state();
74
new_outputs.push_back(std::make_shared<RealKMSOutput>(
77
construct_page_flipper(drm_fd)));
82
outputs = new_outputs;