From db0da1f33c7d688e84e9cd7ff0551842bb68ca6f Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 17 Jan 2019 17:24:25 +0200 Subject: card: another try with card constructors Let's try again with the card constructors. Card::open_modesetting_card() is removed. The main constructor is Card(const std::string& dev_path = ""). If dev_path is set, the device node with that path is used. If dev_path is not set, the behavior is similar as previously, except a modeset capable card is used at the third step: - If KMSXX_DEVICE env variable is set, the card device with that path is opened. - If KMSXX_DRIVER env variable is set, the card with the given driver name and index is opened. The format is either "drvname" or "drvname:idx". - If neither env variable is given, the first modeset capable card is opened. Signed-off-by: Tomi Valkeinen --- kms++/inc/kms++/card.h | 5 +---- kms++/inc/kms++/omap/omapcard.h | 3 +-- kms++/src/card.cpp | 37 +++++++++++++++++++++++-------------- kms++/src/omap/omapcard.cpp | 5 ----- utils/kmsblank.cpp | 2 +- utils/kmsprint.cpp | 2 +- utils/kmstest.cpp | 2 +- utils/kmsview.cpp | 2 +- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h index a2c27f8..099d5b5 100644 --- a/kms++/inc/kms++/card.h +++ b/kms++/inc/kms++/card.h @@ -14,10 +14,7 @@ class Card { friend class Framebuffer; public: - static std::unique_ptr open_modesetting_card(); - - Card(); - Card(const std::string& dev_path); + Card(const std::string& dev_path = ""); Card(const std::string& driver, uint32_t idx); virtual ~Card(); diff --git a/kms++/inc/kms++/omap/omapcard.h b/kms++/inc/kms++/omap/omapcard.h index 5c2f3a5..2f1f528 100644 --- a/kms++/inc/kms++/omap/omapcard.h +++ b/kms++/inc/kms++/omap/omapcard.h @@ -9,8 +9,7 @@ namespace kms class OmapCard : public Card { public: - OmapCard(); - OmapCard(const std::string& device); + OmapCard(const std::string& device = ""); virtual ~OmapCard(); struct omap_device* dev() const { return m_omap_dev; } diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp index 85c693b..8de8b82 100644 --- a/kms++/src/card.cpp +++ b/kms++/src/card.cpp @@ -39,15 +39,29 @@ static vector glob(const string& pattern) return filenames; } -unique_ptr Card::open_modesetting_card() +static int open_first_kms_device() { vector paths = glob("/dev/dri/card*"); for (const string& path : paths) { - unique_ptr card = unique_ptr(new Card(path)); + int fd = open(path.c_str(), O_RDWR | O_CLOEXEC); + if (fd < 0) + throw invalid_argument(string(strerror(errno)) + " opening device " + path); - if (card->has_kms()) - return card; + auto res = drmModeGetResources(fd); + if (!res) { + close(fd); + continue; + } + + bool has_kms = res->count_crtcs > 0 && res->count_connectors > 0 && res->count_encoders > 0; + + drmModeFreeResources(res); + + if (has_kms) + return fd; + + close(fd); } throw runtime_error("No modesetting DRM card found"); @@ -90,12 +104,14 @@ static int open_device_by_driver(string name, uint32_t idx) throw invalid_argument("Failed to find a DRM device " + name + ":" + to_string(idx)); } -Card::Card() +Card::Card(const std::string& dev_path) { const char* drv_p = getenv("KMSXX_DRIVER"); const char* dev_p = getenv("KMSXX_DEVICE"); - if (dev_p) { + if (!dev_path.empty()) { + m_fd = open_device_by_path(dev_path); + } else if (dev_p) { string dev(dev_p); m_fd = open_device_by_path(dev); } else if (drv_p) { @@ -119,7 +135,7 @@ Card::Card() m_fd = open_device_by_driver(name, num); } else { - m_fd = open_device_by_path("/dev/dri/card0"); + m_fd = open_first_kms_device(); } setup(); @@ -132,13 +148,6 @@ Card::Card(const std::string& driver, uint32_t idx) setup(); } -Card::Card(const std::string& dev_path) -{ - m_fd = open_device_by_path(dev_path); - - setup(); -} - void Card::setup() { drmVersionPtr ver = drmGetVersion(m_fd); diff --git a/kms++/src/omap/omapcard.cpp b/kms++/src/omap/omapcard.cpp index e811b6d..5e21c75 100644 --- a/kms++/src/omap/omapcard.cpp +++ b/kms++/src/omap/omapcard.cpp @@ -9,11 +9,6 @@ using namespace std; namespace kms { -OmapCard::OmapCard() - : OmapCard("/dev/dri/card0") -{ - -} OmapCard::OmapCard(const string& device) : Card(device) diff --git a/utils/kmsblank.cpp b/utils/kmsblank.cpp index 0b51810..286c7f7 100644 --- a/utils/kmsblank.cpp +++ b/utils/kmsblank.cpp @@ -27,7 +27,7 @@ static void usage() int main(int argc, char **argv) { - string dev_path = "/dev/dri/card0"; + string dev_path; vector conn_strs; uint32_t time = 0; diff --git a/utils/kmsprint.cpp b/utils/kmsprint.cpp index 19cf8b7..9f550c7 100644 --- a/utils/kmsprint.cpp +++ b/utils/kmsprint.cpp @@ -497,7 +497,7 @@ static void usage() int main(int argc, char **argv) { - string dev_path = "/dev/dri/card0"; + string dev_path; OptionSet optionset = { Option("|device=", [&dev_path](string s) diff --git a/utils/kmstest.cpp b/utils/kmstest.cpp index 37f9e0f..8144117 100644 --- a/utils/kmstest.cpp +++ b/utils/kmstest.cpp @@ -444,7 +444,7 @@ struct Arg string arg; }; -static string s_device_path = "/dev/dri/card0"; +static string s_device_path; static vector parse_cmdline(int argc, char **argv) { diff --git a/utils/kmsview.cpp b/utils/kmsview.cpp index 04d005d..eea9dde 100644 --- a/utils/kmsview.cpp +++ b/utils/kmsview.cpp @@ -38,7 +38,7 @@ static void usage() int main(int argc, char** argv) { uint32_t time = 0; - string dev_path = "/dev/dri/card0"; + string dev_path; string conn_name; OptionSet optionset = { -- cgit v1.2.3