| // 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_CRTC_H_ |
| #define SCREEN_CAPTURE_UTILS_CRTC_H_ |
| |
| #include <xf86drm.h> |
| #include <xf86drmMode.h> |
| |
| #include <memory> |
| #include <utility> |
| #include <vector> |
| |
| #include <base/files/file.h> |
| |
| #include "screen-capture-utils/ptr_util.h" |
| |
| namespace screenshot { |
| |
| struct PlaneConfiguration { |
| float crop_x; |
| float crop_y; |
| float crop_w; |
| float crop_h; |
| |
| // |x|, |y|, |w|, and |h| describe the destination rectangle. |
| int32_t x; |
| int32_t y; |
| uint32_t w; |
| uint32_t h; |
| }; |
| |
| enum class PanelRotation { k0, k90, k180, k270 }; |
| |
| class Crtc { |
| public: |
| using PlaneInfo = std::pair<ScopedDrmModeFB2Ptr, PlaneConfiguration>; |
| |
| Crtc(base::File file, |
| ScopedDrmModeConnectorPtr connector, |
| ScopedDrmModeEncoderPtr encoder, |
| ScopedDrmModeCrtcPtr crtc, |
| ScopedDrmModeFB2Ptr fb2, |
| ScopedDrmPlaneResPtr plane_res, |
| PanelRotation panel_orientation); |
| |
| Crtc(const Crtc&) = delete; |
| Crtc& operator=(const Crtc&) = delete; |
| |
| const base::File& file() const { return file_; } |
| drmModeConnector* connector() const { return connector_.get(); } |
| drmModeEncoder* encoder() const { return encoder_.get(); } |
| drmModeCrtc* crtc() const { return crtc_.get(); } |
| |
| drmModeFB2* fb2() const { return fb2_.get(); } |
| |
| uint32_t width() const { return crtc_->width; } |
| uint32_t height() const { return crtc_->height; } |
| |
| PanelRotation panel_orientation() const { return panel_orientation_; } |
| |
| bool IsInternalDisplay() const; |
| std::vector<Crtc::PlaneInfo> GetConnectedPlanes() const; |
| |
| private: |
| // File descriptor for the DRM device. |
| base::File file_; |
| ScopedDrmModeConnectorPtr connector_; |
| ScopedDrmModeEncoderPtr encoder_; |
| ScopedDrmModeCrtcPtr crtc_; |
| ScopedDrmModeFB2Ptr fb2_; |
| ScopedDrmPlaneResPtr plane_res_; |
| const PanelRotation panel_orientation_; |
| }; |
| |
| class CrtcFinder final { |
| public: |
| enum class Spec { |
| kAnyDisplay = 0, |
| kInternalDisplay, |
| kExternalDisplay, |
| kById, |
| }; |
| |
| CrtcFinder() = default; |
| ~CrtcFinder() = default; |
| |
| inline void SetSpec(Spec spec) { spec_ = spec; } |
| inline void SetCrtcId(uint32_t crtc_id) { crtc_id_ = crtc_id; } |
| |
| std::unique_ptr<Crtc> Find() const; |
| |
| private: |
| bool MatchesSpec(const Crtc* crtc) const; |
| |
| Spec spec_ = Spec::kAnyDisplay; |
| uint32_t crtc_id_; |
| }; |
| |
| } // namespace screenshot |
| |
| #endif // SCREEN_CAPTURE_UTILS_CRTC_H_ |