Commit 9736e4a7 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Commit Bot

Revert "Replace drmModeSetCrtc by Atomic APIs"

This reverts commit 12bbfb47.

Reason for revert: this breaks video_decode_accelerator_unittest (and probably others) when built in Debug mode:

hardware_display_plane_manager.cc(368)] Check failed: state.properties.active.id.

Original change's description:
> Replace drmModeSetCrtc by Atomic APIs
> 
> If the device supports atomic APIs, use drmModeAtomicCommit to modeset
> and disable instead of drmModeSetCrtc.
> Abstracted Modeset and Disabled code to HDPM to handle both atomic and
> legacy call.
> Updated tests to support Connector and CRTC props.
> 
> BUG=987274
> TEST=HardwareDisplayControllerTest.CheckModesettingSetsProps,
> HardwareDisplayPlaneManagerLegacyTest.Modeset,
> HardwareDisplayPlaneManagerLegacyTest.DisableModeset,
> HardwareDisplayPlaneManagerAtomicTest.DisableModeset, Tested on
> Nautilus(Intel), Grunt(AMD) and Cave(Legacy).
> 
> Change-Id: Ic6d3873c94cb657fbe8de6dcd0faf97aeea05bd5
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2020809
> Reviewed-by: Daniel Nicoara <dnicoara@chromium.org>
> Commit-Queue: Mark Yacoub <markyacoub@google.com>
> Auto-Submit: Mark Yacoub <markyacoub@google.com>
> Cr-Commit-Position: refs/heads/master@{#736021}

TBR=dnicoara@chromium.org,dcastagna@chromium.org,markyacoub@google.com

Change-Id: Ic116c75d0eb1d81dfe45b6bcd76bcc2e27aaa4e6
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 987274
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2026779Reviewed-by: default avatarAlexandre Courbot <acourbot@chromium.org>
Commit-Queue: Alexandre Courbot <acourbot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#736278}
parent 30208e42
......@@ -14,7 +14,6 @@
#include "ui/ozone/platform/drm/gpu/drm_device.h"
#include "ui/ozone/platform/drm/gpu/drm_dumb_buffer.h"
#include "ui/ozone/platform/drm/gpu/drm_framebuffer.h"
#include "ui/ozone/platform/drm/gpu/drm_gpu_util.h"
#include "ui/ozone/platform/drm/gpu/hardware_display_plane.h"
#include "ui/ozone/platform/drm/gpu/page_flip_request.h"
......@@ -41,16 +40,14 @@ CrtcController::~CrtcController() {
}
DisableCursor();
drm_->plane_manager()->DisableModeset(crtc_, connector_);
drm_->DisableCrtc(crtc_);
}
}
bool CrtcController::Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode,
const ui::HardwareDisplayPlaneList& plane_list) {
if (!drm_->plane_manager()->Modeset(crtc_,
plane.buffer->opaque_framebuffer_id(),
connector_, mode, plane_list)) {
drmModeModeInfo mode) {
if (!drm_->SetCrtc(crtc_, plane.buffer->opaque_framebuffer_id(),
std::vector<uint32_t>(1, connector_), &mode)) {
PLOG(ERROR) << "Failed to modeset: crtc=" << crtc_
<< " connector=" << connector_
<< " framebuffer_id=" << plane.buffer->opaque_framebuffer_id()
......@@ -77,15 +74,12 @@ bool CrtcController::Disable() {
is_disabled_ = true;
DisableCursor();
return drm_->plane_manager()->DisableModeset(crtc_, connector_);
return drm_->DisableCrtc(crtc_);
}
bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
const DrmOverlayPlaneList& overlays,
bool is_modesetting) {
// If we're in the process of modesetting, the CRTC is still disabled.
// Once the modeset is done, we expect it to be enabled.
DCHECK(is_modesetting || !is_disabled_);
const DrmOverlayPlaneList& overlays) {
DCHECK(!is_disabled_);
const DrmOverlayPlane* primary = DrmOverlayPlane::GetPrimaryPlane(overlays);
if (primary && !drm_->plane_manager()->ValidatePrimarySize(*primary, mode_)) {
......
......@@ -40,19 +40,15 @@ class CrtcController {
const scoped_refptr<DrmDevice>& drm() const { return drm_; }
bool is_disabled() const { return is_disabled_; }
// Sets up all props used in atomic modesets and performs the initial
// modesetting operation using |plane| as the buffer for the primary plane
// with the CRTC configuration is specified by |mode|.
bool Modeset(const DrmOverlayPlane& plane,
const drmModeModeInfo& mode,
const ui::HardwareDisplayPlaneList& plane_list);
// 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, drmModeModeInfo mode);
// Disables the controller.
bool Disable();
bool AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
const DrmOverlayPlaneList& planes,
bool is_modesetting);
const DrmOverlayPlaneList& planes);
// Returns a vector of format modifiers for the given fourcc format
// on this CRTCs primary plane. A format modifier describes the
......
......@@ -9,7 +9,6 @@
#include <unistd.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <memory>
#include <utility>
......@@ -147,7 +146,7 @@ DrmPropertyBlobMetadata::~DrmPropertyBlobMetadata() {
class DrmDevice::PageFlipManager {
public:
PageFlipManager() : next_id_(0) {}
~PageFlipManager() = default;
~PageFlipManager() {}
void OnPageFlip(uint32_t frame, base::TimeTicks timestamp, uint64_t id) {
auto it =
......@@ -249,7 +248,7 @@ DrmDevice::DrmDevice(const base::FilePath& device_path,
is_primary_device_(is_primary_device),
gbm_(std::move(gbm)) {}
DrmDevice::~DrmDevice() = default;
DrmDevice::~DrmDevice() {}
bool DrmDevice::Initialize() {
// Ignore devices that cannot perform modesetting.
......@@ -303,21 +302,36 @@ ScopedDrmCrtcPtr DrmDevice::GetCrtc(uint32_t crtc_id) {
bool DrmDevice::SetCrtc(uint32_t crtc_id,
uint32_t framebuffer,
std::vector<uint32_t> connectors,
drmModeModeInfo mode) {
drmModeModeInfo* mode) {
DCHECK(file_.IsValid());
DCHECK(!connectors.empty());
DCHECK(mode);
TRACE_EVENT2("drm", "DrmDevice::SetCrtc", "crtc", crtc_id, "size",
gfx::Size(mode.hdisplay, mode.vdisplay).ToString());
gfx::Size(mode->hdisplay, mode->vdisplay).ToString());
return !drmModeSetCrtc(file_.GetPlatformFile(), crtc_id, framebuffer, 0, 0,
connectors.data(), connectors.size(), &mode);
connectors.data(), connectors.size(), mode);
}
bool DrmDevice::SetCrtc(drmModeCrtc* crtc, std::vector<uint32_t> connectors) {
DCHECK(file_.IsValid());
// If there's no buffer then the CRTC was disabled.
if (!crtc->buffer_id)
return DisableCrtc(crtc->crtc_id);
DCHECK(!connectors.empty());
TRACE_EVENT1("drm", "DrmDevice::RestoreCrtc", "crtc", crtc->crtc_id);
return !drmModeSetCrtc(file_.GetPlatformFile(), crtc->crtc_id,
crtc->buffer_id, crtc->x, crtc->y, connectors.data(),
connectors.size(), &crtc->mode);
}
bool DrmDevice::DisableCrtc(uint32_t crtc_id) {
DCHECK(file_.IsValid());
TRACE_EVENT1("drm", "DrmDevice::DisableCrtc", "crtc", crtc_id);
return !drmModeSetCrtc(file_.GetPlatformFile(), crtc_id, 0, 0, 0, nullptr, 0,
nullptr);
return !drmModeSetCrtc(file_.GetPlatformFile(), crtc_id, 0, 0, 0, NULL, 0,
NULL);
}
ScopedDrmConnectorPtr DrmDevice::GetConnector(uint32_t connector_id) {
......@@ -418,8 +432,7 @@ bool DrmDevice::SetProperty(uint32_t connector_id,
property_id, value);
}
ScopedDrmPropertyBlob DrmDevice::CreatePropertyBlob(const void* blob,
size_t size) {
ScopedDrmPropertyBlob DrmDevice::CreatePropertyBlob(void* blob, size_t size) {
uint32_t id = 0;
int ret = drmModeCreatePropertyBlob(file_.GetPlatformFile(), blob, size, &id);
DCHECK(!ret && id);
......
......@@ -7,7 +7,6 @@
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
......@@ -107,7 +106,12 @@ class DrmDevice : public base::RefCountedThreadSafe<DrmDevice> {
virtual bool SetCrtc(uint32_t crtc_id,
uint32_t framebuffer,
std::vector<uint32_t> connectors,
drmModeModeInfo mode);
drmModeModeInfo* mode);
// Used to set a specific configuration to the CRTC. Normally this function
// would be called with a CRTC saved state (from |GetCrtc|) to restore it to
// its original configuration.
virtual bool SetCrtc(drmModeCrtc* crtc, std::vector<uint32_t> connectors);
virtual bool DisableCrtc(uint32_t crtc_id);
......@@ -164,8 +168,7 @@ class DrmDevice : public base::RefCountedThreadSafe<DrmDevice> {
uint64_t value);
// Creates a property blob with data |blob| of size |size|.
virtual ScopedDrmPropertyBlob CreatePropertyBlob(const void* blob,
size_t size);
virtual ScopedDrmPropertyBlob CreatePropertyBlob(void* blob, size_t size);
virtual void DestroyPropertyBlob(uint32_t id);
......
......@@ -40,14 +40,14 @@ constexpr uint32_t kConnectorIdBase = 100;
constexpr uint32_t kPlaneIdBase = 200;
constexpr uint32_t kInFormatsBlobPropIdBase = 400;
constexpr uint32_t kTypePropId = 3010;
constexpr uint32_t kInFormatsPropId = 3011;
constexpr uint32_t kTypePropId = 300;
constexpr uint32_t kInFormatsPropId = 301;
} // namespace
class DrmOverlayValidatorTest : public testing::Test {
public:
DrmOverlayValidatorTest() = default;
DrmOverlayValidatorTest() {}
void SetUp() override;
void TearDown() override;
......@@ -166,51 +166,29 @@ void DrmOverlayValidatorTest::InitializeDrmState(
const std::vector<CrtcState>& crtc_states) {
std::vector<ui::MockDrmDevice::CrtcProperties> crtc_properties(
crtc_states.size());
std::map<uint32_t, std::string> crtc_property_names = {
{1000, "ACTIVE"},
{1001, "MODE_ID"},
};
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(
crtc_states.size());
std::map<uint32_t, std::string> connector_property_names = {
{2000, "CRTC_ID"},
};
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties = {};
constexpr uint32_t kPlaneCrtcidId = 3000;
std::map<uint32_t, std::string> plane_property_names = {
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties;
std::map<uint32_t, std::string> property_names = {
// Add all required properties.
{kPlaneCrtcidId, "CRTC_ID"},
{3001, "CRTC_X"},
{3002, "CRTC_Y"},
{3003, "CRTC_W"},
{3004, "CRTC_H"},
{3005, "FB_ID"},
{3006, "SRC_X"},
{3007, "SRC_Y"},
{3008, "SRC_W"},
{3009, "SRC_H"},
{1000, "CRTC_ID"},
{1001, "CRTC_X"},
{1002, "CRTC_Y"},
{1003, "CRTC_W"},
{1004, "CRTC_H"},
{1005, "FB_ID"},
{1006, "SRC_X"},
{1007, "SRC_Y"},
{1008, "SRC_W"},
{1009, "SRC_H"},
// Defines some optional properties we use for convenience.
{kTypePropId, "type"},
{kInFormatsPropId, "IN_FORMATS"}};
{kInFormatsPropId, "IN_FORMATS"},
};
uint32_t plane_id = kPlaneIdBase;
uint32_t property_id = kInFormatsBlobPropIdBase;
for (size_t crtc_idx = 0; crtc_idx < crtc_states.size(); ++crtc_idx) {
crtc_properties[crtc_idx].id = kCrtcIdBase + crtc_idx;
for (const auto& pair : crtc_property_names) {
crtc_properties[crtc_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
connector_properties[crtc_idx].id = kConnectorIdBase + crtc_idx;
for (const auto& pair : connector_property_names) {
connector_properties[crtc_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
std::vector<ui::MockDrmDevice::PlaneProperties> crtc_plane_properties(
crtc_states[crtc_idx].planes.size());
......@@ -219,44 +197,29 @@ void DrmOverlayValidatorTest::InitializeDrmState(
crtc_plane_properties[plane_idx].id = plane_id++;
crtc_plane_properties[plane_idx].crtc_mask = 1 << crtc_idx;
for (const auto& pair : plane_property_names) {
for (const auto& pair : property_names) {
uint64_t value = 0;
switch (pair.first) {
case kTypePropId:
value = plane_idx == 0 ? DRM_PLANE_TYPE_PRIMARY
: DRM_PLANE_TYPE_OVERLAY;
break;
case kInFormatsPropId:
value = property_id++;
drm_->SetPropertyBlob(ui::MockDrmDevice::AllocateInFormatsBlob(
value, crtc_states[crtc_idx].planes[plane_idx].formats,
std::vector<drm_format_modifier>()));
break;
case kPlaneCrtcidId:
value = crtc_properties[crtc_idx].id;
break;
default:
break;
if (pair.first == kTypePropId) {
value =
plane_idx == 0 ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
} else if (pair.first == kInFormatsPropId) {
value = property_id++;
drm_->SetPropertyBlob(ui::MockDrmDevice::AllocateInFormatsBlob(
value, crtc_states[crtc_idx].planes[plane_idx].formats,
std::vector<drm_format_modifier>()));
}
crtc_plane_properties[plane_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ value});
}
}
plane_properties.insert(plane_properties.end(),
crtc_plane_properties.begin(),
crtc_plane_properties.end());
}
std::map<uint32_t, std::string> property_names = {};
property_names.insert(crtc_property_names.begin(), crtc_property_names.end());
property_names.insert(connector_property_names.begin(),
connector_property_names.end());
property_names.insert(plane_property_names.begin(),
plane_property_names.end());
drm_->InitializeState(crtc_properties, connector_properties, plane_properties,
property_names,
drm_->InitializeState(crtc_properties, plane_properties, property_names,
/* use_atomic= */ true);
}
......
......@@ -7,7 +7,6 @@
#include <drm.h>
#include <string.h>
#include <xf86drm.h>
#include <memory>
#include <utility>
......@@ -66,39 +65,29 @@ HardwareDisplayController::HardwareDisplayController(
AllocateCursorBuffers();
}
HardwareDisplayController::~HardwareDisplayController() = default;
HardwareDisplayController::~HardwareDisplayController() {
}
bool HardwareDisplayController::Modeset(const DrmOverlayPlane& primary,
const drmModeModeInfo& mode) {
drmModeModeInfo mode) {
TRACE_EVENT0("drm", "HDC::Modeset");
return ModesetCrtc(primary, /*use_current_crtc_mode=*/false, mode);
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;
}
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;
HardwareDisplayPlaneList hardware_planes = {};
hardware_planes.old_plane_list = GetAllOwnedPlanes();
GetDrmDevice()->plane_manager()->BeginFrame(hardware_planes);
DrmOverlayPlaneList plane_list = {};
plane_list.push_back(primary.Clone());
for (const auto& controller : crtc_controllers_) {
status &= controller->AssignOverlayPlanes(&hardware_planes, plane_list,
/*is_modesetting=*/true);
drmModeModeInfo modeset_mode =
use_current_crtc_mode ? controller->mode() : mode;
status &= controller->Modeset(primary, modeset_mode, hardware_planes);
}
for (const auto& controller : crtc_controllers_)
status &= controller->Modeset(primary, controller->mode());
is_disabled_ = false;
ResetCursor();
......@@ -110,10 +99,6 @@ void HardwareDisplayController::Disable() {
TRACE_EVENT0("drm", "HDC::Disable");
for (const auto& controller : crtc_controllers_)
// TODO(crbug.com/1015104): Modeset and Disable operations should go
// together. The current split is due to how the legacy/atomic split
// evolved. It should be cleaned up under the more generic
// HardwareDisplayPlaneManager{Legacy,Atomic} calls.
controller->Disable();
bool ret = GetDrmDevice()->plane_manager()->DisableOverlayPlanes(
......@@ -185,12 +170,11 @@ bool HardwareDisplayController::ScheduleOrTestPageFlip(
bool status = true;
for (const auto& controller : crtc_controllers_) {
status &= controller->AssignOverlayPlanes(&hardware_planes, pending_planes,
/*is_modesetting=*/false);
status &= controller->AssignOverlayPlanes(&hardware_planes, pending_planes);
}
status &= GetDrmDevice()->plane_manager()->Commit(
hardware_planes, /*modeset=*/false, page_flip_request, out_fence);
hardware_planes, page_flip_request, out_fence);
return status;
}
......
......@@ -95,7 +95,7 @@ class HardwareDisplayController {
// Performs the initial CRTC configuration. If successful, it will display the
// framebuffer for |primary| with |mode|.
bool Modeset(const DrmOverlayPlane& primary, const drmModeModeInfo& mode);
bool Modeset(const DrmOverlayPlane& primary, drmModeModeInfo mode);
// Performs a CRTC configuration re-using the modes from the CRTCs.
bool Enable(const DrmOverlayPlane& primary);
......@@ -169,10 +169,6 @@ class HardwareDisplayController {
const gfx::PresentationFeedback& presentation_feedback);
private:
bool ModesetCrtc(const DrmOverlayPlane& primary,
bool use_current_mode,
const drmModeModeInfo& mode);
void OnModesetComplete(const DrmOverlayPlane& primary);
bool ScheduleOrTestPageFlip(const DrmOverlayPlaneList& plane_list,
scoped_refptr<PageFlipRequest> page_flip_request,
......
......@@ -27,8 +27,8 @@
namespace {
// Create a basic mode for a 6x4 screen.
const drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, {'\0'}};
const drmModeModeInfo kDefaultMode =
{0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
constexpr uint32_t kCrtcIdBase = 1;
constexpr uint32_t kPrimaryCrtc = kCrtcIdBase;
......@@ -36,9 +36,6 @@ constexpr uint32_t kSecondaryCrtc = kCrtcIdBase + 1;
constexpr uint32_t kPrimaryConnector = 10;
constexpr uint32_t kSecondaryConnector = 11;
constexpr uint32_t kPlaneOffset = 1000;
constexpr uint32_t kActivePropId = 1001;
constexpr uint32_t kModePropId = 1002;
constexpr uint32_t kCrtcIdPropId = 2000;
const gfx::Size kDefaultModeSize(kDefaultMode.hdisplay, kDefaultMode.vdisplay);
const gfx::Size kOverlaySize(kDefaultMode.hdisplay / 2,
......@@ -107,34 +104,24 @@ void HardwareDisplayControllerTest::TearDown() {
}
void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
constexpr uint32_t kTypePropId = 4000;
constexpr uint32_t kInFormatsPropId = 4001;
constexpr uint32_t kInFormatsBlobPropId = 4002;
constexpr uint32_t kTypePropId = 300;
constexpr uint32_t kInFormatsPropId = 301;
constexpr uint32_t kInFormatsBlobPropId = 400;
std::vector<ui::MockDrmDevice::CrtcProperties> crtc_properties(2);
std::map<uint32_t, std::string> crtc_property_names = {
{kActivePropId, "ACTIVE"},
{kModePropId, "MODE_ID"},
};
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(2);
std::map<uint32_t, std::string> connector_property_names = {
{kCrtcIdPropId, "CRTC_ID"},
};
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties = {};
std::map<uint32_t, std::string> plane_property_names = {
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties;
std::map<uint32_t, std::string> property_names = {
// Add all required properties.
{3000, "CRTC_ID"},
{3001, "CRTC_X"},
{3002, "CRTC_Y"},
{3003, "CRTC_W"},
{3004, "CRTC_H"},
{3005, "FB_ID"},
{3006, "SRC_X"},
{3007, "SRC_Y"},
{3008, "SRC_W"},
{3009, "SRC_H"},
{200, "CRTC_ID"},
{201, "CRTC_X"},
{202, "CRTC_Y"},
{203, "CRTC_W"},
{204, "CRTC_H"},
{205, "FB_ID"},
{206, "SRC_X"},
{207, "SRC_Y"},
{208, "SRC_W"},
{209, "SRC_H"},
// Add some optional properties we use for convenience.
{kTypePropId, "type"},
{kInFormatsPropId, "IN_FORMATS"},
......@@ -142,17 +129,6 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
for (size_t i = 0; i < crtc_properties.size(); ++i) {
crtc_properties[i].id = kCrtcIdBase + i;
for (const auto& pair : crtc_property_names) {
crtc_properties[i].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
connector_properties[i].id =
i == 0 ? kPrimaryConnector : kSecondaryConnector;
for (const auto& pair : connector_property_names) {
connector_properties[i].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
for (size_t j = 0; j < 2; ++j) {
const uint32_t offset = plane_properties.size();
......@@ -160,7 +136,7 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
ui::MockDrmDevice::PlaneProperties plane;
plane.id = kPlaneOffset + offset;
plane.crtc_mask = 1 << i;
for (const auto& pair : plane_property_names) {
for (const auto& pair : property_names) {
uint32_t value = 0;
if (pair.first == kTypePropId)
value = j == 0 ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY;
......@@ -187,14 +163,8 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
}
}
std::map<uint32_t, std::string> property_names = {};
property_names.insert(crtc_property_names.begin(), crtc_property_names.end());
property_names.insert(connector_property_names.begin(),
connector_property_names.end());
property_names.insert(plane_property_names.begin(),
plane_property_names.end());
drm_->InitializeState(crtc_properties, connector_properties, plane_properties,
property_names, use_atomic);
drm_->InitializeState(crtc_properties, plane_properties, property_names,
use_atomic);
}
void HardwareDisplayControllerTest::SchedulePageFlip(
......@@ -283,63 +253,10 @@ TEST_F(HardwareDisplayControllerTest, ModifiersWithConnectorType) {
internal_modifiers.end());
}
TEST_F(HardwareDisplayControllerTest, CheckModesettingSetsProps) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
std::vector<ui::DrmOverlayPlane> planes = {};
planes.push_back(plane2.Clone());
SchedulePageFlip(std::move(planes));
// Test props values after modesetting.
ui::DrmDevice::Property connector_prop_crtc_id = {};
ui::ScopedDrmObjectPropertyPtr connector_props =
drm_->GetObjectProperties(kPrimaryConnector, DRM_MODE_OBJECT_CONNECTOR);
ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
&connector_prop_crtc_id);
EXPECT_EQ(kCrtcIdPropId, connector_prop_crtc_id.id);
EXPECT_EQ(kCrtcIdBase, connector_prop_crtc_id.value);
ui::DrmDevice::Property crtc_prop_for_name = {};
ui::ScopedDrmObjectPropertyPtr crtc_props =
drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE",
&crtc_prop_for_name);
EXPECT_EQ(kActivePropId, crtc_prop_for_name.id);
EXPECT_EQ(1U, crtc_prop_for_name.value);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID",
&crtc_prop_for_name);
EXPECT_EQ(kModePropId, crtc_prop_for_name.id);
// Test props values after disabling.
controller_->Disable();
connector_props =
drm_->GetObjectProperties(kPrimaryConnector, DRM_MODE_OBJECT_CONNECTOR);
ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
&connector_prop_crtc_id);
EXPECT_EQ(0U, connector_prop_crtc_id.value);
crtc_props = drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE",
&crtc_prop_for_name);
EXPECT_EQ(0U, crtc_prop_for_name.value);
crtc_props = drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID",
&crtc_prop_for_name);
EXPECT_EQ(0U, crtc_prop_for_name.value);
}
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
EXPECT_EQ(1, drm_->get_commit_count());
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
std::vector<ui::DrmOverlayPlane> planes;
......@@ -353,15 +270,13 @@ TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_);
EXPECT_EQ(1, page_flips_);
EXPECT_EQ(2, drm_->get_commit_count());
EXPECT_EQ(1, drm_->get_commit_count());
// Verify only the primary display have a valid framebuffer.
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_EQ(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
}
TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
InitializeDrmDevice(/* use_atomic */ false);
drm_->set_set_crtc_expectation(false);
ui::DrmOverlayPlane plane(CreateBuffer(), nullptr);
......@@ -369,6 +284,20 @@ TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode));
}
TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
drm_->set_commit_expectation(false);
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
std::vector<ui::DrmOverlayPlane> planes;
planes.push_back(plane2.Clone());
EXPECT_DEATH_IF_SUPPORTED(SchedulePageFlip(std::move(planes)),
"SchedulePageFlip failed");
}
TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
ui::DrmOverlayPlane plane2(
......@@ -376,7 +305,6 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
gfx::Rect(kOverlaySize), gfx::RectF(kDefaultModeSizeF), true, nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
EXPECT_EQ(1, drm_->get_commit_count());
std::vector<ui::DrmOverlayPlane> planes;
planes.push_back(plane1.Clone());
......@@ -386,7 +314,7 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
drm_->RunCallbacks();
EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_);
EXPECT_EQ(1, page_flips_);
EXPECT_EQ(2, drm_->get_commit_count());
EXPECT_EQ(1, drm_->get_commit_count());
// Verify both planes on the primary display have a valid framebuffer.
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
......@@ -399,14 +327,13 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) {
gfx::Rect(kOverlaySize), gfx::RectF(kDefaultModeSizeF), true, nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
EXPECT_EQ(1, drm_->get_commit_count());
std::vector<ui::DrmOverlayPlane> planes;
planes.push_back(plane1.Clone());
planes.push_back(plane2.Clone());
SchedulePageFlip(ui::DrmOverlayPlane::Clone(planes));
EXPECT_EQ(2, drm_->get_commit_count());
EXPECT_EQ(1, drm_->get_commit_count());
// Verify both planes on the primary display have a valid framebuffer.
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
......@@ -416,14 +343,14 @@ TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) {
drm_->RunCallbacks();
EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_);
EXPECT_EQ(1, page_flips_);
EXPECT_EQ(3, drm_->get_commit_count());
EXPECT_EQ(2, drm_->get_commit_count());
// Regular flips should continue on normally.
SchedulePageFlip(ui::DrmOverlayPlane::Clone(planes));
drm_->RunCallbacks();
EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_);
EXPECT_EQ(2, page_flips_);
EXPECT_EQ(4, drm_->get_commit_count());
EXPECT_EQ(3, drm_->get_commit_count());
// Verify both planes on the primary display have a valid framebuffer.
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
......@@ -453,7 +380,7 @@ TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
EXPECT_EQ(2, drm_->get_commit_count());
EXPECT_EQ(2, drm_->get_set_crtc_call_count());
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
std::vector<ui::DrmOverlayPlane> planes;
......@@ -462,7 +389,7 @@ TEST_F(HardwareDisplayControllerTest, PageflipMirroredControllers) {
drm_->RunCallbacks();
EXPECT_EQ(gfx::SwapResult::SWAP_ACK, last_swap_result_);
EXPECT_EQ(1, page_flips_);
EXPECT_EQ(3, drm_->get_commit_count());
EXPECT_EQ(1, drm_->get_commit_count());
// Verify only the displays have a valid framebuffer on the primary plane.
// First display:
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
......@@ -607,10 +534,10 @@ TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) {
}
TEST_F(HardwareDisplayControllerTest, FailPageFlipping) {
drm_->set_commit_expectation(false);
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
drm_->set_commit_expectation(false);
std::vector<ui::DrmOverlayPlane> planes;
planes.push_back(plane1.Clone());
EXPECT_DEATH_IF_SUPPORTED(SchedulePageFlip(std::move(planes)),
......
......@@ -28,7 +28,8 @@ HardwareDisplayPlaneList::HardwareDisplayPlaneList() {
atomic_property_set.reset(drmModeAtomicAlloc());
}
HardwareDisplayPlaneList::~HardwareDisplayPlaneList() = default;
HardwareDisplayPlaneList::~HardwareDisplayPlaneList() {
}
HardwareDisplayPlaneList::PageFlipInfo::PageFlipInfo(uint32_t crtc_id,
uint32_t framebuffer)
......@@ -37,7 +38,8 @@ HardwareDisplayPlaneList::PageFlipInfo::PageFlipInfo(uint32_t crtc_id,
HardwareDisplayPlaneList::PageFlipInfo::PageFlipInfo(
const PageFlipInfo& other) = default;
HardwareDisplayPlaneList::PageFlipInfo::~PageFlipInfo() = default;
HardwareDisplayPlaneList::PageFlipInfo::~PageFlipInfo() {
}
HardwareDisplayPlaneManager::CrtcState::CrtcState() = default;
......@@ -48,7 +50,8 @@ HardwareDisplayPlaneManager::CrtcState::CrtcState(CrtcState&&) = default;
HardwareDisplayPlaneManager::HardwareDisplayPlaneManager(DrmDevice* drm)
: drm_(drm) {}
HardwareDisplayPlaneManager::~HardwareDisplayPlaneManager() = default;
HardwareDisplayPlaneManager::~HardwareDisplayPlaneManager() {
}
bool HardwareDisplayPlaneManager::Initialize() {
// Try to get all of the planes if possible, so we don't have to try to
......@@ -94,19 +97,9 @@ HardwareDisplayPlane* HardwareDisplayPlaneManager::FindNextUnusedPlane(
}
int HardwareDisplayPlaneManager::LookupCrtcIndex(uint32_t crtc_id) const {
for (size_t i = 0; i < crtc_state_.size(); ++i) {
for (size_t i = 0; i < crtc_state_.size(); ++i)
if (crtc_state_[i].properties.id == crtc_id)
return i;
}
return -1;
}
int HardwareDisplayPlaneManager::LookupConnectorIndex(
uint32_t connector_id) const {
for (size_t i = 0; i < connectors_props_.size(); ++i) {
if (connectors_props_[i].id == connector_id)
return i;
}
return -1;
}
......@@ -185,9 +178,8 @@ bool HardwareDisplayPlaneManager::AssignOverlayPlanes(
// This returns a number in 16.16 fixed point, required by the DRM overlay
// APIs.
auto to_fixed_point = [](double v) -> uint32_t {
return v * kFixedPointScaleValue;
};
auto to_fixed_point =
[](double v) -> uint32_t { return v * kFixedPointScaleValue; };
fixed_point_rect = gfx::Rect(to_fixed_point(crop_rect.x()),
to_fixed_point(crop_rect.y()),
to_fixed_point(crop_rect.width()),
......@@ -332,23 +324,6 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
return false;
}
for (int i = 0; i < resources->count_connectors; ++i) {
ConnectorProperties state_props;
state_props.id = resources->connectors[i];
ScopedDrmObjectPropertyPtr props(drm_->GetObjectProperties(
resources->connectors[i], DRM_MODE_OBJECT_CONNECTOR));
if (!props) {
PLOG(ERROR) << "Failed to get Connector properties for connector="
<< state_props.id;
continue;
}
GetDrmPropertyForName(drm_, props.get(), "CRTC_ID", &state_props.crtc_id);
DCHECK(state_props.crtc_id.id);
connectors_props_.emplace_back(std::move(state_props));
}
unsigned int num_crtcs_with_out_fence_ptr = 0;
for (int i = 0; i < resources->count_crtcs; ++i) {
......@@ -363,13 +338,6 @@ bool HardwareDisplayPlaneManager::InitializeCrtcState() {
continue;
}
GetDrmPropertyForName(drm_, props.get(), "ACTIVE",
&state.properties.active);
DCHECK(state.properties.active.id);
GetDrmPropertyForName(drm_, props.get(), "MODE_ID",
&state.properties.mode_id);
DCHECK(state.properties.mode_id.id);
// These properties are optional. If they don't exist we can tell by the
// invalid ID.
GetDrmPropertyForName(drm_, props.get(), "CTM", &state.properties.ctm);
......
......@@ -8,7 +8,6 @@
#include <stddef.h>
#include <stdint.h>
#include <xf86drmMode.h>
#include <memory>
#include <vector>
......@@ -57,22 +56,13 @@ struct HardwareDisplayPlaneList {
class HardwareDisplayPlaneManager {
public:
explicit HardwareDisplayPlaneManager(DrmDevice* drm);
HardwareDisplayPlaneManager(DrmDevice* drm);
virtual ~HardwareDisplayPlaneManager();
// This parses information from the drm driver, adding any new planes
// 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(const HardwareDisplayPlaneList& plane_list);
......@@ -98,7 +88,7 @@ class HardwareDisplayPlaneManager {
uint32_t crtc_id);
// Commit the plane states in |plane_list|.
// if |should_modeset| is set, it only modesets without page flipping.
//
// If |page_flip_request| is null, this tests the plane configuration without
// submitting it.
// The fence returned in |out_fence| will signal when the currently scanned
......@@ -106,7 +96,6 @@ class HardwareDisplayPlaneManager {
// |page_flip_request|. Note that the returned fence may be a nullptr
// if the system doesn't support out fences.
virtual bool Commit(const HardwareDisplayPlaneList& plane_list,
bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) = 0;
......@@ -147,16 +136,10 @@ class HardwareDisplayPlaneManager {
const std::vector<uint32_t>& crtcs);
protected:
struct ConnectorProperties {
uint32_t id;
DrmDevice::Property crtc_id;
};
struct CrtcProperties {
// Unique identifier for the CRTC. This must be greater than 0 to be valid.
uint32_t id;
DrmDevice::Property active;
DrmDevice::Property mode_id;
// Optional properties.
DrmDevice::Property ctm;
DrmDevice::Property gamma_lut;
......@@ -202,10 +185,8 @@ class HardwareDisplayPlaneManager {
uint32_t crtc_index,
const DrmOverlayPlane& overlay) const;
// Convert |crtc/connector_id| into an index, returning -1 if the ID couldn't
// be found.
// Convert |crtc_id| into an index, returning -1 if the ID couldn't be found.
int LookupCrtcIndex(uint32_t crtc_id) const;
int LookupConnectorIndex(uint32_t connector_idx) const;
// Returns true if |plane| can support |overlay| and compatible with
// |crtc_index|.
......@@ -230,8 +211,6 @@ class HardwareDisplayPlaneManager {
std::vector<std::unique_ptr<HardwareDisplayPlane>> planes_;
std::vector<CrtcState> crtc_state_;
std::vector<ConnectorProperties> connectors_props_;
std::vector<uint32_t> supported_formats_;
DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager);
......
......@@ -7,7 +7,6 @@
#include <sync/sync.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include <memory>
#include <utility>
......@@ -58,92 +57,28 @@ HardwareDisplayPlaneManagerAtomic::HardwareDisplayPlaneManagerAtomic(
DrmDevice* drm)
: HardwareDisplayPlaneManager(drm) {}
HardwareDisplayPlaneManagerAtomic::~HardwareDisplayPlaneManagerAtomic() =
default;
bool HardwareDisplayPlaneManagerAtomic::Modeset(
uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList& plane_list) {
const int connector_idx = LookupConnectorIndex(connector_id);
DCHECK_GE(connector_idx, 0);
connectors_props_[connector_idx].crtc_id.value = crtc_id;
bool res =
AddPropertyIfValid(plane_list.atomic_property_set.get(), connector_id,
connectors_props_[connector_idx].crtc_id);
const int crtc_idx = LookupCrtcIndex(crtc_id);
DCHECK_GE(crtc_idx, 0);
crtc_state_[crtc_idx].properties.active.value = 1UL;
ScopedDrmPropertyBlob mode_blob =
drm_->CreatePropertyBlob(&mode, sizeof(mode));
crtc_state_[crtc_idx].properties.mode_id.value =
mode_blob ? mode_blob->id() : 0;
res &= AddPropertyIfValid(plane_list.atomic_property_set.get(), crtc_id,
crtc_state_[crtc_idx].properties.active);
res &= AddPropertyIfValid(plane_list.atomic_property_set.get(), crtc_id,
crtc_state_[crtc_idx].properties.mode_id);
DCHECK(res);
return Commit(plane_list, /*should_modeset=*/true,
/*page_flip_request=*/nullptr,
/*out_fence=*/nullptr);
}
bool HardwareDisplayPlaneManagerAtomic::DisableModeset(uint32_t crtc,
uint32_t connector) {
ScopedDrmAtomicReqPtr property_set(drmModeAtomicAlloc());
const int connector_idx = LookupConnectorIndex(connector);
DCHECK_GE(connector_idx, 0);
connectors_props_[connector_idx].crtc_id.value = 0UL;
bool res = AddPropertyIfValid(property_set.get(), connector,
connectors_props_[connector_idx].crtc_id);
const int crtc_idx = LookupCrtcIndex(crtc);
DCHECK_GE(crtc_idx, 0);
crtc_state_[crtc_idx].properties.active.value = 0UL;
crtc_state_[crtc_idx].properties.mode_id.value = 0UL;
res &= AddPropertyIfValid(property_set.get(), crtc,
crtc_state_[crtc_idx].properties.active);
res &= AddPropertyIfValid(property_set.get(), crtc,
crtc_state_[crtc_idx].properties.mode_id);
DCHECK(res);
return drm_->CommitProperties(property_set.get(),
DRM_MODE_ATOMIC_ALLOW_MODESET, 1, nullptr);
HardwareDisplayPlaneManagerAtomic::~HardwareDisplayPlaneManagerAtomic() {
}
bool HardwareDisplayPlaneManagerAtomic::Commit(
const HardwareDisplayPlaneList& plane_list,
bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) {
bool test_only = !should_modeset && !page_flip_request;
bool test_only = !page_flip_request;
for (HardwareDisplayPlane* plane : plane_list.old_plane_list) {
if (!base::Contains(plane_list.plane_list, plane)) {
if (plane->in_use()) {
// This plane is being released, so we need to zero it.
plane->set_in_use(false);
HardwareDisplayPlaneAtomic* atomic_plane =
static_cast<HardwareDisplayPlaneAtomic*>(plane);
atomic_plane->SetPlaneData(plane_list.atomic_property_set.get(), 0, 0,
gfx::Rect(), gfx::Rect(),
gfx::OVERLAY_TRANSFORM_NONE,
base::kInvalidPlatformFile);
}
// This plane is being released, so we need to zero it.
plane->set_in_use(false);
HardwareDisplayPlaneAtomic* atomic_plane =
static_cast<HardwareDisplayPlaneAtomic*>(plane);
atomic_plane->SetPlaneData(
plane_list.atomic_property_set.get(), 0, 0, gfx::Rect(), gfx::Rect(),
gfx::OVERLAY_TRANSFORM_NONE, base::kInvalidPlatformFile);
}
}
std::vector<uint32_t> crtcs;
for (HardwareDisplayPlane* plane : plane_list.plane_list) {
if (!plane->in_use())
continue;
HardwareDisplayPlaneAtomic* atomic_plane =
static_cast<HardwareDisplayPlaneAtomic*>(plane);
if (crtcs.empty() || crtcs.back() != atomic_plane->crtc_id())
......@@ -175,10 +110,11 @@ bool HardwareDisplayPlaneManagerAtomic::Commit(
}
uint32_t flags = 0;
if (should_modeset)
flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
else
flags = test_only ? DRM_MODE_ATOMIC_TEST_ONLY : DRM_MODE_ATOMIC_NONBLOCK;
if (test_only) {
flags = DRM_MODE_ATOMIC_TEST_ONLY;
} else {
flags = DRM_MODE_ATOMIC_NONBLOCK;
}
// After we perform the atomic commit, and if the caller has requested an
// out-fence, the out_fence_fds vector will contain any provided out-fence
......
......@@ -6,7 +6,6 @@
#define UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_ATOMIC_H_
#include <stdint.h>
#include <memory>
#include "base/macros.h"
......@@ -16,18 +15,11 @@ namespace ui {
class HardwareDisplayPlaneManagerAtomic : public HardwareDisplayPlaneManager {
public:
explicit HardwareDisplayPlaneManagerAtomic(DrmDevice* drm);
HardwareDisplayPlaneManagerAtomic(DrmDevice* drm);
~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, uint32_t connector) override;
bool Commit(const HardwareDisplayPlaneList& plane_list,
bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
bool DisableOverlayPlanes(
......
......@@ -6,7 +6,6 @@
#include <errno.h>
#include <sync/sync.h>
#include <memory>
#include <utility>
......@@ -43,31 +42,13 @@ HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy(
DrmDevice* drm)
: HardwareDisplayPlaneManager(drm) {}
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);
HardwareDisplayPlaneManagerLegacy::~HardwareDisplayPlaneManagerLegacy() {
}
bool HardwareDisplayPlaneManagerLegacy::Commit(
const HardwareDisplayPlaneList& plane_list,
bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) {
DCHECK(!should_modeset);
bool test_only = !page_flip_request;
if (test_only) {
for (HardwareDisplayPlane* plane : plane_list.plane_list) {
......
......@@ -6,7 +6,6 @@
#define UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_LEGACY_H_
#include <stdint.h>
#include <memory>
#include "base/macros.h"
......@@ -16,18 +15,11 @@ namespace ui {
class HardwareDisplayPlaneManagerLegacy : public HardwareDisplayPlaneManager {
public:
explicit HardwareDisplayPlaneManagerLegacy(DrmDevice* device);
HardwareDisplayPlaneManagerLegacy(DrmDevice* device);
~HardwareDisplayPlaneManagerLegacy() override;
// HardwareDisplayPlaneManager:
bool Modeset(uint32_t crtc_id,
uint32_t framebuffer_id,
uint32_t connector_id,
const drmModeModeInfo& mode,
const HardwareDisplayPlaneList&) override;
bool DisableModeset(uint32_t crtc_id, uint32_t connector) override;
bool Commit(const HardwareDisplayPlaneList& plane_list,
bool should_modeset,
scoped_refptr<PageFlipRequest> page_flip_request,
std::unique_ptr<gfx::GpuFence>* out_fence) override;
bool DisableOverlayPlanes(
......
......@@ -30,10 +30,6 @@
namespace {
constexpr uint32_t kCrtcIdBase = 1;
constexpr uint32_t kCrtcIdPropId = 2000;
constexpr uint32_t kPrimaryConnector = 10;
constexpr uint32_t kSecondaryConnector = 11;
constexpr uint32_t kPlaneOffset = 100;
constexpr uint32_t kTypePropId = 300;
constexpr uint32_t kInFormatsPropId = 301;
......@@ -46,23 +42,16 @@ constexpr uint32_t kDegammaLutSizePropId = 307;
constexpr uint32_t kOutFencePtrPropId = 308;
constexpr uint32_t kInFormatsBlobPropId = 400;
constexpr uint32_t kBackgroundColorPropId = 401;
constexpr uint32_t kActivePropId = 1001;
constexpr uint32_t kModePropId = 1002;
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,
public testing::WithParamInterface<bool> {
public:
HardwareDisplayPlaneManagerTest() = default;
HardwareDisplayPlaneManagerTest() {}
void InitializeDrmState(size_t crtc_count,
size_t planes_per_crtc,
size_t connector_count);
void InitializeDrmState(size_t crtc_count, size_t planes_per_crtc);
uint64_t GetObjectPropertyValue(uint32_t object_id,
uint32_t object_type,
......@@ -94,7 +83,6 @@ class HardwareDisplayPlaneManagerTest
scoped_refptr<ui::MockDrmDevice> fake_drm_;
std::vector<ui::MockDrmDevice::CrtcProperties> crtc_properties_;
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties_;
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties_;
std::map<uint32_t, std::string> property_names_;
......@@ -117,18 +105,8 @@ void HardwareDisplayPlaneManagerTest::SetUp() {
void HardwareDisplayPlaneManagerTest::InitializeDrmState(
size_t crtc_count,
size_t planes_per_crtc,
size_t connector_count) {
std::map<uint32_t, std::string> crtc_property_names = {
{kActivePropId, "ACTIVE"},
{kModePropId, "MODE_ID"},
};
std::map<uint32_t, std::string> connector_property_names = {
{kCrtcIdPropId, "CRTC_ID"},
};
std::map<uint32_t, std::string> plane_property_names = {
size_t planes_per_crtc) {
property_names_ = {
// Add all required properties.
{200, "CRTC_ID"},
{201, "CRTC_X"},
......@@ -148,18 +126,15 @@ void HardwareDisplayPlaneManagerTest::InitializeDrmState(
++planes_per_crtc;
for (size_t i = 0; i < crtc_count; ++i) {
ui::MockDrmDevice::CrtcProperties crtc_prop;
crtc_prop.id = kCrtcIdBase + i;
for (const auto& pair : crtc_property_names) {
crtc_prop.properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
// Start ID at 1 cause 0 is an invalid ID.
crtc_prop.id = i + 1;
crtc_properties_.emplace_back(std::move(crtc_prop));
for (size_t j = 0; j < planes_per_crtc; ++j) {
ui::MockDrmDevice::PlaneProperties plane_prop;
plane_prop.id = kPlaneOffset + i * planes_per_crtc + j;
plane_prop.crtc_mask = 1 << i;
for (const auto& pair : plane_property_names) {
for (const auto& pair : property_names_) {
uint32_t value = 0;
if (pair.first == kTypePropId) {
if (j == 0)
......@@ -179,35 +154,19 @@ void HardwareDisplayPlaneManagerTest::InitializeDrmState(
}
}
for (size_t i = 0; i < connector_count; ++i) {
ui::MockDrmDevice::ConnectorProperties connector_prop;
for (const auto& pair : connector_property_names) {
connector_prop.properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
connector_prop.id = i == 0 ? kPrimaryConnector : kSecondaryConnector;
connector_properties_.emplace_back(std::move(connector_prop));
}
// Separately add optional properties that will be used in some tests, but the
// tests will append the property to the planes on a case-by-case basis.
//
// Plane properties:
plane_property_names.insert({kPlaneCtmId, "PLANE_CTM"});
property_names_.insert({kPlaneCtmId, "PLANE_CTM"});
// CRTC properties:
crtc_property_names.insert({kCtmPropId, "CTM"});
crtc_property_names.insert({kGammaLutPropId, "GAMMA_LUT"});
crtc_property_names.insert({kGammaLutSizePropId, "GAMMA_LUT_SIZE"});
crtc_property_names.insert({kDegammaLutPropId, "DEGAMMA_LUT"});
crtc_property_names.insert({kDegammaLutSizePropId, "DEGAMMA_LUT_SIZE"});
crtc_property_names.insert({kOutFencePtrPropId, "OUT_FENCE_PTR"});
crtc_property_names.insert({kBackgroundColorPropId, "BACKGROUND_COLOR"});
property_names_.insert(crtc_property_names.begin(),
crtc_property_names.end());
property_names_.insert(connector_property_names.begin(),
connector_property_names.end());
property_names_.insert(plane_property_names.begin(),
plane_property_names.end());
property_names_.insert({kCtmPropId, "CTM"});
property_names_.insert({kGammaLutPropId, "GAMMA_LUT"});
property_names_.insert({kGammaLutSizePropId, "GAMMA_LUT_SIZE"});
property_names_.insert({kDegammaLutPropId, "DEGAMMA_LUT"});
property_names_.insert({kDegammaLutSizePropId, "DEGAMMA_LUT_SIZE"});
property_names_.insert({kOutFencePtrPropId, "OUT_FENCE_PTR"});
property_names_.insert({kBackgroundColorPropId, "BACKGROUND_COLOR"});
}
void HardwareDisplayPlaneManagerTest::PerformPageFlip(size_t crtc_idx) {
......@@ -223,8 +182,8 @@ void HardwareDisplayPlaneManagerTest::PerformPageFlip(size_t crtc_idx) {
&state, assigns, crtc_properties_[crtc_idx].id));
scoped_refptr<ui::PageFlipRequest> page_flip_request =
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
ASSERT_TRUE(fake_drm_->plane_manager()->Commit(
state, /*should_modeset=*/false, page_flip_request, nullptr));
ASSERT_TRUE(
fake_drm_->plane_manager()->Commit(state, page_flip_request, nullptr));
}
uint64_t HardwareDisplayPlaneManagerTest::GetObjectPropertyValue(
......@@ -254,31 +213,13 @@ uint64_t HardwareDisplayPlaneManagerTest::GetPlanePropertyValue(
using HardwareDisplayPlaneManagerLegacyTest = HardwareDisplayPlaneManagerTest;
using HardwareDisplayPlaneManagerAtomicTest = HardwareDisplayPlaneManagerTest;
TEST_P(HardwareDisplayPlaneManagerLegacyTest, Modeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/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, SinglePlaneAssignment) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -289,10 +230,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, AddCursor) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
bool cursor_found = false;
for (const auto& plane : fake_drm_->plane_manager()->planes()) {
......@@ -308,10 +248,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, BadCrtc) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(
fake_drm_->plane_manager()->AssignOverlayPlanes(&state_, assigns, 0));
......@@ -322,10 +261,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, NotEnoughPlanes) {
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -335,10 +273,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, MultipleCrtcs) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -352,10 +289,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, MultiplePlanesAndCrtcs) {
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -369,10 +305,9 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) {
CreateBufferWithFormat(kDefaultBufferSize, DRM_FORMAT_NV12);
assigns.push_back(ui::DrmOverlayPlane(buffer, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
fake_drm_->plane_manager()->BeginFrame(state_);
// This should return false as plane manager creates planes which support
......@@ -391,26 +326,14 @@ TEST_P(HardwareDisplayPlaneManagerLegacyTest, CheckFramebufferFormatMatch) {
&state_, assigns, crtc_properties_[0].id));
}
TEST_P(HardwareDisplayPlaneManagerLegacyTest, DisableModeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/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(HardwareDisplayPlaneManagerAtomicTest, MultiplePlaneAssignment) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -422,10 +345,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultiplePlanesAndCrtcs) {
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -441,8 +363,7 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, SharedPlanes) {
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
assigns.push_back(ui::DrmOverlayPlane(buffer, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
ui::MockDrmDevice::PlaneProperties plane_prop;
plane_prop.id = 102;
plane_prop.crtc_mask = (1 << 0) | (1 << 1);
......@@ -451,8 +372,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, SharedPlanes) {
{/* .id = */ kInFormatsPropId, /* .value = */ kInFormatsBlobPropId},
};
plane_properties_.emplace_back(std::move(plane_prop));
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[1].id));
......@@ -463,10 +384,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, SharedPlanes) {
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, UnusedPlanesAreReleased) {
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
ui::DrmOverlayPlaneList assigns;
scoped_refptr<ui::DrmFramebuffer> primary_buffer =
......@@ -482,8 +402,8 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, UnusedPlanesAreReleased) {
fake_drm_->plane_manager()->BeginFrame(hdpl);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl, assigns, crtc_properties_[0].id));
EXPECT_TRUE(fake_drm_->plane_manager()->Commit(hdpl, /*should_modeset=*/false,
page_flip_request, nullptr));
EXPECT_TRUE(
fake_drm_->plane_manager()->Commit(hdpl, page_flip_request, nullptr));
assigns.clear();
assigns.push_back(ui::DrmOverlayPlane(primary_buffer, nullptr));
......@@ -492,13 +412,11 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, UnusedPlanesAreReleased) {
fake_drm_->plane_manager()->BeginFrame(hdpl2);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&hdpl2, assigns, crtc_properties_[0].id));
for (auto* plane : hdpl.plane_list)
plane->set_in_use(true);
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
hdpl2, /*should_modeset=*/false, page_flip_request, nullptr));
EXPECT_TRUE(
fake_drm_->plane_manager()->Commit(hdpl2, page_flip_request, nullptr));
EXPECT_NE(0u, GetPlanePropertyValue(kPlaneOffset, "FB_ID"));
EXPECT_EQ(0u, GetPlanePropertyValue(kPlaneOffset + 1, "FB_ID"));
}
......@@ -507,10 +425,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultipleFrames) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -530,10 +447,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultipleFramesDifferentPlanes) {
ui::DrmOverlayPlaneList assigns;
assigns.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/2);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->AssignOverlayPlanes(
&state_, assigns, crtc_properties_[0].id));
......@@ -547,14 +463,13 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest, MultipleFramesDifferentPlanes) {
TEST_P(HardwareDisplayPlaneManagerAtomicTest,
SetColorCorrectionOnAllCrtcPlanes_Success) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
plane_properties_[0].properties.push_back(
{/* .id = */ kPlaneCtmId, /* .value = */ 0});
plane_properties_[1].properties.push_back(
{/* .id = */ kPlaneCtmId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
ui::ScopedDrmColorCtmPtr ctm_blob(ui::CreateCTMBlob(std::vector<float>(9)));
EXPECT_TRUE(fake_drm_->plane_manager()->SetColorCorrectionOnAllCrtcPlanes(
......@@ -564,10 +479,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
TEST_P(HardwareDisplayPlaneManagerAtomicTest,
SetColorCorrectionOnAllCrtcPlanes_NoPlaneCtmProperty) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
ui::ScopedDrmColorCtmPtr ctm_blob(ui::CreateCTMBlob(std::vector<float>(9)));
EXPECT_FALSE(fake_drm_->plane_manager()->SetColorCorrectionOnAllCrtcPlanes(
......@@ -577,12 +491,11 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
TEST_P(HardwareDisplayPlaneManagerAtomicTest,
SetColorCorrectionOnAllCrtcPlanes_OnePlaneMissingCtmProperty) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/2,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/2);
plane_properties_[0].properties.push_back(
{/* .id = */ kPlaneCtmId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
ui::ScopedDrmColorCtmPtr ctm_blob(ui::CreateCTMBlob(std::vector<float>(9)));
EXPECT_FALSE(fake_drm_->plane_manager()->SetColorCorrectionOnAllCrtcPlanes(
......@@ -590,88 +503,12 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
EXPECT_EQ(0, fake_drm_->get_commit_count());
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, Modeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/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(1, fake_drm_->get_commit_count());
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest, DisableModeset) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/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(1, fake_drm_->get_commit_count());
}
TEST_P(HardwareDisplayPlaneManagerAtomicTest,
CheckPropsAfterModesetAndDisable) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/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));
// Test props values after modesetting.
ui::DrmDevice::Property connector_prop_crtc_id;
ui::ScopedDrmObjectPropertyPtr connector_props =
fake_drm_->GetObjectProperties(kPrimaryConnector,
DRM_MODE_OBJECT_CONNECTOR);
ui::GetDrmPropertyForName(fake_drm_.get(), connector_props.get(), "CRTC_ID",
&connector_prop_crtc_id);
EXPECT_EQ(kCrtcIdPropId, connector_prop_crtc_id.id);
ui::DrmDevice::Property crtc_prop_for_name;
ui::ScopedDrmObjectPropertyPtr crtc_props =
fake_drm_->GetObjectProperties(kCrtcIdBase, DRM_MODE_OBJECT_CRTC);
ui::GetDrmPropertyForName(fake_drm_.get(), crtc_props.get(), "ACTIVE",
&crtc_prop_for_name);
EXPECT_EQ(kActivePropId, crtc_prop_for_name.id);
EXPECT_EQ(1U, crtc_prop_for_name.value);
ui::GetDrmPropertyForName(fake_drm_.get(), crtc_props.get(), "MODE_ID",
&crtc_prop_for_name);
EXPECT_EQ(kModePropId, crtc_prop_for_name.id);
// Test props values after disabling.
EXPECT_TRUE(fake_drm_->plane_manager()->DisableModeset(
crtc_properties_[0].id, connector_properties_[0].id));
crtc_props =
fake_drm_->GetObjectProperties(kCrtcIdBase, DRM_MODE_OBJECT_CRTC);
ui::GetDrmPropertyForName(fake_drm_.get(), crtc_props.get(), "ACTIVE",
&crtc_prop_for_name);
EXPECT_EQ(kActivePropId, crtc_prop_for_name.id);
EXPECT_EQ(0U, crtc_prop_for_name.value);
}
TEST_P(HardwareDisplayPlaneManagerTest, SetColorMatrix_Success) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kCtmPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_TRUE(fake_drm_->plane_manager()->SetColorMatrix(
crtc_properties_[0].id, std::vector<float>(9)));
......@@ -689,12 +526,11 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetColorMatrix_Success) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetColorMatrix_ErrorEmptyCtm) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kCtmPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(
fake_drm_->plane_manager()->SetColorMatrix(crtc_properties_[0].id, {}));
......@@ -708,12 +544,11 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetColorMatrix_ErrorEmptyCtm) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingDegamma) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kCtmPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(fake_drm_->plane_manager()->SetGammaCorrection(
crtc_properties_[0].id, {{0, 0, 0}}, {}));
......@@ -727,9 +562,8 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingDegamma) {
crtc_properties_[0].properties.push_back(
{/* .id = */ kDegammaLutSizePropId, /* .value = */ 1});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic=*/true);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, /*use_atomic=*/true);
EXPECT_FALSE(fake_drm_->plane_manager()->SetGammaCorrection(
crtc_properties_[0].id, {{0, 0, 0}}, {}));
......@@ -743,12 +577,11 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingDegamma) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingGamma) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kCtmPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(fake_drm_->plane_manager()->SetGammaCorrection(
crtc_properties_[0].id, {}, {{0, 0, 0}}));
......@@ -762,9 +595,8 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingGamma) {
crtc_properties_[0].properties.push_back(
{/* .id = */ kGammaLutSizePropId, /* .value = */ 1});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_,
/*use_atomic=*/true);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, /*use_atomic=*/true);
EXPECT_FALSE(fake_drm_->plane_manager()->SetGammaCorrection(
crtc_properties_[0].id, {}, {{0, 0, 0}}));
......@@ -778,10 +610,9 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_MissingGamma) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_LegacyGamma) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
fake_drm_->set_legacy_gamma_ramp_expectation(true);
EXPECT_TRUE(fake_drm_->plane_manager()->SetGammaCorrection(
......@@ -799,12 +630,11 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_LegacyGamma) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_Success) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kCtmPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
EXPECT_FALSE(fake_drm_->plane_manager()->SetGammaCorrection(
crtc_properties_[0].id, {{0, 0, 0}}, {}));
......@@ -818,8 +648,8 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_Success) {
{/* .id = */ kGammaLutSizePropId, /* .value = */ 1});
crtc_properties_[0].properties.push_back(
{/* .id = */ kGammaLutPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
// Check that we reset the properties correctly.
EXPECT_TRUE(fake_drm_->plane_manager()->SetGammaCorrection(
......@@ -854,32 +684,31 @@ TEST_P(HardwareDisplayPlaneManagerTest, SetGammaCorrection_Success) {
}
TEST_P(HardwareDisplayPlaneManagerTest, SetBackgroundColor_Success) {
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/1, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kBackgroundColorPropId, /* .value = */ 0});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
fake_drm_->plane_manager()->SetBackgroundColor(crtc_properties_[0].id, 0);
if (use_atomic_) {
PerformPageFlip(/*crtc_idx=*/0);
EXPECT_EQ(1, fake_drm_->get_commit_count());
EXPECT_EQ(0u,
GetCrtcPropertyValue(crtc_properties_[0].id, "BACKGROUND_COLOR"));
EXPECT_EQ(0u, GetCrtcPropertyValue(crtc_properties_[0].id,
"BACKGROUND_COLOR"));
} else {
EXPECT_EQ(0, fake_drm_->get_set_object_property_count());
}
crtc_properties_[0].properties.push_back(
{/* .id = */ kBackgroundColorPropId, /* .value = */ 1});
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
fake_drm_->plane_manager()->SetBackgroundColor(crtc_properties_[0].id, 1);
if (use_atomic_) {
PerformPageFlip(/*crtc_idx=*/0);
EXPECT_EQ(2, fake_drm_->get_commit_count());
EXPECT_EQ(1u,
GetCrtcPropertyValue(crtc_properties_[0].id, "BACKGROUND_COLOR"));
EXPECT_EQ(1u, GetCrtcPropertyValue(crtc_properties_[0].id,
"BACKGROUND_COLOR"));
} else {
EXPECT_EQ(0, fake_drm_->get_set_object_property_count());
}
......@@ -890,10 +719,9 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
scoped_refptr<ui::DrmFramebuffer> fake_buffer2 =
CreateBuffer(kDefaultBufferSize);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1,
/*connector_count=*/1);
fake_drm_->InitializeState(crtc_properties_, connector_properties_,
plane_properties_, property_names_, use_atomic_);
InitializeDrmState(/*crtc_count=*/2, /*planes_per_crtc=*/1);
fake_drm_->InitializeState(crtc_properties_, plane_properties_,
property_names_, use_atomic_);
ui::DrmOverlayPlaneList assigns1;
assigns1.push_back(ui::DrmOverlayPlane(fake_buffer_, nullptr));
......@@ -910,29 +738,26 @@ TEST_P(HardwareDisplayPlaneManagerAtomicTest,
base::MakeRefCounted<ui::PageFlipRequest>(base::TimeDelta());
std::unique_ptr<gfx::GpuFence> out_fence;
EXPECT_TRUE(fake_drm_->plane_manager()->Commit(
state_, /*should_modeset=*/false, page_flip_request, &out_fence));
EXPECT_TRUE(fake_drm_->plane_manager()->Commit(state_, page_flip_request,
&out_fence));
EXPECT_EQ(nullptr, out_fence);
}
TEST_P(HardwareDisplayPlaneManagerTest,
InitializationFailsIfSupportForOutFencePropertiesIsPartial) {
InitializeDrmState(/*crtc_count=*/3, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/3, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kOutFencePtrPropId, /* .value = */ 1});
crtc_properties_[2].properties.push_back(
{/* .id = */ kOutFencePtrPropId, /* .value = */ 2});
EXPECT_FALSE(fake_drm_->InitializeStateWithResult(
crtc_properties_, connector_properties_, plane_properties_,
property_names_, use_atomic_));
crtc_properties_, plane_properties_, property_names_, use_atomic_));
}
TEST_P(HardwareDisplayPlaneManagerTest,
InitializationSucceedsIfSupportForOutFencePropertiesIsComplete) {
InitializeDrmState(/*crtc_count=*/3, /*planes_per_crtc=*/1,
/*connector_count=*/1);
InitializeDrmState(/*crtc_count=*/3, /*planes_per_crtc=*/1);
crtc_properties_[0].properties.push_back(
{/* .id = */ kOutFencePtrPropId, /* .value = */ 1});
crtc_properties_[1].properties.push_back(
......@@ -941,8 +766,7 @@ TEST_P(HardwareDisplayPlaneManagerTest,
{/* .id = */ kOutFencePtrPropId, /* .value = */ 3});
EXPECT_TRUE(fake_drm_->InitializeStateWithResult(
crtc_properties_, connector_properties_, plane_properties_,
property_names_, use_atomic_));
crtc_properties_, plane_properties_, property_names_, use_atomic_));
}
INSTANTIATE_TEST_SUITE_P(All,
......@@ -991,7 +815,7 @@ void FakeFenceFD::Signal() const {
class HardwareDisplayPlaneManagerPlanesReadyTest : public testing::Test {
protected:
HardwareDisplayPlaneManagerPlanesReadyTest() = default;
HardwareDisplayPlaneManagerPlanesReadyTest() {}
void SetUp() override {
auto gbm_device = std::make_unique<ui::MockGbmDevice>();
......@@ -1120,7 +944,7 @@ TEST_F(HardwareDisplayPlaneManagerPlanesReadyTest,
class HardwareDisplayPlaneAtomicMock : public ui::HardwareDisplayPlaneAtomic {
public:
HardwareDisplayPlaneAtomicMock() : ui::HardwareDisplayPlaneAtomic(1) {}
~HardwareDisplayPlaneAtomicMock() override = default;
~HardwareDisplayPlaneAtomicMock() override {}
bool SetPlaneData(drmModeAtomicReq* property_set,
uint32_t crtc_id,
......
......@@ -70,11 +70,6 @@ MockDrmDevice::CrtcProperties::CrtcProperties() = default;
MockDrmDevice::CrtcProperties::CrtcProperties(const CrtcProperties&) = default;
MockDrmDevice::CrtcProperties::~CrtcProperties() = default;
MockDrmDevice::ConnectorProperties::ConnectorProperties() = default;
MockDrmDevice::ConnectorProperties::ConnectorProperties(
const ConnectorProperties&) = default;
MockDrmDevice::ConnectorProperties::~ConnectorProperties() = default;
MockDrmDevice::PlaneProperties::PlaneProperties() = default;
MockDrmDevice::PlaneProperties::PlaneProperties(const PlaneProperties&) =
default;
......@@ -131,23 +126,19 @@ ScopedDrmPropertyBlobPtr MockDrmDevice::AllocateInFormatsBlob(
void MockDrmDevice::InitializeState(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic) {
CHECK(InitializeStateWithResult(crtc_properties, connector_properties,
plane_properties, property_names,
use_atomic));
CHECK(InitializeStateWithResult(crtc_properties, plane_properties,
property_names, use_atomic));
}
bool MockDrmDevice::InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic) {
crtc_properties_ = crtc_properties;
connector_properties_ = connector_properties;
plane_properties_ = plane_properties;
property_names_ = property_names;
if (use_atomic) {
......@@ -159,7 +150,7 @@ bool MockDrmDevice::InitializeStateWithResult(
return plane_manager_->Initialize();
}
MockDrmDevice::~MockDrmDevice() = default;
MockDrmDevice::~MockDrmDevice() {}
ScopedDrmResourcesPtr MockDrmDevice::GetResources() {
ScopedDrmResourcesPtr resources(DrmAllocator<drmModeRes>());
......@@ -169,12 +160,6 @@ ScopedDrmResourcesPtr MockDrmDevice::GetResources() {
for (size_t i = 0; i < crtc_properties_.size(); ++i)
resources->crtcs[i] = crtc_properties_[i].id;
resources->count_connectors = connector_properties_.size();
resources->connectors = static_cast<uint32_t*>(
drmMalloc(sizeof(uint32_t) * resources->count_connectors));
for (size_t i = 0; i < connector_properties_.size(); ++i)
resources->connectors[i] = connector_properties_[i].id;
return resources;
}
......@@ -200,11 +185,6 @@ ScopedDrmObjectPropertyPtr MockDrmDevice::GetObjectProperties(
CrtcProperties* properties = FindObjectById(object_id, crtc_properties_);
if (properties)
return CreatePropertyObject(properties->properties);
} else if (object_type == DRM_MODE_OBJECT_CONNECTOR) {
ConnectorProperties* properties =
FindObjectById(object_id, connector_properties_);
if (properties)
return CreatePropertyObject(properties->properties);
}
return nullptr;
......@@ -218,13 +198,19 @@ ScopedDrmCrtcPtr MockDrmDevice::GetCrtc(uint32_t crtc_id) {
bool MockDrmDevice::SetCrtc(uint32_t crtc_id,
uint32_t framebuffer,
std::vector<uint32_t> connectors,
drmModeModeInfo mode) {
drmModeModeInfo* mode) {
crtc_fb_[crtc_id] = framebuffer;
current_framebuffer_ = framebuffer;
set_crtc_call_count_++;
return set_crtc_expectation_;
}
bool MockDrmDevice::SetCrtc(drmModeCrtc* crtc,
std::vector<uint32_t> connectors) {
restore_crtc_call_count_++;
return true;
}
bool MockDrmDevice::DisableCrtc(uint32_t crtc_id) {
current_framebuffer_ = 0;
return true;
......@@ -318,7 +304,7 @@ bool MockDrmDevice::SetProperty(uint32_t connector_id,
return true;
}
ScopedDrmPropertyBlob MockDrmDevice::CreatePropertyBlob(const void* blob,
ScopedDrmPropertyBlob MockDrmDevice::CreatePropertyBlob(void* blob,
size_t size) {
uint32_t id = ++property_id_generator_;
allocated_property_blobs_.insert(id);
......@@ -498,12 +484,6 @@ bool MockDrmDevice::UpdateProperty(uint32_t object_id,
if (crtc_properties)
return UpdateProperty(property_id, value, &crtc_properties->properties);
ConnectorProperties* connector_properties =
FindObjectById(object_id, connector_properties_);
if (connector_properties)
return UpdateProperty(property_id, value,
&connector_properties->properties);
return false;
}
......
......@@ -34,16 +34,6 @@ class MockDrmDevice : public DrmDevice {
std::vector<DrmDevice::Property> properties;
};
struct ConnectorProperties {
ConnectorProperties();
ConnectorProperties(const ConnectorProperties&);
~ConnectorProperties();
uint32_t id;
std::vector<DrmDevice::Property> properties;
};
struct PlaneProperties {
PlaneProperties();
PlaneProperties(const PlaneProperties&);
......@@ -54,7 +44,7 @@ class MockDrmDevice : public DrmDevice {
std::vector<DrmDevice::Property> properties;
};
explicit MockDrmDevice(std::unique_ptr<GbmDevice> gbm_device);
MockDrmDevice(std::unique_ptr<GbmDevice> gbm_device);
static ScopedDrmPropertyBlobPtr AllocateInFormatsBlob(
uint32_t id,
......@@ -101,15 +91,12 @@ class MockDrmDevice : public DrmDevice {
void set_connector_type(uint32_t type) { connector_type_ = type; }
void InitializeState(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
void InitializeState(const std::vector<CrtcProperties>& crtc_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
bool InitializeStateWithResult(
const std::vector<CrtcProperties>& crtc_properties,
const std::vector<ConnectorProperties>& connector_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
bool use_atomic);
......@@ -127,7 +114,8 @@ class MockDrmDevice : public DrmDevice {
bool SetCrtc(uint32_t crtc_id,
uint32_t framebuffer,
std::vector<uint32_t> connectors,
drmModeModeInfo mode) override;
drmModeModeInfo* mode) override;
bool SetCrtc(drmModeCrtc* crtc, std::vector<uint32_t> connectors) override;
bool DisableCrtc(uint32_t crtc_id) override;
ScopedDrmConnectorPtr GetConnector(uint32_t connector_id) override;
bool AddFramebuffer2(uint32_t width,
......@@ -151,8 +139,7 @@ class MockDrmDevice : public DrmDevice {
bool SetProperty(uint32_t connector_id,
uint32_t property_id,
uint64_t value) override;
ScopedDrmPropertyBlob CreatePropertyBlob(const void* blob,
size_t size) override;
ScopedDrmPropertyBlob CreatePropertyBlob(void* blob, size_t size) override;
void DestroyPropertyBlob(uint32_t id) override;
bool GetCapability(uint64_t capability, uint64_t* value) override;
ScopedDrmPropertyBlobPtr GetPropertyBlob(uint32_t property_id) override;
......@@ -228,8 +215,6 @@ class MockDrmDevice : public DrmDevice {
std::vector<CrtcProperties> crtc_properties_;
std::vector<ConnectorProperties> connector_properties_;
std::vector<PlaneProperties> plane_properties_;
std::map<uint32_t, std::string> property_names_;
......
......@@ -32,14 +32,9 @@ const drmModeModeInfo kDefaultMode = {0, 6, 0, 0, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, {'\0'}};
const uint32_t kPrimaryCrtc = 1;
const uint32_t kPrimaryConnector = 100;
const uint32_t kSecondaryCrtc = kPrimaryCrtc + 1;
const uint32_t kSecondaryConnector = kPrimaryConnector + 1;
constexpr uint32_t kPlaneIdBase = 200;
constexpr uint32_t kTypePropId = 3010;
constexpr uint32_t kInFormatsPropId = 3011;
constexpr uint32_t kInFormatsBlobPropIdBase = 400;
const uint32_t kPrimaryConnector = 2;
const uint32_t kSecondaryCrtc = 3;
const uint32_t kSecondaryConnector = 4;
drmModeModeInfo Mode(uint16_t hdisplay, uint16_t vdisplay) {
return {0, hdisplay, 0, 0, 0, 0, vdisplay, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
......@@ -49,116 +44,8 @@ drmModeModeInfo Mode(uint16_t hdisplay, uint16_t vdisplay) {
class ScreenManagerTest : public testing::Test {
public:
ScreenManagerTest() = default;
~ScreenManagerTest() override = default;
struct PlaneState {
std::vector<uint32_t> formats;
};
struct CrtcState {
std::vector<PlaneState> planes;
};
void InitializeDrmState(const std::vector<CrtcState>& crtc_states,
bool atomic) {
std::vector<ui::MockDrmDevice::CrtcProperties> crtc_properties(
crtc_states.size());
std::map<uint32_t, std::string> crtc_property_names = {
{1000, "ACTIVE"},
{1001, "MODE_ID"},
};
std::vector<ui::MockDrmDevice::ConnectorProperties> connector_properties(
crtc_states.size());
std::map<uint32_t, std::string> connector_property_names = {
{2000, "CRTC_ID"},
};
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties = {};
constexpr uint32_t kPlaneCrtcidId = 3000;
std::map<uint32_t, std::string> plane_property_names = {
// Add all required properties.
{kPlaneCrtcidId, "CRTC_ID"},
{3001, "CRTC_X"},
{3002, "CRTC_Y"},
{3003, "CRTC_W"},
{3004, "CRTC_H"},
{3005, "FB_ID"},
{3006, "SRC_X"},
{3007, "SRC_Y"},
{3008, "SRC_W"},
{3009, "SRC_H"},
// Defines some optional properties we use for convenience.
{kTypePropId, "type"},
{kInFormatsPropId, "IN_FORMATS"}};
uint32_t plane_id = kPlaneIdBase;
uint32_t property_id = kInFormatsBlobPropIdBase;
for (size_t crtc_idx = 0; crtc_idx < crtc_states.size(); ++crtc_idx) {
crtc_properties[crtc_idx].id = kPrimaryCrtc + crtc_idx;
for (const auto& pair : crtc_property_names) {
crtc_properties[crtc_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
connector_properties[crtc_idx].id = kPrimaryConnector + crtc_idx;
for (const auto& pair : connector_property_names) {
connector_properties[crtc_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ 0});
}
std::vector<ui::MockDrmDevice::PlaneProperties> crtc_plane_properties(
crtc_states[crtc_idx].planes.size());
for (size_t plane_idx = 0;
plane_idx < crtc_states[crtc_idx].planes.size(); ++plane_idx) {
crtc_plane_properties[plane_idx].id = plane_id++;
crtc_plane_properties[plane_idx].crtc_mask = 1 << crtc_idx;
for (const auto& pair : plane_property_names) {
uint64_t value = 0;
switch (pair.first) {
case kTypePropId:
value = plane_idx == 0 ? DRM_PLANE_TYPE_PRIMARY
: DRM_PLANE_TYPE_OVERLAY;
break;
case kInFormatsPropId:
value = property_id++;
drm_->SetPropertyBlob(ui::MockDrmDevice::AllocateInFormatsBlob(
value, crtc_states[crtc_idx].planes[plane_idx].formats,
std::vector<drm_format_modifier>()));
break;
case kPlaneCrtcidId:
value = crtc_properties[crtc_idx].id;
break;
default:
break;
}
crtc_plane_properties[plane_idx].properties.push_back(
{/* .id = */ pair.first, /* .value = */ value});
}
}
plane_properties.insert(plane_properties.end(),
crtc_plane_properties.begin(),
crtc_plane_properties.end());
}
std::map<uint32_t, std::string> property_names = {};
property_names.insert(crtc_property_names.begin(),
crtc_property_names.end());
property_names.insert(connector_property_names.begin(),
connector_property_names.end());
property_names.insert(plane_property_names.begin(),
plane_property_names.end());
drm_->InitializeState(crtc_properties, connector_properties,
plane_properties, property_names,
/* use_atomic= */ true);
}
ScreenManagerTest() {}
~ScreenManagerTest() override {}
gfx::Rect GetPrimaryBounds() const {
return gfx::Rect(0, 0, kDefaultMode.hdisplay, kDefaultMode.vdisplay);
......@@ -176,7 +63,6 @@ class ScreenManagerTest : public testing::Test {
device_manager_ = std::make_unique<ui::DrmDeviceManager>(nullptr);
screen_manager_ = std::make_unique<ui::ScreenManager>();
}
void TearDown() override {
screen_manager_.reset();
drm_ = nullptr;
......@@ -315,24 +201,6 @@ TEST_F(ScreenManagerTest, CheckForControllersInMirroredMode) {
}
TEST_F(ScreenManagerTest, CheckMirrorModeTransitions) {
std::vector<CrtcState> crtc_states = {
{
/* .planes = */
{
{/* .formats = */ {DRM_FORMAT_XRGB8888}},
{/* .formats = */ {DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12}},
},
},
{
/* .planes = */
{
{/* .formats = */ {DRM_FORMAT_XRGB8888}},
{/* .formats = */ {DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12}},
},
},
};
InitializeDrmState(crtc_states, /*atomic=*/true);
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
screen_manager_->ConfigureDisplayController(
drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(),
......@@ -484,24 +352,6 @@ TEST_F(ScreenManagerTest, ReuseFramebufferIfDisabledThenReEnabled) {
}
TEST_F(ScreenManagerTest, CheckMirrorModeAfterBeginReEnabled) {
std::vector<CrtcState> crtc_states = {
{
/* .planes = */
{
{/* .formats = */ {DRM_FORMAT_XRGB8888}},
{/* .formats = */ {DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12}},
},
},
{
/* .planes = */
{
{/* .formats = */ {DRM_FORMAT_XRGB8888}},
{/* .formats = */ {DRM_FORMAT_XRGB8888, DRM_FORMAT_NV12}},
},
},
};
InitializeDrmState(crtc_states, /*atomic=*/true);
screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
screen_manager_->ConfigureDisplayController(
drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(),
......
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