• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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_SF_HWC2_ON_1_ADAPTER_H
18 #define ANDROID_SF_HWC2_ON_1_ADAPTER_H
19 
20 #define HWC2_INCLUDE_STRINGIFICATION
21 #define HWC2_USE_CPP11
22 #include <hardware/hwcomposer2.h>
23 #undef HWC2_INCLUDE_STRINGIFICATION
24 #undef HWC2_USE_CPP11
25 
26 #include <ui/Fence.h>
27 
28 #include <atomic>
29 #include <map>
30 #include <mutex>
31 #include <queue>
32 #include <set>
33 #include <unordered_map>
34 #include <unordered_set>
35 #include <vector>
36 
37 struct hwc_composer_device_1;
38 struct hwc_display_contents_1;
39 struct hwc_layer_1;
40 
41 namespace android {
42 
43 class HWC2On1Adapter : public hwc2_device_t
44 {
45 public:
46     HWC2On1Adapter(struct hwc_composer_device_1* hwc1Device);
47     ~HWC2On1Adapter();
48 
getHwc1Device()49     struct hwc_composer_device_1* getHwc1Device() const { return mHwc1Device; }
getHwc1MinorVersion()50     uint8_t getHwc1MinorVersion() const { return mHwc1MinorVersion; }
51 
52 private:
getAdapter(hwc2_device_t * device)53     static inline HWC2On1Adapter* getAdapter(hwc2_device_t* device) {
54         return static_cast<HWC2On1Adapter*>(device);
55     }
56 
57     // getCapabilities
58 
59     void doGetCapabilities(uint32_t* outCount,
60             int32_t* /*hwc2_capability_t*/ outCapabilities);
getCapabilitiesHook(hwc2_device_t * device,uint32_t * outCount,int32_t * outCapabilities)61     static void getCapabilitiesHook(hwc2_device_t* device, uint32_t* outCount,
62             int32_t* /*hwc2_capability_t*/ outCapabilities) {
63         getAdapter(device)->doGetCapabilities(outCount, outCapabilities);
64     }
65 
66     // getFunction
67 
68     hwc2_function_pointer_t doGetFunction(HWC2::FunctionDescriptor descriptor);
getFunctionHook(hwc2_device_t * device,int32_t intDesc)69     static hwc2_function_pointer_t getFunctionHook(hwc2_device_t* device,
70             int32_t intDesc) {
71         auto descriptor = static_cast<HWC2::FunctionDescriptor>(intDesc);
72         return getAdapter(device)->doGetFunction(descriptor);
73     }
74 
75     // Device functions
76 
77     HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height,
78             hwc2_display_t* outDisplay);
createVirtualDisplayHook(hwc2_device_t * device,uint32_t width,uint32_t height,int32_t *,hwc2_display_t * outDisplay)79     static int32_t createVirtualDisplayHook(hwc2_device_t* device,
80             uint32_t width, uint32_t height, int32_t* /*format*/,
81             hwc2_display_t* outDisplay) {
82         // HWC1 implementations cannot override the buffer format requested by
83         // the consumer
84         auto error = getAdapter(device)->createVirtualDisplay(width, height,
85                 outDisplay);
86         return static_cast<int32_t>(error);
87     }
88 
89     HWC2::Error destroyVirtualDisplay(hwc2_display_t display);
destroyVirtualDisplayHook(hwc2_device_t * device,hwc2_display_t display)90     static int32_t destroyVirtualDisplayHook(hwc2_device_t* device,
91             hwc2_display_t display) {
92         auto error = getAdapter(device)->destroyVirtualDisplay(display);
93         return static_cast<int32_t>(error);
94     }
95 
96     std::string mDumpString;
97     void dump(uint32_t* outSize, char* outBuffer);
dumpHook(hwc2_device_t * device,uint32_t * outSize,char * outBuffer)98     static void dumpHook(hwc2_device_t* device, uint32_t* outSize,
99             char* outBuffer) {
100         getAdapter(device)->dump(outSize, outBuffer);
101     }
102 
103     uint32_t getMaxVirtualDisplayCount();
getMaxVirtualDisplayCountHook(hwc2_device_t * device)104     static uint32_t getMaxVirtualDisplayCountHook(hwc2_device_t* device) {
105         return getAdapter(device)->getMaxVirtualDisplayCount();
106     }
107 
108     HWC2::Error registerCallback(HWC2::Callback descriptor,
109             hwc2_callback_data_t callbackData, hwc2_function_pointer_t pointer);
registerCallbackHook(hwc2_device_t * device,int32_t intDesc,hwc2_callback_data_t callbackData,hwc2_function_pointer_t pointer)110     static int32_t registerCallbackHook(hwc2_device_t* device,
111             int32_t intDesc, hwc2_callback_data_t callbackData,
112             hwc2_function_pointer_t pointer) {
113         auto descriptor = static_cast<HWC2::Callback>(intDesc);
114         auto error = getAdapter(device)->registerCallback(descriptor,
115                 callbackData, pointer);
116         return static_cast<int32_t>(error);
117     }
118 
119     // Display functions
120 
121     class Layer;
122 
123     class SortLayersByZ {
124         public:
125             bool operator()(const std::shared_ptr<Layer>& lhs,
126                     const std::shared_ptr<Layer>& rhs);
127     };
128 
129     class DisplayContentsDeleter {
130         public:
131             void operator()(struct hwc_display_contents_1* contents);
132     };
133 
134     class DeferredFence {
135         public:
DeferredFence()136             DeferredFence()
137               : mMutex(),
138                 mFences({Fence::NO_FENCE, Fence::NO_FENCE}) {}
139 
add(int32_t fenceFd)140             void add(int32_t fenceFd) {
141                 mFences.emplace(new Fence(fenceFd));
142                 mFences.pop();
143             }
144 
get()145             const sp<Fence>& get() const {
146                 return mFences.front();
147             }
148 
149         private:
150             mutable std::mutex mMutex;
151             std::queue<sp<Fence>> mFences;
152     };
153 
154     class FencedBuffer {
155         public:
FencedBuffer()156             FencedBuffer() : mBuffer(nullptr), mFence(Fence::NO_FENCE) {}
157 
setBuffer(buffer_handle_t buffer)158             void setBuffer(buffer_handle_t buffer) { mBuffer = buffer; }
setFence(int fenceFd)159             void setFence(int fenceFd) { mFence = new Fence(fenceFd); }
160 
getBuffer()161             buffer_handle_t getBuffer() const { return mBuffer; }
getFence()162             int getFence() const { return mFence->dup(); }
163 
164         private:
165             buffer_handle_t mBuffer;
166             sp<Fence> mFence;
167     };
168 
169     class Display {
170         public:
171             typedef std::unique_ptr<hwc_display_contents_1,
172                     DisplayContentsDeleter> HWC1Contents;
173 
174             Display(HWC2On1Adapter& device, HWC2::DisplayType type);
175 
getId()176             hwc2_display_t getId() const { return mId; }
getDevice()177             HWC2On1Adapter& getDevice() const { return mDevice; }
178 
179             // Does not require locking because it is set before adding the
180             // Displays to the Adapter's list of displays
setHwc1Id(int32_t id)181             void setHwc1Id(int32_t id) { mHwc1Id = id; }
getHwc1Id()182             int32_t getHwc1Id() const { return mHwc1Id; }
183 
incDirty()184             void incDirty() { ++mDirtyCount; }
decDirty()185             void decDirty() { --mDirtyCount; }
isDirty()186             bool isDirty() const { return mDirtyCount > 0 || mZIsDirty; }
187 
188             // HWC2 Display functions
189             HWC2::Error acceptChanges();
190             HWC2::Error createLayer(hwc2_layer_t* outLayerId);
191             HWC2::Error destroyLayer(hwc2_layer_t layerId);
192             HWC2::Error getActiveConfig(hwc2_config_t* outConfigId);
193             HWC2::Error getAttribute(hwc2_config_t configId,
194                     HWC2::Attribute attribute, int32_t* outValue);
195             HWC2::Error getChangedCompositionTypes(uint32_t* outNumElements,
196                     hwc2_layer_t* outLayers, int32_t* outTypes);
197             HWC2::Error getColorModes(uint32_t* outNumModes, int32_t* outModes);
198             HWC2::Error getConfigs(uint32_t* outNumConfigs,
199                     hwc2_config_t* outConfigIds);
200             HWC2::Error getDozeSupport(int32_t* outSupport);
201             HWC2::Error getHdrCapabilities(uint32_t* outNumTypes,
202                     int32_t* outTypes, float* outMaxLuminance,
203                     float* outMaxAverageLuminance, float* outMinLuminance);
204             HWC2::Error getName(uint32_t* outSize, char* outName);
205             HWC2::Error getReleaseFences(uint32_t* outNumElements,
206                     hwc2_layer_t* outLayers, int32_t* outFences);
207             HWC2::Error getRequests(int32_t* outDisplayRequests,
208                     uint32_t* outNumElements, hwc2_layer_t* outLayers,
209                     int32_t* outLayerRequests);
210             HWC2::Error getType(int32_t* outType);
211             HWC2::Error present(int32_t* outRetireFence);
212             HWC2::Error setActiveConfig(hwc2_config_t configId);
213             HWC2::Error setClientTarget(buffer_handle_t target,
214                     int32_t acquireFence, int32_t dataspace,
215                     hwc_region_t damage);
216             HWC2::Error setColorMode(int32_t mode);
217             HWC2::Error setColorTransform(android_color_transform_t hint);
218             HWC2::Error setOutputBuffer(buffer_handle_t buffer,
219                     int32_t releaseFence);
220             HWC2::Error setPowerMode(HWC2::PowerMode mode);
221             HWC2::Error setVsyncEnabled(HWC2::Vsync enabled);
222             HWC2::Error validate(uint32_t* outNumTypes,
223                     uint32_t* outNumRequests);
224 
225             HWC2::Error updateLayerZ(hwc2_layer_t layerId, uint32_t z);
226 
227             // Read configs from HWC1 device
228             void populateConfigs();
229 
230             // Set configs for a virtual display
231             void populateConfigs(uint32_t width, uint32_t height);
232 
233             bool prepare();
234             HWC1Contents cloneRequestedContents() const;
235             void setReceivedContents(HWC1Contents contents);
236             bool hasChanges() const;
237             HWC2::Error set(hwc_display_contents_1& hwcContents);
238             void addRetireFence(int fenceFd);
239             void addReleaseFences(const hwc_display_contents_1& hwcContents);
240 
241             bool hasColorTransform() const;
242 
243             std::string dump() const;
244 
245         private:
246             class Config {
247                 public:
Config(Display & display)248                     Config(Display& display)
249                       : mDisplay(display),
250                         mAttributes() {}
251 
isOnDisplay(const Display & display)252                     bool isOnDisplay(const Display& display) const {
253                         return display.getId() == mDisplay.getId();
254                     }
255 
256                     void setAttribute(HWC2::Attribute attribute, int32_t value);
257                     int32_t getAttribute(HWC2::Attribute attribute) const;
258 
259                     void setHwc1Id(uint32_t id);
260                     bool hasHwc1Id(uint32_t id) const;
261                     int32_t getColorModeForHwc1Id(uint32_t id) const;
262                     HWC2::Error getHwc1IdForColorMode(int32_t mode,
263                             uint32_t* outId) const;
264 
setId(hwc2_config_t id)265                     void setId(hwc2_config_t id) { mId = id; }
getId()266                     hwc2_config_t getId() const { return mId; }
267 
268                     // Attempts to merge two configs that differ only in color
269                     // mode. Returns whether the merge was successful
270                     bool merge(const Config& other);
271 
272                     std::set<int32_t> getColorTransforms() const;
273 
274                     // splitLine divides the output into two lines suitable for
275                     // dumpsys SurfaceFlinger
276                     std::string toString(bool splitLine = false) const;
277 
278                 private:
279                     Display& mDisplay;
280                     hwc2_config_t mId;
281                     std::unordered_map<HWC2::Attribute, int32_t> mAttributes;
282 
283                     // Maps from color transform to HWC1 config ID
284                     std::unordered_map<int32_t, uint32_t> mHwc1Ids;
285             };
286 
287             class Changes {
288                 public:
getNumTypes()289                     uint32_t getNumTypes() const {
290                         return static_cast<uint32_t>(mTypeChanges.size());
291                     }
292 
getNumLayerRequests()293                     uint32_t getNumLayerRequests() const {
294                         return static_cast<uint32_t>(mLayerRequests.size());
295                     }
296 
297                     const std::unordered_map<hwc2_layer_t, HWC2::Composition>&
getTypeChanges()298                             getTypeChanges() const {
299                         return mTypeChanges;
300                     }
301 
302                     const std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>&
getLayerRequests()303                             getLayerRequests() const {
304                         return mLayerRequests;
305                     }
306 
getDisplayRequests()307                     int32_t getDisplayRequests() const {
308                         int32_t requests = 0;
309                         for (auto request : mDisplayRequests) {
310                             requests |= static_cast<int32_t>(request);
311                         }
312                         return requests;
313                     }
314 
addTypeChange(hwc2_layer_t layerId,HWC2::Composition type)315                     void addTypeChange(hwc2_layer_t layerId,
316                             HWC2::Composition type) {
317                         mTypeChanges.insert({layerId, type});
318                     }
319 
clearTypeChanges()320                     void clearTypeChanges() { mTypeChanges.clear(); }
321 
addLayerRequest(hwc2_layer_t layerId,HWC2::LayerRequest request)322                     void addLayerRequest(hwc2_layer_t layerId,
323                             HWC2::LayerRequest request) {
324                         mLayerRequests.insert({layerId, request});
325                     }
326 
327                 private:
328                     std::unordered_map<hwc2_layer_t, HWC2::Composition>
329                             mTypeChanges;
330                     std::unordered_map<hwc2_layer_t, HWC2::LayerRequest>
331                             mLayerRequests;
332                     std::unordered_set<HWC2::DisplayRequest> mDisplayRequests;
333             };
334 
335             std::shared_ptr<const Config>
336                     getConfig(hwc2_config_t configId) const;
337 
338             void populateColorModes();
339             void initializeActiveConfig();
340 
341             void reallocateHwc1Contents();
342             void assignHwc1LayerIds();
343 
344             void updateTypeChanges(const struct hwc_layer_1& hwc1Layer,
345                     const Layer& layer);
346             void updateLayerRequests(const struct hwc_layer_1& hwc1Layer,
347                     const Layer& layer);
348 
349             void prepareFramebufferTarget();
350 
351             static std::atomic<hwc2_display_t> sNextId;
352             const hwc2_display_t mId;
353             HWC2On1Adapter& mDevice;
354 
355             std::atomic<size_t> mDirtyCount;
356 
357             // The state of this display should only be modified from
358             // SurfaceFlinger's main loop, with the exception of when dump is
359             // called. To prevent a bad state from crashing us during a dump
360             // call, all public calls into Display must acquire this mutex.
361             //
362             // It is recursive because we don't want to deadlock in validate
363             // (or present) when we call HWC2On1Adapter::prepareAllDisplays
364             // (or setAllDisplays), which calls back into Display functions
365             // which require locking.
366             mutable std::recursive_mutex mStateMutex;
367 
368             bool mZIsDirty;
369             HWC1Contents mHwc1RequestedContents;
370             HWC1Contents mHwc1ReceivedContents;
371             DeferredFence mRetireFence;
372 
373             // Will only be non-null after the layer has been validated but
374             // before it has been presented
375             std::unique_ptr<Changes> mChanges;
376 
377             int32_t mHwc1Id;
378 
379             std::vector<std::shared_ptr<Config>> mConfigs;
380             std::shared_ptr<const Config> mActiveConfig;
381             std::set<int32_t> mColorModes;
382             int32_t mActiveColorMode;
383             std::string mName;
384             HWC2::DisplayType mType;
385             HWC2::PowerMode mPowerMode;
386             HWC2::Vsync mVsyncEnabled;
387 
388             FencedBuffer mClientTarget;
389             FencedBuffer mOutputBuffer;
390 
391             bool mHasColorTransform;
392 
393             std::multiset<std::shared_ptr<Layer>, SortLayersByZ> mLayers;
394             std::unordered_map<size_t, std::shared_ptr<Layer>> mHwc1LayerMap;
395     };
396 
397     template <typename ...Args>
callDisplayFunction(hwc2_device_t * device,hwc2_display_t displayId,HWC2::Error (Display::* member)(Args...),Args...args)398     static int32_t callDisplayFunction(hwc2_device_t* device,
399             hwc2_display_t displayId, HWC2::Error (Display::*member)(Args...),
400             Args... args) {
401         auto display = getAdapter(device)->getDisplay(displayId);
402         if (!display) {
403             return static_cast<int32_t>(HWC2::Error::BadDisplay);
404         }
405         auto error = ((*display).*member)(std::forward<Args>(args)...);
406         return static_cast<int32_t>(error);
407     }
408 
409     template <typename MF, MF memFunc, typename ...Args>
displayHook(hwc2_device_t * device,hwc2_display_t displayId,Args...args)410     static int32_t displayHook(hwc2_device_t* device, hwc2_display_t displayId,
411             Args... args) {
412         return HWC2On1Adapter::callDisplayFunction(device, displayId, memFunc,
413                 std::forward<Args>(args)...);
414     }
415 
getDisplayAttributeHook(hwc2_device_t * device,hwc2_display_t display,hwc2_config_t config,int32_t intAttribute,int32_t * outValue)416     static int32_t getDisplayAttributeHook(hwc2_device_t* device,
417             hwc2_display_t display, hwc2_config_t config,
418             int32_t intAttribute, int32_t* outValue) {
419         auto attribute = static_cast<HWC2::Attribute>(intAttribute);
420         return callDisplayFunction(device, display, &Display::getAttribute,
421                 config, attribute, outValue);
422     }
423 
setColorTransformHook(hwc2_device_t * device,hwc2_display_t display,const float *,int32_t intHint)424     static int32_t setColorTransformHook(hwc2_device_t* device,
425             hwc2_display_t display, const float* /*matrix*/,
426             int32_t /*android_color_transform_t*/ intHint) {
427         // We intentionally throw away the matrix, because if the hint is
428         // anything other than IDENTITY, we have to fall back to client
429         // composition anyway
430         auto hint = static_cast<android_color_transform_t>(intHint);
431         return callDisplayFunction(device, display, &Display::setColorTransform,
432                 hint);
433     }
434 
setPowerModeHook(hwc2_device_t * device,hwc2_display_t display,int32_t intMode)435     static int32_t setPowerModeHook(hwc2_device_t* device,
436             hwc2_display_t display, int32_t intMode) {
437         auto mode = static_cast<HWC2::PowerMode>(intMode);
438         return callDisplayFunction(device, display, &Display::setPowerMode,
439                 mode);
440     }
441 
setVsyncEnabledHook(hwc2_device_t * device,hwc2_display_t display,int32_t intEnabled)442     static int32_t setVsyncEnabledHook(hwc2_device_t* device,
443             hwc2_display_t display, int32_t intEnabled) {
444         auto enabled = static_cast<HWC2::Vsync>(intEnabled);
445         return callDisplayFunction(device, display, &Display::setVsyncEnabled,
446                 enabled);
447     }
448 
449     // Layer functions
450 
451     template <typename T>
452     class LatchedState {
453         public:
LatchedState(Layer & parent,T initialValue)454             LatchedState(Layer& parent, T initialValue)
455               : mParent(parent),
456                 mPendingValue(initialValue),
457                 mValue(initialValue) {}
458 
setPending(T value)459             void setPending(T value) {
460                 if (value == mPendingValue) {
461                     return;
462                 }
463                 if (mPendingValue == mValue) {
464                     mParent.incDirty();
465                 } else if (value == mValue) {
466                     mParent.decDirty();
467                 }
468                 mPendingValue = value;
469             }
470 
getValue()471             T getValue() const { return mValue; }
getPendingValue()472             T getPendingValue() const { return mPendingValue; }
473 
isDirty()474             bool isDirty() const { return mPendingValue != mValue; }
475 
latch()476             void latch() {
477                 if (isDirty()) {
478                     mValue = mPendingValue;
479                     mParent.decDirty();
480                 }
481             }
482 
483         private:
484             Layer& mParent;
485             T mPendingValue;
486             T mValue;
487     };
488 
489     class Layer {
490         public:
491             Layer(Display& display);
492 
493             bool operator==(const Layer& other) { return mId == other.mId; }
494             bool operator!=(const Layer& other) { return !(*this == other); }
495 
getId()496             hwc2_layer_t getId() const { return mId; }
getDisplay()497             Display& getDisplay() const { return mDisplay; }
498 
incDirty()499             void incDirty() { if (mDirtyCount++ == 0) mDisplay.incDirty(); }
decDirty()500             void decDirty() { if (--mDirtyCount == 0) mDisplay.decDirty(); }
isDirty()501             bool isDirty() const { return mDirtyCount > 0; }
502 
503             // HWC2 Layer functions
504             HWC2::Error setBuffer(buffer_handle_t buffer, int32_t acquireFence);
505             HWC2::Error setCursorPosition(int32_t x, int32_t y);
506             HWC2::Error setSurfaceDamage(hwc_region_t damage);
507 
508             // HWC2 Layer state functions
509             HWC2::Error setBlendMode(HWC2::BlendMode mode);
510             HWC2::Error setColor(hwc_color_t color);
511             HWC2::Error setCompositionType(HWC2::Composition type);
512             HWC2::Error setDataspace(android_dataspace_t dataspace);
513             HWC2::Error setDisplayFrame(hwc_rect_t frame);
514             HWC2::Error setPlaneAlpha(float alpha);
515             HWC2::Error setSidebandStream(const native_handle_t* stream);
516             HWC2::Error setSourceCrop(hwc_frect_t crop);
517             HWC2::Error setTransform(HWC2::Transform transform);
518             HWC2::Error setVisibleRegion(hwc_region_t visible);
519             HWC2::Error setZ(uint32_t z);
520 
getCompositionType()521             HWC2::Composition getCompositionType() const {
522                 return mCompositionType.getValue();
523             }
getZ()524             uint32_t getZ() const { return mZ; }
525 
526             void addReleaseFence(int fenceFd);
527             const sp<Fence>& getReleaseFence() const;
528 
setHwc1Id(size_t id)529             void setHwc1Id(size_t id) { mHwc1Id = id; }
getHwc1Id()530             size_t getHwc1Id() const { return mHwc1Id; }
531 
532             void applyState(struct hwc_layer_1& hwc1Layer, bool applyAllState);
533 
534             std::string dump() const;
535 
536         private:
537             void applyCommonState(struct hwc_layer_1& hwc1Layer,
538                     bool applyAllState);
539             void applySolidColorState(struct hwc_layer_1& hwc1Layer,
540                     bool applyAllState);
541             void applySidebandState(struct hwc_layer_1& hwc1Layer,
542                     bool applyAllState);
543             void applyBufferState(struct hwc_layer_1& hwc1Layer);
544             void applyCompositionType(struct hwc_layer_1& hwc1Layer,
545                     bool applyAllState);
546 
547             static std::atomic<hwc2_layer_t> sNextId;
548             const hwc2_layer_t mId;
549             Display& mDisplay;
550             size_t mDirtyCount;
551 
552             FencedBuffer mBuffer;
553             std::vector<hwc_rect_t> mSurfaceDamage;
554 
555             LatchedState<HWC2::BlendMode> mBlendMode;
556             LatchedState<hwc_color_t> mColor;
557             LatchedState<HWC2::Composition> mCompositionType;
558             LatchedState<hwc_rect_t> mDisplayFrame;
559             LatchedState<float> mPlaneAlpha;
560             LatchedState<const native_handle_t*> mSidebandStream;
561             LatchedState<hwc_frect_t> mSourceCrop;
562             LatchedState<HWC2::Transform> mTransform;
563             LatchedState<std::vector<hwc_rect_t>> mVisibleRegion;
564             uint32_t mZ;
565 
566             DeferredFence mReleaseFence;
567 
568             size_t mHwc1Id;
569             bool mHasUnsupportedDataspace;
570             bool mHasUnsupportedPlaneAlpha;
571     };
572 
573     template <typename ...Args>
callLayerFunction(hwc2_device_t * device,hwc2_display_t displayId,hwc2_layer_t layerId,HWC2::Error (Layer::* member)(Args...),Args...args)574     static int32_t callLayerFunction(hwc2_device_t* device,
575             hwc2_display_t displayId, hwc2_layer_t layerId,
576             HWC2::Error (Layer::*member)(Args...), Args... args) {
577         auto result = getAdapter(device)->getLayer(displayId, layerId);
578         auto error = std::get<HWC2::Error>(result);
579         if (error == HWC2::Error::None) {
580             auto layer = std::get<Layer*>(result);
581             error = ((*layer).*member)(std::forward<Args>(args)...);
582         }
583         return static_cast<int32_t>(error);
584     }
585 
586     template <typename MF, MF memFunc, typename ...Args>
layerHook(hwc2_device_t * device,hwc2_display_t displayId,hwc2_layer_t layerId,Args...args)587     static int32_t layerHook(hwc2_device_t* device, hwc2_display_t displayId,
588             hwc2_layer_t layerId, Args... args) {
589         return HWC2On1Adapter::callLayerFunction(device, displayId, layerId,
590                 memFunc, std::forward<Args>(args)...);
591     }
592 
593     // Layer state functions
594 
setLayerBlendModeHook(hwc2_device_t * device,hwc2_display_t display,hwc2_layer_t layer,int32_t intMode)595     static int32_t setLayerBlendModeHook(hwc2_device_t* device,
596             hwc2_display_t display, hwc2_layer_t layer, int32_t intMode) {
597         auto mode = static_cast<HWC2::BlendMode>(intMode);
598         return callLayerFunction(device, display, layer,
599                 &Layer::setBlendMode, mode);
600     }
601 
setLayerCompositionTypeHook(hwc2_device_t * device,hwc2_display_t display,hwc2_layer_t layer,int32_t intType)602     static int32_t setLayerCompositionTypeHook(hwc2_device_t* device,
603             hwc2_display_t display, hwc2_layer_t layer, int32_t intType) {
604         auto type = static_cast<HWC2::Composition>(intType);
605         return callLayerFunction(device, display, layer,
606                 &Layer::setCompositionType, type);
607     }
608 
setLayerDataspaceHook(hwc2_device_t * device,hwc2_display_t display,hwc2_layer_t layer,int32_t intDataspace)609     static int32_t setLayerDataspaceHook(hwc2_device_t* device,
610             hwc2_display_t display, hwc2_layer_t layer, int32_t intDataspace) {
611         auto dataspace = static_cast<android_dataspace_t>(intDataspace);
612         return callLayerFunction(device, display, layer, &Layer::setDataspace,
613                 dataspace);
614     }
615 
setLayerTransformHook(hwc2_device_t * device,hwc2_display_t display,hwc2_layer_t layer,int32_t intTransform)616     static int32_t setLayerTransformHook(hwc2_device_t* device,
617             hwc2_display_t display, hwc2_layer_t layer, int32_t intTransform) {
618         auto transform = static_cast<HWC2::Transform>(intTransform);
619         return callLayerFunction(device, display, layer, &Layer::setTransform,
620                 transform);
621     }
622 
setLayerZOrderHook(hwc2_device_t * device,hwc2_display_t display,hwc2_layer_t layer,uint32_t z)623     static int32_t setLayerZOrderHook(hwc2_device_t* device,
624             hwc2_display_t display, hwc2_layer_t layer, uint32_t z) {
625         return callDisplayFunction(device, display, &Display::updateLayerZ,
626                 layer, z);
627     }
628 
629     // Adapter internals
630 
631     void populateCapabilities();
632     Display* getDisplay(hwc2_display_t id);
633     std::tuple<Layer*, HWC2::Error> getLayer(hwc2_display_t displayId,
634             hwc2_layer_t layerId);
635     void populatePrimary();
636 
637     bool prepareAllDisplays();
638     std::vector<struct hwc_display_contents_1*> mHwc1Contents;
639     HWC2::Error setAllDisplays();
640 
641     void hwc1Invalidate();
642     void hwc1Vsync(int hwc1DisplayId, int64_t timestamp);
643     void hwc1Hotplug(int hwc1DisplayId, int connected);
644 
645     // These are set in the constructor and before any asynchronous events are
646     // possible
647 
648     struct hwc_composer_device_1* const mHwc1Device;
649     const uint8_t mHwc1MinorVersion;
650     bool mHwc1SupportsVirtualDisplays;
651 
652     class Callbacks;
653     const std::unique_ptr<Callbacks> mHwc1Callbacks;
654 
655     std::unordered_set<HWC2::Capability> mCapabilities;
656 
657     // These are only accessed from the main SurfaceFlinger thread (not from
658     // callbacks or dump
659 
660     std::map<hwc2_layer_t, std::shared_ptr<Layer>> mLayers;
661     std::shared_ptr<Display> mHwc1VirtualDisplay;
662 
663     // These are potentially accessed from multiple threads, and are protected
664     // by this mutex. This needs to be recursive, since the HWC1 implementation
665     // can call back into the invalidate callback on the same thread that is
666     // calling prepare.
667     std::recursive_timed_mutex mStateMutex;
668 
669     struct CallbackInfo {
670         hwc2_callback_data_t data;
671         hwc2_function_pointer_t pointer;
672     };
673     std::unordered_map<HWC2::Callback, CallbackInfo> mCallbacks;
674     bool mHasPendingInvalidate;
675     std::vector<std::pair<int, int64_t>> mPendingVsyncs;
676     std::vector<std::pair<int, int>> mPendingHotplugs;
677 
678     std::map<hwc2_display_t, std::shared_ptr<Display>> mDisplays;
679     std::unordered_map<int, hwc2_display_t> mHwc1DisplayMap;
680 };
681 
682 } // namespace android
683 
684 #endif
685