| // Copyright 2018 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SCREEN_CAPTURE_UTILS_PTR_UTIL_H_ | |
| #define SCREEN_CAPTURE_UTILS_PTR_UTIL_H_ | |
| #include <gbm.h> | |
| #include <xf86drm.h> | |
| #include <xf86drmMode.h> | |
| #include <memory> | |
| #include <set> | |
| #include <base/files/file.h> | |
| namespace screenshot { | |
| struct DrmModeResDeleter { | |
| void operator()(drmModeRes* resources) { drmModeFreeResources(resources); } | |
| }; | |
| using ScopedDrmModeResPtr = std::unique_ptr<drmModeRes, DrmModeResDeleter>; | |
| struct DrmModeCrtcDeleter { | |
| void operator()(drmModeCrtc* crtc) { drmModeFreeCrtc(crtc); } | |
| }; | |
| using ScopedDrmModeCrtcPtr = std::unique_ptr<drmModeCrtc, DrmModeCrtcDeleter>; | |
| struct DrmModeEncoderDeleter { | |
| void operator()(drmModeEncoder* encoder) { drmModeFreeEncoder(encoder); } | |
| }; | |
| using ScopedDrmModeEncoderPtr = | |
| std::unique_ptr<drmModeEncoder, DrmModeEncoderDeleter>; | |
| struct DrmModeConnectorDeleter { | |
| void operator()(drmModeConnector* connector) { | |
| drmModeFreeConnector(connector); | |
| } | |
| }; | |
| using ScopedDrmModeConnectorPtr = | |
| std::unique_ptr<drmModeConnector, DrmModeConnectorDeleter>; | |
| struct DrmModeFBDeleter { | |
| void operator()(drmModeFB* fb) { drmModeFreeFB(fb); } | |
| }; | |
| using ScopedDrmModeFBPtr = std::unique_ptr<drmModeFB, DrmModeFBDeleter>; | |
| struct ScopedDrmModeFB2Ptr { | |
| public: | |
| // Expectation is that drm_fd owned by Crtc would always outlive this class. | |
| ScopedDrmModeFB2Ptr(drmModeFB2* fb2, int drm_fd) | |
| : fb2_(fb2), drm_fd_(drm_fd) {} | |
| ScopedDrmModeFB2Ptr(ScopedDrmModeFB2Ptr&& source) | |
| : fb2_(source.fb2_), drm_fd_(source.drm_fd_) { | |
| source.fb2_ = nullptr; | |
| } | |
| ~ScopedDrmModeFB2Ptr() { | |
| if (fb2_) { | |
| std::set<int> close_handles; | |
| for (int i = 0; fb2_->handles[i] && i < GBM_MAX_PLANES; ++i) { | |
| close_handles.insert(fb2_->handles[i]); | |
| } | |
| for (int handle : close_handles) { | |
| drmCloseBufferHandle(drm_fd_, handle); | |
| } | |
| drmModeFreeFB2(fb2_); | |
| } | |
| } | |
| drmModeFB2* get() const { return fb2_; } | |
| drmModeFB2* operator->() const { return fb2_; } | |
| explicit operator bool() const noexcept { return fb2_; } | |
| private: | |
| drmModeFB2* fb2_; | |
| const int drm_fd_; | |
| }; | |
| struct DrmModePlaneResDeleter { | |
| void operator()(drmModePlaneRes* res) { drmModeFreePlaneResources(res); } | |
| }; | |
| using ScopedDrmPlaneResPtr = | |
| std::unique_ptr<drmModePlaneRes, DrmModePlaneResDeleter>; | |
| struct DrmModePlaneDeleter { | |
| void operator()(drmModePlane* plane) { drmModeFreePlane(plane); } | |
| }; | |
| using ScopedDrmPlanePtr = std::unique_ptr<drmModePlane, DrmModePlaneDeleter>; | |
| struct DrmModePropertyDeleter { | |
| void operator()(drmModePropertyRes* prop) { drmModeFreeProperty(prop); } | |
| }; | |
| using ScopedDrmPropertyPtr = | |
| std::unique_ptr<drmModePropertyRes, DrmModePropertyDeleter>; | |
| struct DrmModeObjectPropertiesDeleter { | |
| void operator()(drmModeObjectProperties* props) { | |
| drmModeFreeObjectProperties(props); | |
| } | |
| }; | |
| using ScopedDrmObjectPropertiesPtr = | |
| std::unique_ptr<drmModeObjectProperties, DrmModeObjectPropertiesDeleter>; | |
| struct GbmDeviceDeleter { | |
| void operator()(gbm_device* device) { gbm_device_destroy(device); } | |
| }; | |
| using ScopedGbmDevicePtr = std::unique_ptr<gbm_device, GbmDeviceDeleter>; | |
| struct GbmBoDeleter { | |
| void operator()(gbm_bo* bo) { gbm_bo_destroy(bo); } | |
| }; | |
| using ScopedGbmBoPtr = std::unique_ptr<gbm_bo, GbmBoDeleter>; | |
| } // namespace screenshot | |
| #endif // SCREEN_CAPTURE_UTILS_PTR_UTIL_H_ |