• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_HWC_DRMPRESENTER_H
18 #define ANDROID_HWC_DRMPRESENTER_H
19 
20 #include <android-base/unique_fd.h>
21 #include <include/drmhwcgralloc.h>
22 #include <utils/Thread.h>
23 #include <xf86drm.h>
24 #include <xf86drmMode.h>
25 
26 #include <map>
27 #include <memory>
28 #include <vector>
29 
30 #include "Common.h"
31 #include "android/base/synchronization/AndroidLock.h"
32 
33 namespace android {
34 
35 class DrmBuffer;
36 class DrmPresenter;
37 
38 // A RAII object that will clear a drm framebuffer upon destruction.
39 class DrmBuffer {
40  public:
41   DrmBuffer(const native_handle_t* handle, DrmPresenter& drmPresenter);
42   ~DrmBuffer();
43 
44   DrmBuffer(const DrmBuffer&) = delete;
45   DrmBuffer& operator=(const DrmBuffer&) = delete;
46 
47   DrmBuffer(DrmBuffer&&) = delete;
48   DrmBuffer& operator=(DrmBuffer&&) = delete;
49 
50   HWC2::Error flushToDisplay(int display, int* outFlushDoneSyncFd);
51 
52  private:
53   int convertBoInfo(const native_handle_t* handle);
54 
55   DrmPresenter& mDrmPresenter;
56   hwc_drm_bo_t mBo;
57 };
58 
59 class DrmPresenter {
60  public:
61   DrmPresenter() = default;
62   ~DrmPresenter() = default;
63 
64   DrmPresenter(const DrmPresenter&) = delete;
65   DrmPresenter& operator=(const DrmPresenter&) = delete;
66 
67   DrmPresenter(DrmPresenter&&) = delete;
68   DrmPresenter& operator=(DrmPresenter&&) = delete;
69 
70   using HotplugCallback = std::function<void(
71       bool /*connected*/, uint32_t /*id*/, uint32_t /*width*/,
72       uint32_t /*height*/, uint32_t /*dpiX*/, uint32_t /*dpiY*/,
73       uint32_t /*refreshRate*/)>;
74 
75   bool init(const HotplugCallback& cb);
76 
refreshRate()77   uint32_t refreshRate() const { return mConnectors[0].mRefreshRateAsInteger; }
78 
79   HWC2::Error flushToDisplay(int display, hwc_drm_bo_t& fb, int* outSyncFd);
80 
81   std::optional<std::vector<uint8_t>> getEdid(uint32_t id);
82 
83  private:
84   // Grant visibility for getDrmFB and clearDrmFB to DrmBuffer.
85   friend class DrmBuffer;
86   int getDrmFB(hwc_drm_bo_t& bo);
87   int clearDrmFB(hwc_drm_bo_t& bo);
88 
89   // Grant visibility for handleHotplug to DrmEventListener.
90   bool handleHotplug();
91 
92   bool initDrmElementsLocked();
93   void resetDrmElementsLocked();
94 
95   // Drm device.
96   android::base::unique_fd mFd;
97 
98   HotplugCallback mHotplugCallback;
99 
100   // Protects access to the below drm structs.
101   android::base::guest::ReadWriteLock mStateMutex;
102 
103   struct DrmPlane {
104     uint32_t mId = -1;
105     uint32_t mCrtcPropertyId = -1;
106     uint32_t mFbPropertyId = -1;
107     uint32_t mCrtcXPropertyId = -1;
108     uint32_t mCrtcYPropertyId = -1;
109     uint32_t mCrtcWPropertyId = -1;
110     uint32_t mCrtcHPropertyId = -1;
111     uint32_t mSrcXPropertyId = -1;
112     uint32_t mSrcYPropertyId = -1;
113     uint32_t mSrcWPropertyId = -1;
114     uint32_t mSrcHPropertyId = -1;
115     uint32_t mTypePropertyId = -1;
116     uint64_t mType = -1;
117   };
118   std::map<uint32_t, DrmPlane> mPlanes;
119 
120   struct DrmCrtc {
121     uint32_t mId = -1;
122     uint32_t mActivePropertyId = -1;
123     uint32_t mModePropertyId = -1;
124     uint32_t mFencePropertyId = -1;
125     uint32_t mPlaneId = -1;
126 
127     bool mDidSetCrtc = false;
128   };
129   std::vector<DrmCrtc> mCrtcs;
130 
131   struct DrmConnector {
132     uint32_t mId = -1;
133     uint32_t mCrtcPropertyId = -1;
134     drmModeModeInfo mMode;
135     int32_t dpiX;
136     int32_t dpiY;
137     drmModeConnection connection;
138     uint32_t mModeBlobId = 0;
139     float mRefreshRateAsFloat;
140     uint32_t mRefreshRateAsInteger;
141     uint64_t mEdidBlobId = -1;
142   };
143   std::vector<DrmConnector> mConnectors;
144 
145   class DrmEventListener : public Thread {
146    public:
147     DrmEventListener(DrmPresenter& presenter);
148     virtual ~DrmEventListener();
149 
150     bool init();
151 
152    private:
153     bool threadLoop() final;
154     void eventThreadLoop();
155     void processHotplug(uint64_t timestamp);
156 
157     DrmPresenter& mPresenter;
158     android::base::unique_fd mEventFd;
159     int mMaxFd;
160     fd_set mMonitoredFds;
161   };
162   android::sp<DrmEventListener> mDrmEventListener;
163 };
164 
165 }  // namespace android
166 
167 #endif
168