MythTV master
mythdrmcrtc.cpp
Go to the documentation of this file.
1// MythTV
3
4#include <algorithm>
5
12DRMCrtc MythDRMCrtc::Create(int FD, uint32_t Id, int Index)
13{
14 if (FD && Id)
15 if (auto crtc = std::shared_ptr<MythDRMCrtc>(new MythDRMCrtc(FD, Id, Index)); crtc.get() && crtc->m_id)
16 return crtc;
17
18 return nullptr;
19}
20
21DRMCrtc MythDRMCrtc::GetCrtc(const DRMCrtcs &Crtcs, uint32_t Id)
22{
23 auto found = std::ranges::find(Crtcs, Id, &MythDRMCrtc::m_id);
24 if (found != Crtcs.end())
25 return *found;
26 return nullptr;
27}
28
30{
31 DRMCrtcs result;
32 if (auto resources = MythDRMResources(FD); *resources)
33 {
34 for (auto i = 0; i < resources->count_crtcs; ++i)
35 if (auto crtc = Create(FD, resources->crtcs[i], i); crtc.get())
36 result.emplace_back(crtc);
37 }
38 return result;
39}
40
41MythDRMCrtc::MythDRMCrtc(int FD, uint32_t Id, int Index)
42{
43 if (auto * crtc = drmModeGetCrtc(FD, Id); crtc)
44 {
45 m_index = Index;
46 m_id = crtc->crtc_id;
47 m_fbId = crtc->buffer_id;
48 m_x = crtc->x;
49 m_y = crtc->y;
50 m_width = crtc->width;
51 m_height = crtc->height;
52 if (crtc->mode_valid)
53 m_mode = MythDRMMode::Create(&crtc->mode, 0);
54 m_properties = MythDRMProperty::GetProperties(FD, m_id, DRM_MODE_OBJECT_CRTC);
55 drmModeFreeCrtc(crtc);
56
57 if (m_index < 0)
58 m_index = RetrieveCRTCIndex(FD, Id);
59 }
60}
61
62int MythDRMCrtc::RetrieveCRTCIndex(int FD, uint32_t Id)
63{
64 int result = -1;
65 if (auto resources = MythDRMResources(FD); *resources)
66 {
67 for (auto i = 0; i < resources->count_crtcs; ++i)
68 {
69 if (auto * crtc = drmModeGetCrtc(FD, resources->crtcs[i]); crtc)
70 {
71 bool match = crtc->crtc_id == Id;
72 drmModeFreeCrtc(crtc);
73 if (match)
74 {
75 result = i;
76 break;
77 }
78 }
79 }
80 }
81 return result;
82}
uint32_t m_x
Definition: mythdrmcrtc.h:22
uint32_t m_y
Definition: mythdrmcrtc.h:23
DRMProps m_properties
Definition: mythdrmcrtc.h:26
uint32_t m_height
Definition: mythdrmcrtc.h:25
static int RetrieveCRTCIndex(int FD, uint32_t Id)
Definition: mythdrmcrtc.cpp:62
static DRMCrtc Create(int FD, uint32_t Id, int Index=-1)
Definition: mythdrmcrtc.cpp:12
uint32_t m_fbId
Definition: mythdrmcrtc.h:20
MythDRMCrtc(int FD, uint32_t Id, int Index)
Definition: mythdrmcrtc.cpp:41
uint32_t m_width
Definition: mythdrmcrtc.h:24
static DRMCrtcs GetCrtcs(int FD)
Definition: mythdrmcrtc.cpp:29
uint32_t m_id
Definition: mythdrmcrtc.h:19
DRMMode m_mode
Definition: mythdrmcrtc.h:21
static DRMCrtc GetCrtc(const DRMCrtcs &Crtcs, uint32_t Id)
Definition: mythdrmcrtc.cpp:21
static DRMMode Create(drmModeModeInfoPtr Mode, int Index)
Definition: mythdrmmode.cpp:7
static DRMProps GetProperties(int FD, uint32_t ObjectId, uint32_t ObjectType)
A simple wrapper around a drmModeResPtr that ensures proper cleanup.
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
std::shared_ptr< class MythDRMCrtc > DRMCrtc
Definition: mythdrmcrtc.h:8
std::vector< DRMCrtc > DRMCrtcs
Definition: mythdrmcrtc.h:9