| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SCREENSHOT_CRTC_H_ |
| #define SCREENSHOT_CRTC_H_ |
| |
| #include <memory> |
| #include <utility> |
| #include <vector> |
| |
| #include <base/files/file.h> |
| #include <base/macros.h> |
| #include <xf86drm.h> |
| #include <xf86drmMode.h> |
| |
| #include "screenshot/ptr_util.h" |
| |
| namespace screenshot { |
| |
| struct PlanePosition { |
| int32_t x; |
| int32_t y; |
| uint32_t w; |
| uint32_t h; |
| }; |
| |
| class Crtc { |
| public: |
| using PlaneInfo = std::pair<ScopedDrmModeFB2Ptr, PlanePosition>; |
| |
| Crtc(base::File file, ScopedDrmModeConnectorPtr connector, |
| ScopedDrmModeEncoderPtr encoder, ScopedDrmModeCrtcPtr crtc, |
| ScopedDrmModeFBPtr fb, ScopedDrmModeFB2Ptr fb2); |
| |
| Crtc(base::File file, ScopedDrmModeConnectorPtr connector, |
| ScopedDrmModeEncoderPtr encoder, ScopedDrmModeCrtcPtr crtc, |
| std::vector<PlaneInfo> planes); |
| |
| 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(); } |
| |
| drmModeFB* fb() const { return fb_.get(); } |
| drmModeFB2* fb2() const { return fb2_.get(); } |
| const std::vector<PlaneInfo>& planes() const { return planes_; } |
| |
| uint32_t width() const { return crtc_->width; } |
| uint32_t height() const { return crtc_->height; } |
| |
| bool IsInternalDisplay() const; |
| |
| private: |
| base::File file_; |
| ScopedDrmModeConnectorPtr connector_; |
| ScopedDrmModeEncoderPtr encoder_; |
| ScopedDrmModeCrtcPtr crtc_; |
| ScopedDrmModeFBPtr fb_; |
| ScopedDrmModeFB2Ptr fb2_; |
| |
| std::vector<PlaneInfo> planes_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Crtc); |
| }; |
| |
| class CrtcFinder { |
| public: |
| static std::unique_ptr<Crtc> FindAnyDisplay(); |
| static std::unique_ptr<Crtc> FindInternalDisplay(); |
| static std::unique_ptr<Crtc> FindExternalDisplay(); |
| static std::unique_ptr<Crtc> FindById(uint32_t crtc_id); |
| |
| private: |
| CrtcFinder() = delete; |
| }; |
| |
| } // namespace screenshot |
| |
| #endif // SCREENSHOT_CRTC_H_ |