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() { ...@@ -40,14 +40,16 @@ CrtcController::~CrtcController() {
} }
DisableCursor(); DisableCursor();
drm_->DisableCrtc(crtc_); drm_->plane_manager()->DisableModeset(crtc_, connector_);
} }
} }
bool CrtcController::Modeset(const DrmOverlayPlane& plane, bool CrtcController::Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode) { const drmModeModeInfo& mode,
if (!drm_->SetCrtc(crtc_, plane.buffer->opaque_framebuffer_id(), const ui::HardwareDisplayPlaneList& plane_list) {
std::vector<uint32_t>(1, connector_), mode)) { if (!drm_->plane_manager()->Modeset(crtc_,
plane.buffer->opaque_framebuffer_id(),
connector_, mode, plane_list)) {
PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_ PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_
<< " connector=" << connector_ << " connector=" << connector_
<< " framebuffer_id=" << plane.buffer->opaque_framebuffer_id() << " framebuffer_id=" << plane.buffer->opaque_framebuffer_id()
...@@ -74,7 +76,7 @@ bool CrtcController::Disable() { ...@@ -74,7 +76,7 @@ bool CrtcController::Disable() {
is_disabled_ = true; is_disabled_ = true;
DisableCursor(); DisableCursor();
return drm_->DisableCrtc(crtc_); return drm_->plane_manager()->DisableModeset(crtc_, connector_);
} }
bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list, bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
......
...@@ -40,9 +40,12 @@ class CrtcController { ...@@ -40,9 +40,12 @@ class CrtcController {
const scoped_refptr<DrmDevice>& drm() const { return drm_; } const scoped_refptr<DrmDevice>& drm() const { return drm_; }
bool is_disabled() const { return is_disabled_; } bool is_disabled() const { return is_disabled_; }
// Perform the initial modesetting operation using |plane| as the buffer for // Calls the appropriate Plane Manager to perform the initial modesetting
// the primary plane. The CRTC configuration is specified by |mode|. // operation using |plane| as the buffer for the primary plane. The CRTC
bool Modeset(const DrmOverlayPlane& plane, const drmModeModeInfo& mode); // configuration is specified by |mode|.
bool Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode,
const ui::HardwareDisplayPlaneList& plane_list);
// Disables the controller. // Disables the controller.
bool Disable(); bool Disable();
......
...@@ -70,23 +70,24 @@ HardwareDisplayController::~HardwareDisplayController() = default; ...@@ -70,23 +70,24 @@ HardwareDisplayController::~HardwareDisplayController() = default;
bool HardwareDisplayController::Modeset(const DrmOverlayPlane& primary, bool HardwareDisplayController::Modeset(const DrmOverlayPlane& primary,
const drmModeModeInfo& mode) { const drmModeModeInfo& mode) {
TRACE_EVENT0("drm", "HDC::Modeset"); TRACE_EVENT0("drm", "HDC::Modeset");
DCHECK(primary.buffer.get()); return ModesetCrtc(primary, /*use_current_crtc_mode=*/false, mode);
bool status = true;
for (const auto& controller : crtc_controllers_)
status &= controller->Modeset(primary, mode);
is_disabled_ = false;
ResetCursor();
OnModesetComplete(primary);
return status;
} }
bool HardwareDisplayController::Enable(const DrmOverlayPlane& primary) { bool HardwareDisplayController::Enable(const DrmOverlayPlane& primary) {
TRACE_EVENT0("drm", "HDC::Enable"); 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()); DCHECK(primary.buffer.get());
bool status = true; bool status = true;
for (const auto& controller : crtc_controllers_) 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; is_disabled_ = false;
ResetCursor(); ResetCursor();
......
...@@ -169,6 +169,12 @@ class HardwareDisplayController { ...@@ -169,6 +169,12 @@ class HardwareDisplayController {
const gfx::PresentationFeedback& presentation_feedback); const gfx::PresentationFeedback& presentation_feedback);
private: 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); void OnModesetComplete(const DrmOverlayPlane& primary);
bool ScheduleOrTestPageFlip(const DrmOverlayPlaneList& plane_list, bool ScheduleOrTestPageFlip(const DrmOverlayPlaneList& plane_list,
scoped_refptr<PageFlipRequest> page_flip_request, scoped_refptr<PageFlipRequest> page_flip_request,
......
...@@ -63,6 +63,15 @@ class HardwareDisplayPlaneManager { ...@@ -63,6 +63,15 @@ class HardwareDisplayPlaneManager {
// or crtcs found. // or crtcs found.
bool Initialize(); 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 // Clears old frame state out. Must be called before any AssignOverlayPlanes
// calls. // calls.
void BeginFrame(HardwareDisplayPlaneList* plane_list); void BeginFrame(HardwareDisplayPlaneList* plane_list);
......
...@@ -60,6 +60,21 @@ HardwareDisplayPlaneManagerAtomic::HardwareDisplayPlaneManagerAtomic( ...@@ -60,6 +60,21 @@ HardwareDisplayPlaneManagerAtomic::HardwareDisplayPlaneManagerAtomic(
HardwareDisplayPlaneManagerAtomic::~HardwareDisplayPlaneManagerAtomic() = HardwareDisplayPlaneManagerAtomic::~HardwareDisplayPlaneManagerAtomic() =
default; 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( bool HardwareDisplayPlaneManagerAtomic::Commit(
HardwareDisplayPlaneList* plane_list, HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request, scoped_refptr<PageFlipRequest> page_flip_request,
......
...@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerAtomic : public HardwareDisplayPlaneManager { ...@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerAtomic : public HardwareDisplayPlaneManager {
~HardwareDisplayPlaneManagerAtomic() override; ~HardwareDisplayPlaneManagerAtomic() override;
// HardwareDisplayPlaneManager: // 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, bool Commit(HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request, scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override; std::unique_ptr<gfx::GpuFence>* out_fence) override;
......
...@@ -45,6 +45,21 @@ HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy( ...@@ -45,6 +45,21 @@ HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy(
HardwareDisplayPlaneManagerLegacy::~HardwareDisplayPlaneManagerLegacy() = HardwareDisplayPlaneManagerLegacy::~HardwareDisplayPlaneManagerLegacy() =
default; 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( bool HardwareDisplayPlaneManagerLegacy::Commit(
HardwareDisplayPlaneList* plane_list, HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request, scoped_refptr<PageFlipRequest> page_flip_request,
......
...@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerLegacy : public HardwareDisplayPlaneManager { ...@@ -19,6 +19,12 @@ class HardwareDisplayPlaneManagerLegacy : public HardwareDisplayPlaneManager {
~HardwareDisplayPlaneManagerLegacy() override; ~HardwareDisplayPlaneManagerLegacy() override;
// HardwareDisplayPlaneManager: // 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, bool Commit(HardwareDisplayPlaneList* plane_list,
scoped_refptr<PageFlipRequest> page_flip_request, scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override; std::unique_ptr<gfx::GpuFence>* out_fence) override;
......
...@@ -44,6 +44,9 @@ constexpr uint32_t kInFormatsBlobPropId = 400; ...@@ -44,6 +44,9 @@ constexpr uint32_t kInFormatsBlobPropId = 400;
constexpr uint32_t kBackgroundColorPropId = 401; constexpr uint32_t kBackgroundColorPropId = 401;
const gfx::Size kDefaultBufferSize(2, 2); 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 class HardwareDisplayPlaneManagerTest
: public testing::Test, : public testing::Test,
...@@ -217,6 +220,32 @@ uint64_t HardwareDisplayPlaneManagerTest::GetPlanePropertyValue( ...@@ -217,6 +220,32 @@ uint64_t HardwareDisplayPlaneManagerTest::GetPlanePropertyValue(
using HardwareDisplayPlaneManagerLegacyTest = HardwareDisplayPlaneManagerTest; using HardwareDisplayPlaneManagerLegacyTest = HardwareDisplayPlaneManagerTest;
using HardwareDisplayPlaneManagerAtomicTest = 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) { TEST_P(HardwareDisplayPlaneManagerLegacyTest, SinglePlaneAssignment) {
ui::DrmOverlayPlaneList assigns; ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr)); assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
...@@ -331,6 +360,32 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) { ...@@ -331,6 +360,32 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) {
&state_, assigns, crtc_properties_[0].id)); &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) { TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultiplePlaneAssignment) {
ui::DrmOverlayPlaneList assigns; ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr)); 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