diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/kmstest.cpp | 61 |
1 files changed, 20 insertions, 41 deletions
diff --git a/utils/kmstest.cpp b/utils/kmstest.cpp index 21309d6..fee3070 100644 --- a/utils/kmstest.cpp +++ b/utils/kmstest.cpp @@ -56,9 +56,6 @@ static bool s_cvt_v2; static bool s_cvt_vid_opt; static unsigned s_max_flips; -static set<Crtc*> s_used_crtcs; -static set<Plane*> s_used_planes; - __attribute__ ((unused)) static void print_regex_match(smatch sm) { @@ -82,28 +79,15 @@ static void get_connector(ResourceManager& resman, OutputInfo& output, const str output.mode = output.connector->get_default_mode(); } -static void get_default_crtc(Card& card, OutputInfo& output) +static void get_default_crtc(ResourceManager& resman, OutputInfo& output) { - Crtc* crtc = output.connector->get_current_crtc(); - - if (crtc && s_used_crtcs.find(crtc) == s_used_crtcs.end()) { - s_used_crtcs.insert(crtc); - output.crtc = crtc; - return; - } - - for (const auto& possible : output.connector->get_possible_crtcs()) { - if (s_used_crtcs.find(possible) == s_used_crtcs.end()) { - s_used_crtcs.insert(possible); - output.crtc = possible; - return; - } - } + output.crtc = resman.reserve_crtc(output.connector); - EXIT("Could not find available crtc"); + if (!output.crtc) + EXIT("Could not find available crtc"); } -static void parse_crtc(Card& card, const string& crtc_str, OutputInfo& output) +static void parse_crtc(ResourceManager& resman, Card& card, const string& crtc_str, OutputInfo& output) { // @12:1920x1200i@60 // @12:33000000,800/210/30/16/-,480/22/13/10/-,i @@ -226,9 +210,12 @@ static void parse_crtc(Card& card, const string& crtc_str, OutputInfo& output) } else { EXIT("Failed to parse crtc option '%s'", crtc_str.c_str()); } + + if (!resman.reserve_crtc(output.crtc)) + EXIT("Could not find available crtc"); } -static void parse_plane(Card& card, const string& plane_str, const OutputInfo& output, PlaneInfo& pinfo) +static void parse_plane(ResourceManager& resman, Card& card, const string& plane_str, const OutputInfo& output, PlaneInfo& pinfo) { // 3:400,400-400x400 const regex plane_re("(?:(@?)(\\d+):)?" // 3: @@ -257,22 +244,14 @@ static void parse_plane(Card& card, const string& plane_str, const OutputInfo& o pinfo.plane = planes[num]; } - } else { - for (Plane* p : output.crtc->get_possible_planes()) { - if (s_used_planes.find(p) != s_used_planes.end()) - continue; - - if (p->plane_type() != PlaneType::Overlay) - continue; - pinfo.plane = p; - } - - if (!pinfo.plane) - EXIT("Failed to find available plane"); + pinfo.plane = resman.reserve_plane(pinfo.plane); + } else { + pinfo.plane = resman.reserve_overlay_plane(output.crtc); } - s_used_planes.insert(pinfo.plane); + if (!pinfo.plane) + EXIT("Failed to find available plane"); pinfo.w = stoul(sm[5]); pinfo.h = stoul(sm[6]); @@ -540,7 +519,7 @@ static vector<OutputInfo> setups_to_outputs(Card& card, ResourceManager& resman, if (!current_output->connector) get_connector(resman, *current_output); - parse_crtc(card, arg.arg, *current_output); + parse_crtc(resman, card, arg.arg, *current_output); current_output->user_set_crtc = true; @@ -560,12 +539,12 @@ static vector<OutputInfo> setups_to_outputs(Card& card, ResourceManager& resman, get_connector(resman, *current_output); if (!current_output->crtc) - get_default_crtc(card, *current_output); + get_default_crtc(resman, *current_output); current_output->planes.push_back(PlaneInfo { }); current_plane = ¤t_output->planes.back(); - parse_plane(card, arg.arg, *current_output, *current_plane); + parse_plane(resman, card, arg.arg, *current_output, *current_plane); break; } @@ -581,7 +560,7 @@ static vector<OutputInfo> setups_to_outputs(Card& card, ResourceManager& resman, get_connector(resman, *current_output); if (!current_output->crtc) - get_default_crtc(card, *current_output); + get_default_crtc(resman, *current_output); int def_w, def_h; @@ -617,7 +596,7 @@ static vector<OutputInfo> setups_to_outputs(Card& card, ResourceManager& resman, // create default framebuffers if needed for (OutputInfo& o : outputs) { if (!o.crtc) { - get_default_crtc(card, o); + get_default_crtc(resman, o); o.user_set_crtc = true; } @@ -1048,7 +1027,7 @@ int main(int argc, char **argv) if (o.fbs.empty()) continue; - o.primary_plane = resman.reserve_primary_plane(o.crtc); + o.primary_plane = resman.reserve_primary_plane(o.crtc, o.fbs[0]->format()); if (!o.primary_plane) EXIT("Could not get primary plane for crtc '%u'", o.crtc->id()); |