Commit 9d137bfc authored by dnicoara's avatar dnicoara Committed by Commit bot

[Ozone-Drm] Keep track of display origin

Otherwise we lose track of display layout. In particular this is a
problem when dealing with software mirror mode since the state goes out
of sync and the second monitor will have the same origin as the primary
even though it's supposed to be right-of primary.

Follow-up to https://codereview.chromium.org/1129923004/ to fix software
mirror mode.

BUG=484294
TEST=Test software mirror mode and make sure it works

Review URL: https://codereview.chromium.org/1140773003

Cr-Commit-Position: refs/heads/master@{#329717}
parent 41c7c997
......@@ -208,9 +208,11 @@ DisplayMode_Params CreateDisplayModeParams(const drmModeModeInfo& mode) {
DisplaySnapshot_Params CreateDisplaySnapshotParams(
HardwareDisplayControllerInfo* info,
int fd,
size_t display_index) {
size_t display_index,
const gfx::Point& origin) {
DisplaySnapshot_Params params;
params.display_id = display_index;
params.origin = origin;
params.physical_size =
gfx::Size(info->connector()->mmWidth, info->connector()->mmHeight);
params.type = GetDisplayType(info->connector());
......
......@@ -13,6 +13,10 @@
typedef struct _drmModeModeInfo drmModeModeInfo;
namespace gfx {
class Point;
}
namespace ui {
// Representation of the information required to initialize and configure a
......@@ -49,7 +53,8 @@ DisplayMode_Params CreateDisplayModeParams(const drmModeModeInfo& mode);
DisplaySnapshot_Params CreateDisplaySnapshotParams(
HardwareDisplayControllerInfo* info,
int fd,
size_t display_index);
size_t display_index,
const gfx::Point& origin);
} // namespace ui
......
......@@ -67,25 +67,35 @@ gfx::Size GetDrmModeSize(const drmModeModeInfo& mode) {
return gfx::Size(mode.hdisplay, mode.vdisplay);
}
std::vector<drmModeModeInfo> GetDrmModeVector(drmModeConnector* connector) {
std::vector<drmModeModeInfo> modes;
for (int i = 0; i < connector->count_modes; ++i)
modes.push_back(connector->modes[i]);
return modes;
}
} // namespace
DrmDisplay::DrmDisplay(ScreenManager* screen_manager,
int64_t display_id,
const scoped_refptr<DrmDevice>& drm,
uint32_t crtc,
uint32_t connector,
const std::vector<drmModeModeInfo>& modes)
: screen_manager_(screen_manager),
display_id_(display_id),
drm_(drm),
crtc_(crtc),
connector_(connector),
modes_(modes) {
const scoped_refptr<DrmDevice>& drm)
: screen_manager_(screen_manager), display_id_(-1), drm_(drm) {
}
DrmDisplay::~DrmDisplay() {
}
DisplaySnapshot_Params DrmDisplay::Update(HardwareDisplayControllerInfo* info,
size_t display_index) {
DisplaySnapshot_Params params =
CreateDisplaySnapshotParams(info, drm_->get_fd(), display_index, origin_);
crtc_ = info->crtc()->crtc_id;
connector_ = info->connector()->connector_id;
display_id_ = params.display_id;
modes_ = GetDrmModeVector(info->connector());
return params;
}
bool DrmDisplay::Configure(const drmModeModeInfo* mode,
const gfx::Point& origin) {
VLOG(1) << "DRM configuring: device=" << drm_->device_path().value()
......@@ -108,6 +118,7 @@ bool DrmDisplay::Configure(const drmModeModeInfo* mode,
}
}
origin_ = origin;
return true;
}
......
......@@ -9,16 +9,15 @@
#include "base/memory/ref_counted.h"
#include "ui/display/types/display_constants.h"
#include "ui/gfx/geometry/point.h"
#include "ui/ozone/common/gpu/ozone_gpu_message_params.h"
typedef struct _drmModeModeInfo drmModeModeInfo;
namespace gfx {
class Point;
}
namespace ui {
class DrmDevice;
class HardwareDisplayControllerInfo;
class ScreenManager;
struct GammaRampRGBEntry;
......@@ -26,11 +25,7 @@ struct GammaRampRGBEntry;
class DrmDisplay {
public:
DrmDisplay(ScreenManager* screen_manager,
int64_t display_id,
const scoped_refptr<DrmDevice>& drm,
uint32_t crtc,
uint32_t connector,
const std::vector<drmModeModeInfo>& modes);
const scoped_refptr<DrmDevice>& drm);
~DrmDisplay();
int64_t display_id() const { return display_id_; }
......@@ -39,6 +34,9 @@ class DrmDisplay {
uint32_t connector() const { return connector_; }
const std::vector<drmModeModeInfo>& modes() const { return modes_; }
DisplaySnapshot_Params Update(HardwareDisplayControllerInfo* info,
size_t display_index);
bool Configure(const drmModeModeInfo* mode, const gfx::Point& origin);
bool GetHDCPState(HDCPState* state);
bool SetHDCPState(HDCPState state);
......@@ -52,6 +50,7 @@ class DrmDisplay {
uint32_t crtc_;
uint32_t connector_;
std::vector<drmModeModeInfo> modes_;
gfx::Point origin_;
DISALLOW_COPY_AND_ASSIGN(DrmDisplay);
};
......
......@@ -55,14 +55,6 @@ bool FindMatchingMode(const std::vector<drmModeModeInfo> modes,
return false;
}
std::vector<drmModeModeInfo> GetDrmModeVector(drmModeConnector* connector) {
std::vector<drmModeModeInfo> modes;
for (int i = 0; i < connector->count_modes; ++i)
modes.push_back(connector->modes[i]);
return modes;
}
} // namespace
DrmGpuDisplayManager::DrmGpuDisplayManager(ScreenManager* screen_manager,
......@@ -84,15 +76,18 @@ std::vector<DisplaySnapshot_Params> DrmGpuDisplayManager::GetDisplays() {
ScopedVector<HardwareDisplayControllerInfo> display_infos =
GetAvailableDisplayControllerInfos(drm->get_fd());
for (auto* display_info : display_infos) {
DisplaySnapshot_Params params =
CreateDisplaySnapshotParams(display_info, drm->get_fd(), index++);
params_list.push_back(params);
displays_.push_back(
new DrmDisplay(screen_manager_, params.display_id, drm,
display_info->crtc()->crtc_id,
display_info->connector()->connector_id,
GetDrmModeVector(display_info->connector())));
auto it = std::find_if(
old_displays.begin(), old_displays.end(),
DisplayComparator(drm, display_info->crtc()->crtc_id,
display_info->connector()->connector_id));
if (it != old_displays.end()) {
displays_.push_back(*it);
old_displays.weak_erase(it);
} else {
displays_.push_back(new DrmDisplay(screen_manager_, drm));
}
params_list.push_back(displays_.back()->Update(display_info, index++));
}
}
......
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