aboutsummaryrefslogtreecommitdiff
path: root/drm
diff options
context:
space:
mode:
authorJohn Stultz <john.stultz@linaro.org>2021-12-14 20:42:41 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-12-14 20:42:41 +0000
commitd8fc8031b6d62ebc89050d0f7afc536b83d25162 (patch)
treebcd857ed709746221362cd12ac3a0c451a54a762 /drm
parentd1c37433d9a6f9467f50808620f7cad89998bbb6 (diff)
parent51fd1b6fdeaa34f67484932847855775861701fb (diff)
downloaddrm_hwcomposer-d8fc8031b6d62ebc89050d0f7afc536b83d25162.tar.gz
drm_hwcomposer: Merge remote-tracking branch 'aosp/upstream-main' into HEAD am: 774e5e3432 am: 24ccb88ece am: 42f5da5192 am: 51fd1b6fde
Original change: https://android-review.googlesource.com/c/platform/external/drm_hwcomposer/+/1921343 Change-Id: I1e0f8ce3f2c32662bf03e30249915210075fd1aa
Diffstat (limited to 'drm')
-rw-r--r--drm/DrmConnector.cpp26
-rw-r--r--drm/DrmConnector.h6
-rw-r--r--drm/DrmDevice.cpp16
-rw-r--r--drm/DrmDevice.h8
-rw-r--r--drm/DrmFbImporter.cpp4
-rw-r--r--drm/DrmMode.cpp73
-rw-r--r--drm/DrmMode.h61
-rw-r--r--drm/ResourceManager.cpp6
-rw-r--r--drm/ResourceManager.h11
-rw-r--r--drm/UEventListener.cpp (renamed from drm/DrmEventListener.cpp)68
-rw-r--r--drm/UEventListener.h (renamed from drm/DrmEventListener.h)39
11 files changed, 113 insertions, 205 deletions
diff --git a/drm/DrmConnector.cpp b/drm/DrmConnector.cpp
index b3179c7..5b3c697 100644
--- a/drm/DrmConnector.cpp
+++ b/drm/DrmConnector.cpp
@@ -159,43 +159,27 @@ std::string DrmConnector::name() const {
}
int DrmConnector::UpdateModes() {
- int fd = drm_->fd();
-
- drmModeConnectorPtr c = drmModeGetConnector(fd, id_);
+ drmModeConnectorPtr c = drmModeGetConnector(drm_->fd(), id_);
if (!c) {
ALOGE("Failed to get connector %d", id_);
return -ENODEV;
}
- state_ = c->connection;
-
- bool preferred_mode_found = false;
- std::vector<DrmMode> new_modes;
+ modes_.clear();
for (int i = 0; i < c->count_modes; ++i) {
bool exists = false;
for (const DrmMode &mode : modes_) {
if (mode == c->modes[i]) {
- new_modes.push_back(mode);
exists = true;
break;
}
}
+
if (!exists) {
- DrmMode m(&c->modes[i]);
- m.set_id(drm_->next_mode_id());
- new_modes.push_back(m);
+ modes_.emplace_back(DrmMode(&c->modes[i]));
}
- // Use only the first DRM_MODE_TYPE_PREFERRED mode found
- if (!preferred_mode_found &&
- (new_modes.back().type() & DRM_MODE_TYPE_PREFERRED)) {
- preferred_mode_id_ = new_modes.back().id();
- preferred_mode_found = true;
- }
- }
- modes_.swap(new_modes);
- if (!preferred_mode_found && !modes_.empty()) {
- preferred_mode_id_ = modes_[0].id();
}
+
return 0;
}
diff --git a/drm/DrmConnector.h b/drm/DrmConnector.h
index e2789ea..f2305aa 100644
--- a/drm/DrmConnector.h
+++ b/drm/DrmConnector.h
@@ -82,10 +82,6 @@ class DrmConnector {
uint32_t mm_width() const;
uint32_t mm_height() const;
- uint32_t get_preferred_mode_id() const {
- return preferred_mode_id_;
- }
-
private:
DrmDevice *drm_;
@@ -111,8 +107,6 @@ class DrmConnector {
DrmProperty writeback_out_fence_;
std::vector<DrmEncoder *> possible_encoders_;
-
- uint32_t preferred_mode_id_{};
};
} // namespace android
diff --git a/drm/DrmDevice.cpp b/drm/DrmDevice.cpp
index 1753ddc..0f5f581 100644
--- a/drm/DrmDevice.cpp
+++ b/drm/DrmDevice.cpp
@@ -111,15 +111,11 @@ static std::vector<DrmConnector *> make_primary_display_candidates(
return primary_candidates;
}
-DrmDevice::DrmDevice() : event_listener_(this) {
+DrmDevice::DrmDevice() {
self.reset(this);
mDrmFbImporter = std::make_unique<DrmFbImporter>(self);
}
-DrmDevice::~DrmDevice() {
- event_listener_.Exit();
-}
-
std::tuple<int, int> DrmDevice::Init(const char *path, int num_displays) {
/* TODO: Use drmOpenControl here instead */
fd_ = UniqueFd(open(path, O_RDWR | O_CLOEXEC));
@@ -326,12 +322,6 @@ std::tuple<int, int> DrmDevice::Init(const char *path, int num_displays) {
if (ret)
return std::make_tuple(ret, 0);
- ret = event_listener_.Init();
- if (ret) {
- ALOGE("Can't initialize event listener %d", ret);
- return std::make_tuple(ret, 0);
- }
-
for (auto &conn : connectors_) {
ret = CreateDisplayPipe(conn.get());
if (ret) {
@@ -526,10 +516,6 @@ auto DrmDevice::RegisterUserPropertyBlob(void *data, size_t length) const
});
}
-DrmEventListener *DrmDevice::event_listener() {
- return &event_listener_;
-}
-
int DrmDevice::GetProperty(uint32_t obj_id, uint32_t obj_type,
const char *prop_name, DrmProperty *property) const {
drmModeObjectPropertiesPtr props = nullptr;
diff --git a/drm/DrmDevice.h b/drm/DrmDevice.h
index 81c60cd..c08c766 100644
--- a/drm/DrmDevice.h
+++ b/drm/DrmDevice.h
@@ -25,7 +25,6 @@
#include "DrmConnector.h"
#include "DrmCrtc.h"
#include "DrmEncoder.h"
-#include "DrmEventListener.h"
#include "DrmFbImporter.h"
#include "DrmPlane.h"
#include "utils/UniqueFd.h"
@@ -38,7 +37,7 @@ class DrmPlane;
class DrmDevice {
public:
DrmDevice();
- ~DrmDevice();
+ ~DrmDevice() = default;
std::tuple<int, int> Init(const char *path, int num_displays);
@@ -67,7 +66,6 @@ class DrmDevice {
DrmConnector *AvailableWritebackConnector(int display) const;
DrmCrtc *GetCrtcForDisplay(int display) const;
DrmPlane *GetPlane(uint32_t id) const;
- DrmEventListener *event_listener();
int GetCrtcProperty(const DrmCrtc &crtc, const char *prop_name,
DrmProperty *property) const;
@@ -83,9 +81,6 @@ class DrmDevice {
-> DrmModeUserPropertyBlobUnique;
bool HandlesDisplay(int display) const;
- void RegisterHotplugHandler(DrmEventHandler *handler) {
- event_listener_.RegisterHotplugHandler(handler);
- }
bool HasAddFb2ModifiersSupport() const {
return HasAddFb2ModifiersSupport_;
@@ -114,7 +109,6 @@ class DrmDevice {
std::vector<std::unique_ptr<DrmEncoder>> encoders_;
std::vector<std::unique_ptr<DrmCrtc>> crtcs_;
std::vector<std::unique_ptr<DrmPlane>> planes_;
- DrmEventListener event_listener_;
std::pair<uint32_t, uint32_t> min_resolution_;
std::pair<uint32_t, uint32_t> max_resolution_;
diff --git a/drm/DrmFbImporter.cpp b/drm/DrmFbImporter.cpp
index 8440093..25f32b7 100644
--- a/drm/DrmFbImporter.cpp
+++ b/drm/DrmFbImporter.cpp
@@ -41,7 +41,7 @@ auto DrmFbIdHandle::CreateInstance(hwc_drm_bo_t *bo, GemHandle first_gem_handle,
int32_t err = 0;
/* Framebuffer object creation require gem handle for every used plane */
- for (int i = 1; i < local->gem_handles_.size(); i++) {
+ for (size_t i = 1; i < local->gem_handles_.size(); i++) {
if (bo->prime_fds[i] > 0) {
if (bo->prime_fds[i] != bo->prime_fds[0]) {
err = drmPrimeFDToHandle(drm->fd(), bo->prime_fds[i],
@@ -101,7 +101,7 @@ DrmFbIdHandle::~DrmFbIdHandle() {
* request via system properties)
*/
struct drm_gem_close gem_close {};
- for (int i = 0; i < gem_handles_.size(); i++) {
+ for (size_t i = 0; i < gem_handles_.size(); i++) {
/* Don't close invalid handle. Close handle only once in cases
* where several YUV planes located in the single buffer. */
if (gem_handles_[i] == 0 ||
diff --git a/drm/DrmMode.cpp b/drm/DrmMode.cpp
index c714458..1c8bd0f 100644
--- a/drm/DrmMode.cpp
+++ b/drm/DrmMode.cpp
@@ -49,73 +49,47 @@ bool DrmMode::operator==(const drmModeModeInfo &m) const {
v_scan_ == m.vscan && flags_ == m.flags && type_ == m.type;
}
-void DrmMode::ToDrmModeModeInfo(drm_mode_modeinfo *m) const {
- m->clock = clock_;
- m->hdisplay = h_display_;
- m->hsync_start = h_sync_start_;
- m->hsync_end = h_sync_end_;
- m->htotal = h_total_;
- m->hskew = h_skew_;
- m->vdisplay = v_display_;
- m->vsync_start = v_sync_start_;
- m->vsync_end = v_sync_end_;
- m->vtotal = v_total_;
- m->vscan = v_scan_;
- m->vrefresh = v_refresh_;
- m->flags = flags_;
- m->type = type_;
- strncpy(m->name, name_.c_str(), DRM_DISPLAY_MODE_LEN);
-}
-
-uint32_t DrmMode::id() const {
- return id_;
-}
-
-void DrmMode::set_id(uint32_t id) {
- id_ = id;
-}
-
uint32_t DrmMode::clock() const {
return clock_;
}
-uint32_t DrmMode::h_display() const {
+uint16_t DrmMode::h_display() const {
return h_display_;
}
-uint32_t DrmMode::h_sync_start() const {
+uint16_t DrmMode::h_sync_start() const {
return h_sync_start_;
}
-uint32_t DrmMode::h_sync_end() const {
+uint16_t DrmMode::h_sync_end() const {
return h_sync_end_;
}
-uint32_t DrmMode::h_total() const {
+uint16_t DrmMode::h_total() const {
return h_total_;
}
-uint32_t DrmMode::h_skew() const {
+uint16_t DrmMode::h_skew() const {
return h_skew_;
}
-uint32_t DrmMode::v_display() const {
+uint16_t DrmMode::v_display() const {
return v_display_;
}
-uint32_t DrmMode::v_sync_start() const {
+uint16_t DrmMode::v_sync_start() const {
return v_sync_start_;
}
-uint32_t DrmMode::v_sync_end() const {
+uint16_t DrmMode::v_sync_end() const {
return v_sync_end_;
}
-uint32_t DrmMode::v_total() const {
+uint16_t DrmMode::v_total() const {
return v_total_;
}
-uint32_t DrmMode::v_scan() const {
+uint16_t DrmMode::v_scan() const {
return v_scan_;
}
@@ -133,6 +107,31 @@ uint32_t DrmMode::type() const {
}
std::string DrmMode::name() const {
- return name_;
+ return name_ + "@" + std::to_string(v_refresh());
+}
+
+auto DrmMode::CreateModeBlob(const DrmDevice &drm)
+ -> DrmModeUserPropertyBlobUnique {
+ struct drm_mode_modeinfo drm_mode = {
+ .clock = clock_,
+ .hdisplay = h_display_,
+ .hsync_start = h_sync_start_,
+ .hsync_end = h_sync_end_,
+ .htotal = h_total_,
+ .hskew = h_skew_,
+ .vdisplay = v_display_,
+ .vsync_start = v_sync_start_,
+ .vsync_end = v_sync_end_,
+ .vtotal = v_total_,
+ .vscan = v_scan_,
+ .vrefresh = v_refresh_,
+ .flags = flags_,
+ .type = type_,
+ };
+ strncpy(drm_mode.name, name_.c_str(), DRM_DISPLAY_MODE_LEN);
+
+ return drm.RegisterUserPropertyBlob(&drm_mode,
+ sizeof(struct drm_mode_modeinfo));
}
+
} // namespace android
diff --git a/drm/DrmMode.h b/drm/DrmMode.h
index 313a8ea..41b9e15 100644
--- a/drm/DrmMode.h
+++ b/drm/DrmMode.h
@@ -17,37 +17,38 @@
#ifndef ANDROID_DRM_MODE_H_
#define ANDROID_DRM_MODE_H_
-#include <stdint.h>
+#include <stdio.h>
#include <xf86drmMode.h>
+#include <cstdint>
#include <string>
+#include "DrmUnique.h"
+
namespace android {
+class DrmDevice;
+
class DrmMode {
public:
DrmMode() = default;
DrmMode(drmModeModeInfoPtr m);
bool operator==(const drmModeModeInfo &m) const;
- void ToDrmModeModeInfo(drm_mode_modeinfo *m) const;
-
- uint32_t id() const;
- void set_id(uint32_t id);
uint32_t clock() const;
- uint32_t h_display() const;
- uint32_t h_sync_start() const;
- uint32_t h_sync_end() const;
- uint32_t h_total() const;
- uint32_t h_skew() const;
-
- uint32_t v_display() const;
- uint32_t v_sync_start() const;
- uint32_t v_sync_end() const;
- uint32_t v_total() const;
- uint32_t v_scan() const;
+ uint16_t h_display() const;
+ uint16_t h_sync_start() const;
+ uint16_t h_sync_end() const;
+ uint16_t h_total() const;
+ uint16_t h_skew() const;
+
+ uint16_t v_display() const;
+ uint16_t v_sync_start() const;
+ uint16_t v_sync_end() const;
+ uint16_t v_total() const;
+ uint16_t v_scan() const;
float v_refresh() const;
uint32_t flags() const;
@@ -55,23 +56,23 @@ class DrmMode {
std::string name() const;
- private:
- uint32_t id_ = 0;
+ auto CreateModeBlob(const DrmDevice &drm) -> DrmModeUserPropertyBlobUnique;
+ private:
uint32_t clock_ = 0;
- uint32_t h_display_ = 0;
- uint32_t h_sync_start_ = 0;
- uint32_t h_sync_end_ = 0;
- uint32_t h_total_ = 0;
- uint32_t h_skew_ = 0;
-
- uint32_t v_display_ = 0;
- uint32_t v_sync_start_ = 0;
- uint32_t v_sync_end_ = 0;
- uint32_t v_total_ = 0;
- uint32_t v_scan_ = 0;
- uint32_t v_refresh_ = 0;
+ uint16_t h_display_ = 0;
+ uint16_t h_sync_start_ = 0;
+ uint16_t h_sync_end_ = 0;
+ uint16_t h_total_ = 0;
+ uint16_t h_skew_ = 0;
+
+ uint16_t v_display_ = 0;
+ uint16_t v_sync_start_ = 0;
+ uint16_t v_sync_end_ = 0;
+ uint16_t v_total_ = 0;
+ uint16_t v_scan_ = 0;
+ uint16_t v_refresh_ = 0;
uint32_t flags_ = 0;
uint32_t type_ = 0;
diff --git a/drm/ResourceManager.cpp b/drm/ResourceManager.cpp
index c55d6b8..8baa4cb 100644
--- a/drm/ResourceManager.cpp
+++ b/drm/ResourceManager.cpp
@@ -70,6 +70,12 @@ int ResourceManager::Init() {
return -EINVAL;
}
+ ret = uevent_listener_.Init();
+ if (ret) {
+ ALOGE("Can't initialize event listener %d", ret);
+ return ret;
+ }
+
return 0;
}
diff --git a/drm/ResourceManager.h b/drm/ResourceManager.h
index d9e0712..5ffe92c 100644
--- a/drm/ResourceManager.h
+++ b/drm/ResourceManager.h
@@ -20,6 +20,7 @@
#include <string.h>
#include "DrmDevice.h"
+#include "UEventListener.h"
#include "DrmFbImporter.h"
namespace android {
@@ -29,6 +30,10 @@ class ResourceManager {
ResourceManager();
ResourceManager(const ResourceManager &) = delete;
ResourceManager &operator=(const ResourceManager &) = delete;
+ ~ResourceManager() {
+ uevent_listener_.Exit();
+ }
+
int Init();
DrmDevice *GetDrmDevice(int display);
const std::vector<std::unique_ptr<DrmDevice>> &getDrmDevices() const {
@@ -41,6 +46,10 @@ class ResourceManager {
return scale_with_gpu_;
}
+ UEventListener *GetUEventListener() {
+ return &uevent_listener_;
+ }
+
private:
int AddDrmDevice(std::string const &path);
@@ -48,6 +57,8 @@ class ResourceManager {
std::vector<std::unique_ptr<DrmDevice>> drms_;
bool scale_with_gpu_{};
+
+ UEventListener uevent_listener_;
};
} // namespace android
diff --git a/drm/DrmEventListener.cpp b/drm/UEventListener.cpp
index 53e7032..eae0608 100644
--- a/drm/DrmEventListener.cpp
+++ b/drm/UEventListener.cpp
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-#define LOG_TAG "hwc-drm-event-listener"
+#define LOG_TAG "hwc-uevent-listener"
-#include "DrmEventListener.h"
+#include "UEventListener.h"
#include <linux/netlink.h>
#include <sys/socket.h>
@@ -26,7 +26,6 @@
#include <cerrno>
#include <cstring>
-#include "DrmDevice.h"
#include "utils/log.h"
/* Originally defined in system/core/libsystem/include/system/graphics.h */
@@ -34,11 +33,10 @@
namespace android {
-DrmEventListener::DrmEventListener(DrmDevice *drm)
- : Worker("drm-event-listener", HAL_PRIORITY_URGENT_DISPLAY), drm_(drm) {
-}
+UEventListener::UEventListener()
+ : Worker("uevent-listener", HAL_PRIORITY_URGENT_DISPLAY){};
-int DrmEventListener::Init() {
+int UEventListener::Init() {
uevent_fd_ = UniqueFd(
socket(PF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_KOBJECT_UEVENT));
if (!uevent_fd_) {
@@ -57,44 +55,13 @@ int DrmEventListener::Init() {
return -errno;
}
- // NOLINTNEXTLINE(readability-isolate-declaration)
- FD_ZERO(&fds_);
- FD_SET(drm_->fd(), &fds_);
- FD_SET(uevent_fd_.Get(), &fds_);
- max_fd_ = std::max(drm_->fd(), uevent_fd_.Get());
-
return InitWorker();
}
-void DrmEventListener::RegisterHotplugHandler(DrmEventHandler *handler) {
- assert(!hotplug_handler_);
- hotplug_handler_.reset(handler);
-}
-
-void DrmEventListener::FlipHandler(int /* fd */, unsigned int /* sequence */,
- unsigned int tv_sec, unsigned int tv_usec,
- void *user_data) {
- auto *handler = (DrmEventHandler *)user_data;
- if (!handler)
- return;
-
- handler->HandleEvent((uint64_t)tv_sec * 1000 * 1000 + tv_usec);
- delete handler; // NOLINT(cppcoreguidelines-owning-memory)
-}
-
-void DrmEventListener::UEventHandler() {
+void UEventListener::Routine() {
char buffer[1024];
ssize_t ret = 0;
- struct timespec ts {};
-
- uint64_t timestamp = 0;
- ret = clock_gettime(CLOCK_MONOTONIC, &ts);
- if (!ret)
- timestamp = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
- else
- ALOGE("Failed to get monotonic clock on hotplug %zd", ret);
-
while (true) {
ret = read(uevent_fd_.Get(), &buffer, sizeof(buffer));
if (ret == 0)
@@ -120,26 +87,9 @@ void DrmEventListener::UEventHandler() {
i += strlen(event) + 1;
}
- if (drm_event && hotplug_event)
- hotplug_handler_->HandleEvent(timestamp);
- }
-}
-
-void DrmEventListener::Routine() {
- int ret = 0;
- do {
- ret = select(max_fd_ + 1, &fds_, nullptr, nullptr, nullptr);
- } while (ret == -1 && errno == EINTR);
-
- if (FD_ISSET(drm_->fd(), &fds_)) {
- drmEventContext event_context =
- {.version = 2,
- .vblank_handler = nullptr,
- .page_flip_handler = DrmEventListener::FlipHandler};
- drmHandleEvent(drm_->fd(), &event_context);
+ if (drm_event && hotplug_event && hotplug_handler_) {
+ hotplug_handler_();
+ }
}
-
- if (FD_ISSET(uevent_fd_.Get(), &fds_))
- UEventHandler();
}
} // namespace android
diff --git a/drm/DrmEventListener.h b/drm/UEventListener.h
index f1f7310..048eb40 100644
--- a/drm/DrmEventListener.h
+++ b/drm/UEventListener.h
@@ -14,51 +14,34 @@
* limitations under the License.
*/
-#ifndef ANDROID_DRM_EVENT_LISTENER_H_
-#define ANDROID_DRM_EVENT_LISTENER_H_
+#ifndef ANDROID_UEVENT_LISTENER_H_
+#define ANDROID_UEVENT_LISTENER_H_
+
+#include <functional>
#include "utils/UniqueFd.h"
#include "utils/Worker.h"
namespace android {
-class DrmDevice;
-
-class DrmEventHandler {
- public:
- DrmEventHandler() {
- }
- virtual ~DrmEventHandler() {
- }
-
- virtual void HandleEvent(uint64_t timestamp_us) = 0;
-};
-
-class DrmEventListener : public Worker {
+class UEventListener : public Worker {
public:
- DrmEventListener(DrmDevice *drm);
- virtual ~DrmEventListener() {
- }
+ UEventListener();
+ virtual ~UEventListener() = default;
int Init();
- void RegisterHotplugHandler(DrmEventHandler *handler);
-
- static void FlipHandler(int fd, unsigned int sequence, unsigned int tv_sec,
- unsigned int tv_usec, void *user_data);
+ void RegisterHotplugHandler(std::function<void()> hotplug_handler) {
+ hotplug_handler_ = hotplug_handler;
+ }
protected:
virtual void Routine();
private:
- void UEventHandler();
-
- fd_set fds_{};
UniqueFd uevent_fd_;
- int max_fd_ = -1;
- DrmDevice *drm_;
- std::unique_ptr<DrmEventHandler> hotplug_handler_;
+ std::function<void()> hotplug_handler_;
};
} // namespace android