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