Commit 6a44cbfb authored by Mark Yacoub's avatar Mark Yacoub Committed by Commit Bot

Disable Render Buffer Compression on external displays.

When Getting format modifiers, exclude I915_FORMAT_MOD_Y*_TILED_CCS
(Intel color control surface (CCS) for render compression) if it's not
an internal display.
This solves the bandwidth issue when driving more than 1 4K monitor with
rbc enabled.

BUG=996011,996036,994341,979736
TEST=External display doesn't pick I915...CSS modifier

Change-Id: I9d7aa06f5f9331d232a3cbd7e74bd41771bc4030
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1912460
Commit-Queue: Mark Yacoub <markyacoub@google.com>
Reviewed-by: default avatarMichael Spang <spang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715332}
parent 798c8880
......@@ -108,28 +108,6 @@ float GetRefreshRate(const drmModeModeInfo& mode) {
return (clock * 1000.0f) / (htotal * vtotal);
}
display::DisplayConnectionType GetDisplayType(drmModeConnector* connector) {
switch (connector->connector_type) {
case DRM_MODE_CONNECTOR_VGA:
return display::DISPLAY_CONNECTION_TYPE_VGA;
case DRM_MODE_CONNECTOR_DVII:
case DRM_MODE_CONNECTOR_DVID:
case DRM_MODE_CONNECTOR_DVIA:
return display::DISPLAY_CONNECTION_TYPE_DVI;
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_eDP:
case DRM_MODE_CONNECTOR_DSI:
return display::DISPLAY_CONNECTION_TYPE_INTERNAL;
case DRM_MODE_CONNECTOR_DisplayPort:
return display::DISPLAY_CONNECTION_TYPE_DISPLAYPORT;
case DRM_MODE_CONNECTOR_HDMIA:
case DRM_MODE_CONNECTOR_HDMIB:
return display::DISPLAY_CONNECTION_TYPE_HDMI;
default:
return display::DISPLAY_CONNECTION_TYPE_UNKNOWN;
}
}
int GetDrmProperty(int fd,
drmModeConnector* connector,
const std::string& name,
......@@ -425,6 +403,29 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes(
return modes;
}
display::DisplayConnectionType GetDisplayType(
const drmModeConnector* connector) {
switch (connector->connector_type) {
case DRM_MODE_CONNECTOR_VGA:
return display::DISPLAY_CONNECTION_TYPE_VGA;
case DRM_MODE_CONNECTOR_DVII:
case DRM_MODE_CONNECTOR_DVID:
case DRM_MODE_CONNECTOR_DVIA:
return display::DISPLAY_CONNECTION_TYPE_DVI;
case DRM_MODE_CONNECTOR_LVDS:
case DRM_MODE_CONNECTOR_eDP:
case DRM_MODE_CONNECTOR_DSI:
return display::DISPLAY_CONNECTION_TYPE_INTERNAL;
case DRM_MODE_CONNECTOR_DisplayPort:
return display::DISPLAY_CONNECTION_TYPE_DISPLAYPORT;
case DRM_MODE_CONNECTOR_HDMIA:
case DRM_MODE_CONNECTOR_HDMIB:
return display::DISPLAY_CONNECTION_TYPE_HDMI;
default:
return display::DISPLAY_CONNECTION_TYPE_UNKNOWN;
}
}
std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
HardwareDisplayControllerInfo* info,
int fd,
......
......@@ -71,6 +71,9 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes(
const display::DisplayMode** out_current_mode,
const display::DisplayMode** out_native_mode);
display::DisplayConnectionType GetDisplayType(
const drmModeConnector* connector);
// |info| provides the DRM information related to the display, |fd| is the
// connection to the DRM device.
std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
......
......@@ -8,7 +8,9 @@
#include "base/logging.h"
#include "base/time/time.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/presentation_feedback.h"
#include "ui/ozone/platform/drm/common/drm_util.h"
#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"
......@@ -22,7 +24,9 @@ CrtcController::CrtcController(const scoped_refptr<DrmDevice>& drm,
uint32_t connector)
: drm_(drm),
crtc_(crtc),
connector_(connector) {}
connector_(connector),
internal_diplay_only_modifiers_(
{I915_FORMAT_MOD_Y_TILED_CCS, I915_FORMAT_MOD_Yf_TILED_CCS}) {}
CrtcController::~CrtcController() {
if (!is_disabled_) {
......@@ -96,7 +100,21 @@ bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
}
std::vector<uint64_t> CrtcController::GetFormatModifiers(uint32_t format) {
return drm_->plane_manager()->GetFormatModifiers(crtc_, format);
std::vector<uint64_t> modifiers =
drm_->plane_manager()->GetFormatModifiers(crtc_, format);
display::DisplayConnectionType display_type =
ui::GetDisplayType(drm_->GetConnector(connector_).get());
// If this is an external display, remove the modifiers applicable to internal
// displays only.
if (display_type != display::DISPLAY_CONNECTION_TYPE_INTERNAL) {
for (auto modifier : internal_diplay_only_modifiers_) {
modifiers.erase(std::remove(modifiers.begin(), modifiers.end(), modifier),
modifiers.end());
}
}
return modifiers;
}
void CrtcController::SetCursor(uint32_t handle, const gfx::Size& size) {
......
......@@ -75,6 +75,8 @@ class CrtcController {
// TODO(dnicoara) Add support for hardware mirroring (multiple connectors).
const uint32_t connector_;
const std::vector<uint64_t> internal_diplay_only_modifiers_;
drmModeModeInfo mode_ = {};
scoped_refptr<DrmFramebuffer> modeset_framebuffer_;
......
......@@ -47,7 +47,7 @@ const gfx::SizeF kDefaultModeSizeF(1.0, 1.0);
class HardwareDisplayControllerTest : public testing::Test {
public:
HardwareDisplayControllerTest() : page_flips_(0) {}
~HardwareDisplayControllerTest() override {}
~HardwareDisplayControllerTest() override = default;
void SetUp() override;
void TearDown() override;
......@@ -147,8 +147,17 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
{/* .id = */ pair.first, /*.value = */ value});
};
drm_format_modifier y_css = {.formats = 1UL,
.modifier = I915_FORMAT_MOD_Y_TILED_CCS};
drm_format_modifier yf_css = {.formats = 1UL,
.modifier = I915_FORMAT_MOD_Yf_TILED_CCS};
drm_format_modifier x = {.formats = 1UL,
.modifier = I915_FORMAT_MOD_X_TILED};
drm_format_modifier linear = {.formats = 1UL,
.modifier = DRM_FORMAT_MOD_LINEAR};
drm_->SetPropertyBlob(ui::MockDrmDevice::AllocateInFormatsBlob(
kInFormatsBlobPropId, {DRM_FORMAT_XRGB8888}, {}));
kInFormatsBlobPropId, {DRM_FORMAT_XRGB8888},
{y_css, yf_css, x, linear}));
plane_properties.emplace_back(std::move(plane));
}
......@@ -198,6 +207,52 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
EXPECT_FALSE(plane.buffer->HasOneRef());
}
TEST_F(HardwareDisplayControllerTest, ModifiersWithConnectorType) {
ui::DrmOverlayPlane plane(CreateBuffer(), nullptr);
// With internal displays, all modifiers including compressed (css) should be
// there.
drm_->set_connector_type(DRM_MODE_CONNECTOR_eDP);
std::vector<uint64_t> internal_modifiers =
controller_->GetFormatModifiers(DRM_FORMAT_XRGB8888);
ASSERT_FALSE(internal_modifiers.empty());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
I915_FORMAT_MOD_Y_TILED_CCS),
internal_modifiers.end());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
I915_FORMAT_MOD_Yf_TILED_CCS),
internal_modifiers.end());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
I915_FORMAT_MOD_X_TILED),
internal_modifiers.end());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
DRM_FORMAT_MOD_LINEAR),
internal_modifiers.end());
// With external displays, *_CSS modifiers (2 of them) should not exist.
drm_->set_connector_type(DRM_MODE_CONNECTOR_DisplayPort);
std::vector<uint64_t> external_modifiers =
controller_->GetFormatModifiers(DRM_FORMAT_XRGB8888);
ASSERT_FALSE(external_modifiers.empty());
EXPECT_EQ(external_modifiers.size(), internal_modifiers.size() - 2);
EXPECT_EQ(std::find(external_modifiers.begin(), external_modifiers.end(),
I915_FORMAT_MOD_Y_TILED_CCS),
external_modifiers.end());
EXPECT_EQ(std::find(external_modifiers.begin(), external_modifiers.end(),
I915_FORMAT_MOD_Yf_TILED_CCS),
external_modifiers.end());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
I915_FORMAT_MOD_X_TILED),
internal_modifiers.end());
EXPECT_NE(std::find(internal_modifiers.begin(), internal_modifiers.end(),
DRM_FORMAT_MOD_LINEAR),
internal_modifiers.end());
}
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
......
......@@ -217,7 +217,11 @@ bool MockDrmDevice::DisableCrtc(uint32_t crtc_id) {
}
ScopedDrmConnectorPtr MockDrmDevice::GetConnector(uint32_t connector_id) {
return ScopedDrmConnectorPtr(DrmAllocator<drmModeConnector>());
ScopedDrmConnectorPtr connector =
ScopedDrmConnectorPtr(DrmAllocator<drmModeConnector>());
connector->connector_id = connector_id;
connector->connector_type = connector_type_;
return connector;
}
bool MockDrmDevice::AddFramebuffer2(uint32_t width,
......
......@@ -89,6 +89,8 @@ class MockDrmDevice : public DrmDevice {
return it != crtc_cursor_map_.end() ? it->second : 0;
}
void set_connector_type(uint32_t type) { connector_type_ = type; }
void InitializeState(const std::vector<CrtcProperties>& crtc_properties,
const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names,
......@@ -223,6 +225,8 @@ class MockDrmDevice : public DrmDevice {
std::set<uint32_t> allocated_property_blobs_;
uint32_t connector_type_;
DISALLOW_COPY_AND_ASSIGN(MockDrmDevice);
};
......
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