Commit 29e62da7 authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Add tests to verify atomic props have been set after modeset/Disable

Extend HardwareDisplayControllerTest to make sure every assigned
prop has been correctly committed at modeset/disable for crtc, connector and plane.

BUG=1082882,1136610
TEST=HardwareDisplayControllerTest.{CrtcPropsAfterModeset,
ConnectorPropsAfterModeset, PlanePropsAfterModeset,
CheckDisableResetProps}

Change-Id: Ifc9a00c5d5991f0d5dea5190865aaeccdd0f5537
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2488363
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Reviewed-by: default avatarGil Dekel <gildekel@chromium.org>
Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Cr-Commit-Position: refs/heads/master@{#821763}
parent da4f6306
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvas.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/gpu_fence.h" #include "ui/gfx/gpu_fence.h"
#include "ui/gfx/linux/gbm_buffer.h" #include "ui/gfx/linux/gbm_buffer.h"
#include "ui/gfx/linux/test/mock_gbm_device.h" #include "ui/gfx/linux/test/mock_gbm_device.h"
...@@ -41,9 +42,20 @@ constexpr uint32_t kInFormatsBlobPropId = 400; ...@@ -41,9 +42,20 @@ constexpr uint32_t kInFormatsBlobPropId = 400;
constexpr uint32_t kActivePropId = 1000; constexpr uint32_t kActivePropId = 1000;
constexpr uint32_t kModePropId = 1001; constexpr uint32_t kModePropId = 1001;
constexpr uint32_t kCrtcIdPropId = 2000; constexpr uint32_t kCrtcIdPropId = 2000;
constexpr uint32_t kFenceFdPropId = 3010;
constexpr uint32_t kTypePropId = 3011; constexpr uint32_t kPlaneCrtcId = 3001;
constexpr uint32_t kInFormatsPropId = 3012; constexpr uint32_t kCrtcX = 3002;
constexpr uint32_t kCrtcY = 3003;
constexpr uint32_t kCrtcW = 3004;
constexpr uint32_t kCrtcH = 3005;
constexpr uint32_t kPlaneFbId = 3006;
constexpr uint32_t kSrcX = 3007;
constexpr uint32_t kSrcY = 3008;
constexpr uint32_t kSrcW = 3009;
constexpr uint32_t kSrcH = 3010;
constexpr uint32_t kFenceFdPropId = 3011;
constexpr uint32_t kTypePropId = 3012;
constexpr uint32_t kInFormatsPropId = 3013;
const gfx::Size kDefaultModeSize(kDefaultMode.hdisplay, kDefaultMode.vdisplay); const gfx::Size kDefaultModeSize(kDefaultMode.hdisplay, kDefaultMode.vdisplay);
const gfx::Size kOverlaySize(kDefaultMode.hdisplay / 2, const gfx::Size kOverlaySize(kDefaultMode.hdisplay / 2,
...@@ -83,7 +95,7 @@ void FakeFenceFD::Signal() const { ...@@ -83,7 +95,7 @@ void FakeFenceFD::Signal() const {
class HardwareDisplayControllerTest : public testing::Test { class HardwareDisplayControllerTest : public testing::Test {
public: public:
HardwareDisplayControllerTest() : page_flips_(0) {} HardwareDisplayControllerTest() = default;
~HardwareDisplayControllerTest() override = default; ~HardwareDisplayControllerTest() override = default;
void SetUp() override; void SetUp() override;
...@@ -117,7 +129,7 @@ class HardwareDisplayControllerTest : public testing::Test { ...@@ -117,7 +129,7 @@ class HardwareDisplayControllerTest : public testing::Test {
std::unique_ptr<ui::HardwareDisplayController> controller_; std::unique_ptr<ui::HardwareDisplayController> controller_;
scoped_refptr<ui::MockDrmDevice> drm_; scoped_refptr<ui::MockDrmDevice> drm_;
int page_flips_; int page_flips_ = 0;
gfx::SwapResult last_swap_result_; gfx::SwapResult last_swap_result_;
gfx::PresentationFeedback last_presentation_feedback_; gfx::PresentationFeedback last_presentation_feedback_;
...@@ -161,16 +173,16 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) { ...@@ -161,16 +173,16 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties; std::vector<ui::MockDrmDevice::PlaneProperties> plane_properties;
std::map<uint32_t, std::string> plane_property_names = { std::map<uint32_t, std::string> plane_property_names = {
// Add all required properties. // Add all required properties.
{3000, "CRTC_ID"}, {kPlaneCrtcId, "CRTC_ID"},
{3001, "CRTC_X"}, {kCrtcX, "CRTC_X"},
{3002, "CRTC_Y"}, {kCrtcY, "CRTC_Y"},
{3003, "CRTC_W"}, {kCrtcW, "CRTC_W"},
{3004, "CRTC_H"}, {kCrtcH, "CRTC_H"},
{3005, "FB_ID"}, {kPlaneFbId, "FB_ID"},
{3006, "SRC_X"}, {kSrcX, "SRC_X"},
{3007, "SRC_Y"}, {kSrcY, "SRC_Y"},
{3008, "SRC_W"}, {kSrcW, "SRC_W"},
{3009, "SRC_H"}, {kSrcH, "SRC_H"},
{kFenceFdPropId, "IN_FENCE_FD"}, {kFenceFdPropId, "IN_FENCE_FD"},
// Add some optional properties we use for convenience. // Add some optional properties we use for convenience.
{kTypePropId, "type"}, {kTypePropId, "type"},
...@@ -295,45 +307,123 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) { ...@@ -295,45 +307,123 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
EXPECT_FALSE(plane.buffer->HasOneRef()); EXPECT_FALSE(plane.buffer->HasOneRef());
} }
TEST_F(HardwareDisplayControllerTest, CheckModesettingSetsProps) { TEST_F(HardwareDisplayControllerTest, CrtcPropsAfterModeset) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr); ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(ModesetWithPlane(plane1)); EXPECT_TRUE(ModesetWithPlane(plane1));
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr); ui::ScopedDrmObjectPropertyPtr crtc_props =
std::vector<ui::DrmOverlayPlane> planes = {}; drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
planes.push_back(plane2.Clone()); {
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", &prop);
EXPECT_EQ(kActivePropId, prop.id);
EXPECT_EQ(1U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &prop);
EXPECT_EQ(kModePropId, prop.id);
EXPECT_GT(prop.value, 0U);
}
}
SchedulePageFlip(std::move(planes)); TEST_F(HardwareDisplayControllerTest, ConnectorPropsAfterModeset) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
EXPECT_TRUE(ModesetWithPlane(plane1));
// Test props values after modesetting.
ui::DrmDevice::Property connector_prop_crtc_id = {};
ui::ScopedDrmObjectPropertyPtr connector_props = ui::ScopedDrmObjectPropertyPtr connector_props =
drm_->GetObjectProperties(kConnectorIdBase, DRM_MODE_OBJECT_CONNECTOR); drm_->GetObjectProperties(kConnectorIdBase, 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::DrmDevice::Property prop = {};
ui::ScopedDrmObjectPropertyPtr crtc_props = ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC); &prop);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", EXPECT_EQ(kCrtcIdPropId, prop.id);
&crtc_prop_for_name); EXPECT_EQ(kCrtcIdBase, prop.value);
EXPECT_EQ(kActivePropId, crtc_prop_for_name.id); }
EXPECT_EQ(1U, crtc_prop_for_name.value);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", TEST_F(HardwareDisplayControllerTest, PlanePropsAfterModeset) {
&crtc_prop_for_name); const FakeFenceFD fake_fence_fd;
EXPECT_EQ(kModePropId, crtc_prop_for_name.id); ui::DrmOverlayPlane plane1(CreateBuffer(), fake_fence_fd.GetGpuFence());
EXPECT_TRUE(ModesetWithPlane(plane1));
ui::DrmDevice::Property fence_fd_prop = {};
ui::ScopedDrmObjectPropertyPtr plane_props = ui::ScopedDrmObjectPropertyPtr plane_props =
drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE);
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", {
&fence_fd_prop); ui::DrmDevice::Property prop = {};
EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_ID", &prop);
EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value)); EXPECT_EQ(kPlaneCrtcId, prop.id);
EXPECT_EQ(kCrtcIdBase, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_X", &prop);
EXPECT_EQ(kCrtcX, prop.id);
EXPECT_EQ(plane1.display_bounds.x(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_Y", &prop);
EXPECT_EQ(kCrtcY, prop.id);
EXPECT_EQ(plane1.display_bounds.y(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_W", &prop);
EXPECT_EQ(kCrtcW, prop.id);
EXPECT_EQ(kDefaultModeSize.width(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_H", &prop);
EXPECT_EQ(kCrtcH, prop.id);
EXPECT_EQ(kDefaultModeSize.height(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "FB_ID", &prop);
EXPECT_EQ(kPlaneFbId, prop.id);
EXPECT_EQ(plane1.buffer->opaque_framebuffer_id(),
static_cast<uint32_t>(prop.value));
}
gfx::RectF crop_rectf = plane1.crop_rect;
crop_rectf.Scale(plane1.buffer->size().width(),
plane1.buffer->size().height());
gfx::Rect crop_rect = gfx::ToNearestRect(crop_rectf);
gfx::Rect fixed_point_rect =
gfx::Rect(crop_rect.x() << 16, crop_rect.y() << 16,
crop_rect.width() << 16, crop_rect.height() << 16);
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_X", &prop);
EXPECT_EQ(kSrcX, prop.id);
EXPECT_EQ(fixed_point_rect.x(), static_cast<float>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_Y", &prop);
EXPECT_EQ(kSrcY, prop.id);
EXPECT_EQ(fixed_point_rect.y(), static_cast<float>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_W", &prop);
EXPECT_EQ(kSrcW, prop.id);
EXPECT_EQ(fixed_point_rect.width(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_H", &prop);
EXPECT_EQ(kSrcH, prop.id);
EXPECT_EQ(fixed_point_rect.height(), static_cast<int>(prop.value));
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
&prop);
EXPECT_EQ(kFenceFdPropId, prop.id);
EXPECT_GT(static_cast<int>(prop.value), base::kInvalidPlatformFile);
}
} }
TEST_F(HardwareDisplayControllerTest, FenceFdValueChange) { TEST_F(HardwareDisplayControllerTest, FenceFdValueChange) {
...@@ -391,41 +481,103 @@ TEST_F(HardwareDisplayControllerTest, CheckDisableResetsProps) { ...@@ -391,41 +481,103 @@ TEST_F(HardwareDisplayControllerTest, CheckDisableResetsProps) {
EXPECT_TRUE(ModesetWithPlane(plane1)); EXPECT_TRUE(ModesetWithPlane(plane1));
ui::DrmOverlayPlane plane2(CreateBuffer(), nullptr);
std::vector<ui::DrmOverlayPlane> planes = {};
planes.push_back(plane2.Clone());
SchedulePageFlip(std::move(planes));
// Test props values after disabling. // Test props values after disabling.
DisableController(); DisableController();
ui::DrmDevice::Property connector_prop_crtc_id;
ui::ScopedDrmObjectPropertyPtr connector_props =
drm_->GetObjectProperties(kConnectorIdBase, 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);
ui::DrmDevice::Property crtc_prop_for_name;
ui::ScopedDrmObjectPropertyPtr crtc_props = ui::ScopedDrmObjectPropertyPtr crtc_props =
drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC); drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC);
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", {
&crtc_prop_for_name); ui::DrmDevice::Property prop = {};
EXPECT_EQ(0U, crtc_prop_for_name.value); ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "ACTIVE", &prop);
EXPECT_EQ(kActivePropId, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", &prop);
EXPECT_EQ(kModePropId, prop.id);
EXPECT_EQ(0U, prop.value);
}
crtc_props = drm_->GetObjectProperties(kPrimaryCrtc, DRM_MODE_OBJECT_CRTC); ui::ScopedDrmObjectPropertyPtr connector_props =
GetDrmPropertyForName(drm_.get(), crtc_props.get(), "MODE_ID", drm_->GetObjectProperties(kConnectorIdBase, DRM_MODE_OBJECT_CONNECTOR);
&crtc_prop_for_name); {
EXPECT_EQ(0U, crtc_prop_for_name.value); ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), connector_props.get(), "CRTC_ID",
&prop);
EXPECT_EQ(kCrtcIdPropId, prop.id);
EXPECT_EQ(0U, prop.value);
}
ui::DrmDevice::Property fence_fd_prop = {};
ui::ScopedDrmObjectPropertyPtr plane_props = ui::ScopedDrmObjectPropertyPtr plane_props =
drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE); drm_->GetObjectProperties(kPlaneOffset, DRM_MODE_OBJECT_PLANE);
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD", {
&fence_fd_prop); ui::DrmDevice::Property prop = {};
EXPECT_EQ(kFenceFdPropId, fence_fd_prop.id); ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_ID", &prop);
EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(fence_fd_prop.value)); EXPECT_EQ(kPlaneCrtcId, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_X", &prop);
EXPECT_EQ(kCrtcX, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_Y", &prop);
EXPECT_EQ(kCrtcY, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_W", &prop);
EXPECT_EQ(kCrtcW, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "CRTC_H", &prop);
EXPECT_EQ(kCrtcH, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "FB_ID", &prop);
EXPECT_EQ(kPlaneFbId, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_X", &prop);
EXPECT_EQ(kSrcX, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_Y", &prop);
EXPECT_EQ(kSrcY, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_W", &prop);
EXPECT_EQ(kSrcW, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "SRC_H", &prop);
EXPECT_EQ(kSrcH, prop.id);
EXPECT_EQ(0U, prop.value);
}
{
ui::DrmDevice::Property prop = {};
ui::GetDrmPropertyForName(drm_.get(), plane_props.get(), "IN_FENCE_FD",
&prop);
EXPECT_EQ(kFenceFdPropId, prop.id);
EXPECT_EQ(base::kInvalidPlatformFile, static_cast<int>(prop.value));
}
} }
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) { TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
......
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