Commit e1649e5f authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Ozone: Move drm Modeset to Atomic/Legacy Plane Manager

1. Move DRM SetCrtc and Disable from Crtc Controller Modeset to Plane Manager
Atomic/Legacy Modeset to abstract the implementation based on the
platform.
2. Move common code from HardwareDisplayController Enable and Modeset to
a common function.

BUG=987274
TEST=HardwareDisplayPlaneManager*Test.Modeset,
HardwareDisplayPlaneManager*Test.DisableModeset

Change-Id: Iebc8287d0dad49efa6ddf69306e057c0650e5278
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2032234
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Auto-Submit: Mark Yacoub <markyacoub@google.com>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737804}
parent 896f3845
......@@ -40,14 +40,16 @@ CrtcController::~CrtcController() {
}
DisableCursor();
drm_->DisableCrtc(crtc_);
drm_->plane_manager()->DisableModeset(crtc_, connector_);
}
}
bool CrtcController::Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode) {
if (!drm_->SetCrtc(crtc_, plane.buffer->opaque_framebuffer_id(),
std::vector<uint32_t>(1, connector_), mode)) {
const drmModeModeInfo& mode,
const ui::HardwareDisplayPlaneList& plane_list) {
if (!drm_->plane_manager()->Modeset(crtc_,
plane.buffer->opaque_framebuffer_id(),
connector_, mode, plane_list)) {
PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_
<< " connector=" << connector_
<< " framebuffer_id=" << plane.buffer->opaque_framebuffer_id()
......@@ -74,7 +76,7 @@ bool CrtcController::Disable() {
is_disabled_ = true;
DisableCursor();
return drm_->DisableCrtc(crtc_);
return drm_->plane_manager()->DisableModeset(crtc_, connector_);
}
bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
......
......@@ -40,9 +40,12 @@ class CrtcController {
const scoped_refptr<DrmDevice>& drm() const { return drm_; }
bool is_disabled() const { return is_disabled_; }
// Perform the initial modesetting operation using |plane| as the buffer for
// the primary plane. The CRTC configuration is specified by |mode|.
bool Modeset(const DrmOverlayPlane& plane, const drmModeModeInfo& mode);
// Calls the appropriate Plane Manager to perform the initial modesetting
// operation using |plane| as the buffer for the primary plane. The CRTC
// configuration is specified by |mode|.
bool Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode,
const ui::HardwareDisplayPlaneList& plane_list);
// Disables the controller.
bool Disable();
......
......@@ -70,23 +70,24 @@ HardwareDisplayController::~HardwareDisplayController() = default;
bool HardwareDisplayController::Modeset(const DrmOverlayPlane& primary,
const drmModeModeInfo& mode) {
TRACE_EVENT0("drm", "HDC::Modeset");
DCHECK(primary.buffer.get());
bool status = true;
for (const auto& controller : crtc_controllers_)
status &= controller->Modeset(primary, mode);
is_disabled_ = false;
ResetCursor();
OnModesetComplete(primary);
return status;
return ModesetCrtc(primary, /*use_current_crtc_mode=*/false, mode);
}
bool HardwareDisplayController::Enable(const DrmOverlayPlane& primary) {
TRACE_EVENT0("drm", "HDC::Enable");
drmModeModeInfo empty_mode = {};
return ModesetCrtc(primary, /*use_current_crtc_mode=*/true, empty_mode);
}
bool HardwareDisplayController::ModesetCrtc(const DrmOverlayPlane& primary,
bool use_current_crtc_mode,
const drmModeModeInfo& mode) {
DCHECK(primary.buffer.get());
bool status = true;
for (const auto& controller : crtc_controllers_)
status &= controller->Modeset(primary, controller->mode());
status &= controller->Modeset(
primary, use_current_crtc_mode ? controller->mode() : mode,
owned_hardware_planes_);
is_disabled_ = false;
ResetCursor();
......
......@@ -169,6 +169,12 @@ class HardwareDisplayController {
const gfx::PresentationFeedback& presentation_feedback);
private:
// If multiple CRTC Controllers exist and they're enabled, each will be
// enabled with its own mode. Set |use_current_crtc_mode| to Modeset using
// controller's mode instead of |mode|.
bool ModesetCrtc(const DrmOverlayPlane& primary,
bool use_current_crtc_mode,
const drmModeModeInfo& mode);
void OnModesetComplete(const DrmOverlayPlane& primary);
bool ScheduleOrTestPageFlip(const DrmOverlayPlaneList& plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
......
......@@ -63,6 +63,15 @@ class HardwareDisplayPlaneManager {
// or crtcs found.
bool Initialize();
// Performs modesetting, either atomic or legacy, depending on the device.
virtual bool Modeset(uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList& plane_list) = 0;
virtual bool DisableModeset(uint32_t crtc_id, uint32_t connector) = 0;
// Clears old frame state out. Must be called before any AssignOverlayPlanes
// calls.
void BeginFrame(HardwareDisplayPlaneList* plane_list);
......
......@@ -60,6 +60,21 @@ HardwareDisplayPlaneManagerAtomic::HardwareDisplayPlaneManagerAtomic(
HardwareDisplayPlaneManagerAtomic::~HardwareDisplayPlaneManagerAtomic() =
default;
bool HardwareDisplayPlaneManagerAtomic::Modeset(
uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList&) {
return drm_->SetCrtc(crtc_id, framebuffer_id,
std::vector<uint32_t>(1, connector_id), mode);
}
bool HardwareDisplayPlaneManagerAtomic::DisableModeset(uint32_t crtc_id,
uint32_t connector) {
return drm_->DisableCrtc(crtc_id);
}
bool HardwareDisplayPlaneManagerAtomic::Commit(
HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
......
......@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerAtomic : public HardwareDisplayPlaneManager {
~HardwareDisplayPlaneManagerAtomic() override;
// HardwareDisplayPlaneManager:
bool Modeset(uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList& plane_list) override;
bool DisableModeset(uint32_t crtc_id, uint32_t connector) override;
bool Commit(HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
......
......@@ -45,6 +45,21 @@ HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy(
HardwareDisplayPlaneManagerLegacy::~HardwareDisplayPlaneManagerLegacy() =
default;
bool HardwareDisplayPlaneManagerLegacy::Modeset(
uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList&) {
return drm_->SetCrtc(crtc_id, framebuffer_id,
std::vector<uint32_t>(1, connector_id), mode);
}
bool HardwareDisplayPlaneManagerLegacy::DisableModeset(uint32_t crtc_id,
uint32_t connector) {
return drm_->DisableCrtc(crtc_id);
}
bool HardwareDisplayPlaneManagerLegacy::Commit(
HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
......
......@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerLegacy : public HardwareDisplayPlaneManager {
~HardwareDisplayPlaneManagerLegacy() override;
// HardwareDisplayPlaneManager:
bool Modeset(uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList& plane_list) override;
bool DisableModeset(uint32_t crtc_id, uint32_t connector) override;
bool Commit(HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
......
......@@ -44,6 +44,9 @@ constexpr uint32_t kInFormatsBlobPropId = 400;
constexpr uint32_t kBackgroundColorPropId = 401;
const gfx::Size kDefaultBufferSize(2, 2);
// Create a basic mode for a 6x4 screen.
drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, {'\0'}};
class HardwareDisplayPlaneManagerTest
: public testing::Test,
......@@ -217,6 +220,32 @@ uint64_t HardwareDisplayPlaneManagerTest::GetPlanePropertyValue(
using HardwareDisplayPlaneManagerLegacyTest = HardwareDisplayPlaneManagerTest;
using HardwareDisplayPlaneManagerAtomicTest = HardwareDisplayPlaneManagerTest;
TEST_P(HardwareDisplayPlaneManagerLegacyTest, Modeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic=*/false);
fake_drm_->set_set_crtc_expectation(false);
constexpr uint32_t kFrameBuffer = 2;
ui::HardwareDisplayPlaneList state;
EXPECT_FALSE(fake_drm_->plane_manager()->Modeset(
crtc_properties_[0].id, kFrameBuffer, connector_properties_[0].id,
kDefaultMode, state));
EXPECT_EQ(kFrameBuffer, fake_drm_->current_framebuffer());
EXPECT_EQ(1, fake_drm_->get_set_crtc_call_count());
}
TEST_P(HardwareDisplayPlaneManagerLegacyTest, DisableModeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic*/ false);
EXPECT_TRUE(
fake_drm_->plane_manager()->DisableModeset(crtc_properties_[0].id, 0));
}
TEST_P(HardwareDisplayPlaneManagerLegacyTest, SinglePlaneAssignment) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
......@@ -331,6 +360,32 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) {
&state_, assigns, crtc_properties_[0].id));
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, Modeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic=*/true);
constexpr uint32_t kFrameBuffer = 2;
ui::HardwareDisplayPlaneList state;
EXPECT_TRUE(fake_drm_->plane_manager()->Modeset(
crtc_properties_[0].id, kFrameBuffer, connector_properties_[0].id,
kDefaultMode, state));
EXPECT_EQ(0, fake_drm_->get_commit_count());
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, DisableModeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic*/ true);
EXPECT_TRUE(fake_drm_->plane_manager()->DisableModeset(
crtc_properties_[0].id, connector_properties_[0].id));
EXPECT_EQ(0, fake_drm_->get_commit_count());
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultiplePlaneAssignment) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment