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) { ...@@ -108,28 +108,6 @@ float GetRefreshRate(const drmModeModeInfo& mode) {
return (clock * 1000.0f) / (htotal * vtotal); 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, int GetDrmProperty(int fd,
drmModeConnector* connector, drmModeConnector* connector,
const std::string& name, const std::string& name,
...@@ -425,6 +403,29 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes( ...@@ -425,6 +403,29 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes(
return modes; 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( std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
HardwareDisplayControllerInfo* info, HardwareDisplayControllerInfo* info,
int fd, int fd,
......
...@@ -71,6 +71,9 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes( ...@@ -71,6 +71,9 @@ display::DisplaySnapshot::DisplayModeList ExtractDisplayModes(
const display::DisplayMode** out_current_mode, const display::DisplayMode** out_current_mode,
const display::DisplayMode** out_native_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 // |info| provides the DRM information related to the display, |fd| is the
// connection to the DRM device. // connection to the DRM device.
std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot( std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
......
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/presentation_feedback.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_device.h"
#include "ui/ozone/platform/drm/gpu/drm_dumb_buffer.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_framebuffer.h"
...@@ -22,7 +24,9 @@ CrtcController::CrtcController(const scoped_refptr<DrmDevice>& drm, ...@@ -22,7 +24,9 @@ CrtcController::CrtcController(const scoped_refptr<DrmDevice>& drm,
uint32_t connector) uint32_t connector)
: drm_(drm), : drm_(drm),
crtc_(crtc), crtc_(crtc),
connector_(connector) {} connector_(connector),
internal_diplay_only_modifiers_(
{I915_FORMAT_MOD_Y_TILED_CCS, I915_FORMAT_MOD_Yf_TILED_CCS}) {}
CrtcController::~CrtcController() { CrtcController::~CrtcController() {
if (!is_disabled_) { if (!is_disabled_) {
...@@ -96,7 +100,21 @@ bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list, ...@@ -96,7 +100,21 @@ bool CrtcController::AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list,
} }
std::vector<uint64_t> CrtcController::GetFormatModifiers(uint32_t format) { 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) { void CrtcController::SetCursor(uint32_t handle, const gfx::Size& size) {
......
...@@ -75,6 +75,8 @@ class CrtcController { ...@@ -75,6 +75,8 @@ class CrtcController {
// TODO(dnicoara) Add support for hardware mirroring (multiple connectors). // TODO(dnicoara) Add support for hardware mirroring (multiple connectors).
const uint32_t connector_; const uint32_t connector_;
const std::vector<uint64_t> internal_diplay_only_modifiers_;
drmModeModeInfo mode_ = {}; drmModeModeInfo mode_ = {};
scoped_refptr<DrmFramebuffer> modeset_framebuffer_; scoped_refptr<DrmFramebuffer> modeset_framebuffer_;
......
...@@ -47,7 +47,7 @@ const gfx::SizeF kDefaultModeSizeF(1.0, 1.0); ...@@ -47,7 +47,7 @@ const gfx::SizeF kDefaultModeSizeF(1.0, 1.0);
class HardwareDisplayControllerTest : public testing::Test { class HardwareDisplayControllerTest : public testing::Test {
public: public:
HardwareDisplayControllerTest() : page_flips_(0) {} HardwareDisplayControllerTest() : page_flips_(0) {}
~HardwareDisplayControllerTest() override {} ~HardwareDisplayControllerTest() override = default;
void SetUp() override; void SetUp() override;
void TearDown() override; void TearDown() override;
...@@ -147,8 +147,17 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) { ...@@ -147,8 +147,17 @@ void HardwareDisplayControllerTest::InitializeDrmDevice(bool use_atomic) {
{/* .id = */ pair.first, /*.value = */ value}); {/* .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( 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)); plane_properties.emplace_back(std::move(plane));
} }
...@@ -198,6 +207,52 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) { ...@@ -198,6 +207,52 @@ TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
EXPECT_FALSE(plane.buffer->HasOneRef()); 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) { TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr); ui::DrmOverlayPlane plane1(CreateBuffer(), nullptr);
......
...@@ -217,7 +217,11 @@ bool MockDrmDevice::DisableCrtc(uint32_t crtc_id) { ...@@ -217,7 +217,11 @@ bool MockDrmDevice::DisableCrtc(uint32_t crtc_id) {
} }
ScopedDrmConnectorPtr MockDrmDevice::GetConnector(uint32_t connector_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, bool MockDrmDevice::AddFramebuffer2(uint32_t width,
......
...@@ -89,6 +89,8 @@ class MockDrmDevice : public DrmDevice { ...@@ -89,6 +89,8 @@ class MockDrmDevice : public DrmDevice {
return it != crtc_cursor_map_.end() ? it->second : 0; 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, void InitializeState(const std::vector<CrtcProperties>& crtc_properties,
const std::vector<PlaneProperties>& plane_properties, const std::vector<PlaneProperties>& plane_properties,
const std::map<uint32_t, std::string>& property_names, const std::map<uint32_t, std::string>& property_names,
...@@ -223,6 +225,8 @@ class MockDrmDevice : public DrmDevice { ...@@ -223,6 +225,8 @@ class MockDrmDevice : public DrmDevice {
std::set<uint32_t> allocated_property_blobs_; std::set<uint32_t> allocated_property_blobs_;
uint32_t connector_type_;
DISALLOW_COPY_AND_ASSIGN(MockDrmDevice); 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