diff options
author | John Stultz <john.stultz@linaro.org> | 2021-12-14 20:42:41 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-12-14 20:42:41 +0000 |
commit | d8fc8031b6d62ebc89050d0f7afc536b83d25162 (patch) | |
tree | bcd857ed709746221362cd12ac3a0c451a54a762 /drm | |
parent | d1c37433d9a6f9467f50808620f7cad89998bbb6 (diff) | |
parent | 51fd1b6fdeaa34f67484932847855775861701fb (diff) | |
download | drm_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.cpp | 26 | ||||
-rw-r--r-- | drm/DrmConnector.h | 6 | ||||
-rw-r--r-- | drm/DrmDevice.cpp | 16 | ||||
-rw-r--r-- | drm/DrmDevice.h | 8 | ||||
-rw-r--r-- | drm/DrmFbImporter.cpp | 4 | ||||
-rw-r--r-- | drm/DrmMode.cpp | 73 | ||||
-rw-r--r-- | drm/DrmMode.h | 61 | ||||
-rw-r--r-- | drm/ResourceManager.cpp | 6 | ||||
-rw-r--r-- | drm/ResourceManager.h | 11 | ||||
-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 |