• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 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 #pragma once
18 
19 #include <aidl/android/hardware/graphics/composer3/CommandResultPayload.h>
20 #include <aidl/android/hardware/graphics/composer3/IComposerClient.h>
21 #include <inttypes.h>
22 #include <string.h>
23 
24 #include <algorithm>
25 #include <limits>
26 #include <memory>
27 #include <vector>
28 
29 #include "Util.h"
30 
31 namespace aidl::android::hardware::graphics::composer3::impl {
32 
33 class ComposerServiceWriter {
34   public:
ComposerServiceWriter()35     ComposerServiceWriter() { reset(); }
36 
~ComposerServiceWriter()37     virtual ~ComposerServiceWriter() { reset(); }
38 
reset()39     void reset() { mCommandsResults.clear(); }
40 
setError(int32_t index,int32_t errorCode)41     void setError(int32_t index, int32_t errorCode) {
42         CommandError error;
43         error.commandIndex = index;
44         error.errorCode = errorCode;
45         mCommandsResults.emplace_back(std::move(error));
46     }
47 
setPresentOrValidateResult(int64_t display,PresentOrValidate::Result result)48     void setPresentOrValidateResult(int64_t display, PresentOrValidate::Result result) {
49         PresentOrValidate presentOrValidate;
50         presentOrValidate.display = display;
51         presentOrValidate.result = result;
52         mCommandsResults.emplace_back(std::move(presentOrValidate));
53     }
54 
setChangedCompositionTypes(int64_t display,const std::vector<int64_t> & layers,const std::vector<Composition> & types)55     void setChangedCompositionTypes(int64_t display, const std::vector<int64_t>& layers,
56                                     const std::vector<Composition>& types) {
57         ChangedCompositionTypes changedCompositionTypes;
58         changedCompositionTypes.display = display;
59         changedCompositionTypes.layers.reserve(layers.size());
60         for (int i = 0; i < layers.size(); i++) {
61             auto layer = ChangedCompositionLayer{.layer = layers[i], .composition = types[i]};
62             changedCompositionTypes.layers.emplace_back(std::move(layer));
63         }
64         mCommandsResults.emplace_back(std::move(changedCompositionTypes));
65     }
66 
setDisplayRequests(int64_t display,int32_t displayRequestMask,const std::vector<int64_t> & layers,const std::vector<int32_t> & layerRequestMasks)67     void setDisplayRequests(int64_t display, int32_t displayRequestMask,
68                             const std::vector<int64_t>& layers,
69                             const std::vector<int32_t>& layerRequestMasks) {
70         DisplayRequest displayRequest;
71         displayRequest.display = display;
72         displayRequest.mask = displayRequestMask;
73         displayRequest.layerRequests.reserve(layers.size());
74         for (int i = 0; i < layers.size(); i++) {
75             auto layerRequest =
76                     DisplayRequest::LayerRequest{.layer = layers[i], .mask = layerRequestMasks[i]};
77             displayRequest.layerRequests.emplace_back(std::move(layerRequest));
78         }
79         mCommandsResults.emplace_back(std::move(displayRequest));
80     }
81 
setPresentFence(int64_t display,::ndk::ScopedFileDescriptor presentFence)82     void setPresentFence(int64_t display, ::ndk::ScopedFileDescriptor presentFence) {
83         if (presentFence.get() >= 0) {
84             PresentFence presentFenceCommand;
85             presentFenceCommand.fence = std::move(presentFence);
86             presentFenceCommand.display = display;
87             mCommandsResults.emplace_back(std::move(presentFenceCommand));
88         } else {
89             LOG(WARNING) << __func__ << ": invalid present fence " << presentFence.get();
90         }
91     }
92 
setReleaseFences(int64_t display,const std::vector<int64_t> & layers,std::vector<::ndk::ScopedFileDescriptor> releaseFences)93     void setReleaseFences(int64_t display, const std::vector<int64_t>& layers,
94                           std::vector<::ndk::ScopedFileDescriptor> releaseFences) {
95         ReleaseFences releaseFencesCommand;
96         releaseFencesCommand.display = display;
97         for (int i = 0; i < layers.size(); i++) {
98             if (releaseFences[i].get() >= 0) {
99                 ReleaseFences::Layer layer;
100                 layer.layer = layers[i];
101                 layer.fence = std::move(releaseFences[i]);
102                 releaseFencesCommand.layers.emplace_back(std::move(layer));
103             } else {
104                 LOG(WARNING) << __func__ << ": invalid release fence " << releaseFences[i].get();
105             }
106         }
107         mCommandsResults.emplace_back(std::move(releaseFencesCommand));
108     }
109 
setClientTargetProperty(int64_t display,const ClientTargetProperty & clientTargetProperty,float brightness,const DimmingStage & dimmingStage)110     void setClientTargetProperty(int64_t display, const ClientTargetProperty& clientTargetProperty,
111                                  float brightness, const DimmingStage& dimmingStage) {
112         ClientTargetPropertyWithBrightness clientTargetPropertyWithBrightness;
113         clientTargetPropertyWithBrightness.display = display;
114         clientTargetPropertyWithBrightness.clientTargetProperty = clientTargetProperty;
115         clientTargetPropertyWithBrightness.brightness = brightness;
116         clientTargetPropertyWithBrightness.dimmingStage = dimmingStage;
117         mCommandsResults.emplace_back(std::move(clientTargetPropertyWithBrightness));
118     }
119 
getPendingCommandResults()120     std::vector<CommandResultPayload> getPendingCommandResults() {
121         return std::move(mCommandsResults);
122     }
123 
124   private:
125     std::vector<CommandResultPayload> mCommandsResults;
126 };
127 
128 }  // namespace aidl::android::hardware::graphics::composer3::impl