• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 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_COMPOSER_HAL_H
18 #define ANDROID_SF_COMPOSER_HAL_H
19 
20 #include <memory>
21 #include <string>
22 #include <unordered_map>
23 #include <utility>
24 #include <vector>
25 
26 #include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
27 #include <android/hardware/graphics/composer/2.1/IComposer.h>
28 #include <utils/StrongPointer.h>
29 #include <IComposerCommandBuffer.h>
30 
31 namespace android {
32 
33 namespace Hwc2 {
34 
35 using android::frameworks::vr::composer::V1_0::IVrComposerClient;
36 
37 using android::hardware::graphics::common::V1_0::ColorMode;
38 using android::hardware::graphics::common::V1_0::ColorTransform;
39 using android::hardware::graphics::common::V1_0::Dataspace;
40 using android::hardware::graphics::common::V1_0::Hdr;
41 using android::hardware::graphics::common::V1_0::PixelFormat;
42 using android::hardware::graphics::common::V1_0::Transform;
43 
44 using android::hardware::graphics::composer::V2_1::IComposer;
45 using android::hardware::graphics::composer::V2_1::IComposerCallback;
46 using android::hardware::graphics::composer::V2_1::IComposerClient;
47 using android::hardware::graphics::composer::V2_1::Error;
48 using android::hardware::graphics::composer::V2_1::Display;
49 using android::hardware::graphics::composer::V2_1::Layer;
50 using android::hardware::graphics::composer::V2_1::Config;
51 
52 using android::hardware::graphics::composer::V2_1::CommandWriterBase;
53 using android::hardware::graphics::composer::V2_1::CommandReaderBase;
54 
55 using android::hardware::kSynchronizedReadWrite;
56 using android::hardware::MessageQueue;
57 using android::hardware::MQDescriptorSync;
58 using android::hardware::hidl_vec;
59 using android::hardware::hidl_handle;
60 
61 class CommandReader : public CommandReaderBase {
62 public:
63     ~CommandReader();
64 
65     // Parse and execute commands from the command queue.  The commands are
66     // actually return values from the server and will be saved in ReturnData.
67     Error parse();
68 
69     // Get and clear saved errors.
70     struct CommandError {
71         uint32_t location;
72         Error error;
73     };
74     std::vector<CommandError> takeErrors();
75 
76     bool hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
77             uint32_t* outNumLayerRequestMasks) const;
78 
79     // Get and clear saved changed composition types.
80     void takeChangedCompositionTypes(Display display,
81             std::vector<Layer>* outLayers,
82             std::vector<IComposerClient::Composition>* outTypes);
83 
84     // Get and clear saved display requests.
85     void takeDisplayRequests(Display display,
86         uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
87         std::vector<uint32_t>* outLayerRequestMasks);
88 
89     // Get and clear saved release fences.
90     void takeReleaseFences(Display display, std::vector<Layer>* outLayers,
91             std::vector<int>* outReleaseFences);
92 
93     // Get and clear saved present fence.
94     void takePresentFence(Display display, int* outPresentFence);
95 
96     // Get what stage succeeded during PresentOrValidate: Present or Validate
97     void takePresentOrValidateStage(Display display, uint32_t * state);
98 
99 private:
100     void resetData();
101 
102     bool parseSelectDisplay(uint16_t length);
103     bool parseSetError(uint16_t length);
104     bool parseSetChangedCompositionTypes(uint16_t length);
105     bool parseSetDisplayRequests(uint16_t length);
106     bool parseSetPresentFence(uint16_t length);
107     bool parseSetReleaseFences(uint16_t length);
108     bool parseSetPresentOrValidateDisplayResult(uint16_t length);
109 
110     struct ReturnData {
111         uint32_t displayRequests = 0;
112 
113         std::vector<Layer> changedLayers;
114         std::vector<IComposerClient::Composition> compositionTypes;
115 
116         std::vector<Layer> requestedLayers;
117         std::vector<uint32_t> requestMasks;
118 
119         int presentFence = -1;
120 
121         std::vector<Layer> releasedLayers;
122         std::vector<int> releaseFences;
123 
124         uint32_t presentOrValidateState;
125     };
126 
127     std::vector<CommandError> mErrors;
128     std::unordered_map<Display, ReturnData> mReturnData;
129 
130     // When SELECT_DISPLAY is parsed, this is updated to point to the
131     // display's return data in mReturnData.  We use it to avoid repeated
132     // map lookups.
133     ReturnData* mCurrentReturnData;
134 };
135 
136 // Composer is a wrapper to IComposer, a proxy to server-side composer.
137 class Composer {
138 public:
139     Composer(bool useVrComposer);
140 
141     std::vector<IComposer::Capability> getCapabilities();
142     std::string dumpDebugInfo();
143 
144     void registerCallback(const sp<IComposerCallback>& callback);
145 
146     // Returns true if the connected composer service is running in a remote
147     // process, false otherwise. This will return false if the service is
148     // configured in passthrough mode, for example.
149     bool isRemote();
150 
151     // Reset all pending commands in the command buffer. Useful if you want to
152     // skip a frame but have already queued some commands.
153     void resetCommands();
154 
155     uint32_t getMaxVirtualDisplayCount();
isUsingVrComposer()156     bool isUsingVrComposer() const { return mIsUsingVrComposer; }
157     Error createVirtualDisplay(uint32_t width, uint32_t height,
158             PixelFormat* format, Display* outDisplay);
159     Error destroyVirtualDisplay(Display display);
160 
161     Error acceptDisplayChanges(Display display);
162 
163     Error createLayer(Display display, Layer* outLayer);
164     Error destroyLayer(Display display, Layer layer);
165 
166     Error getActiveConfig(Display display, Config* outConfig);
167     Error getChangedCompositionTypes(Display display,
168             std::vector<Layer>* outLayers,
169             std::vector<IComposerClient::Composition>* outTypes);
170     Error getColorModes(Display display, std::vector<ColorMode>* outModes);
171     Error getDisplayAttribute(Display display, Config config,
172             IComposerClient::Attribute attribute, int32_t* outValue);
173     Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs);
174     Error getDisplayName(Display display, std::string* outName);
175 
176     Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
177             std::vector<Layer>* outLayers,
178             std::vector<uint32_t>* outLayerRequestMasks);
179 
180     Error getDisplayType(Display display,
181             IComposerClient::DisplayType* outType);
182     Error getDozeSupport(Display display, bool* outSupport);
183     Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
184             float* outMaxLuminance, float* outMaxAverageLuminance,
185             float* outMinLuminance);
186 
187     Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
188             std::vector<int>* outReleaseFences);
189 
190     Error presentDisplay(Display display, int* outPresentFence);
191 
192     Error setActiveConfig(Display display, Config config);
193 
194     /*
195      * The composer caches client targets internally.  When target is nullptr,
196      * the composer uses slot to look up the client target from its cache.
197      * When target is not nullptr, the cache is updated with the new target.
198      */
199     Error setClientTarget(Display display, uint32_t slot,
200             const sp<GraphicBuffer>& target,
201             int acquireFence, Dataspace dataspace,
202             const std::vector<IComposerClient::Rect>& damage);
203     Error setColorMode(Display display, ColorMode mode);
204     Error setColorTransform(Display display, const float* matrix,
205             ColorTransform hint);
206     Error setOutputBuffer(Display display, const native_handle_t* buffer,
207             int releaseFence);
208     Error setPowerMode(Display display, IComposerClient::PowerMode mode);
209     Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled);
210 
211     Error setClientTargetSlotCount(Display display);
212 
213     Error validateDisplay(Display display, uint32_t* outNumTypes,
214             uint32_t* outNumRequests);
215 
216     Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
217                                    uint32_t* outNumRequests,
218                                    int* outPresentFence,
219                                    uint32_t* state);
220 
221     Error setCursorPosition(Display display, Layer layer,
222             int32_t x, int32_t y);
223     /* see setClientTarget for the purpose of slot */
224     Error setLayerBuffer(Display display, Layer layer, uint32_t slot,
225             const sp<GraphicBuffer>& buffer, int acquireFence);
226     Error setLayerSurfaceDamage(Display display, Layer layer,
227             const std::vector<IComposerClient::Rect>& damage);
228     Error setLayerBlendMode(Display display, Layer layer,
229             IComposerClient::BlendMode mode);
230     Error setLayerColor(Display display, Layer layer,
231             const IComposerClient::Color& color);
232     Error setLayerCompositionType(Display display, Layer layer,
233             IComposerClient::Composition type);
234     Error setLayerDataspace(Display display, Layer layer,
235             Dataspace dataspace);
236     Error setLayerDisplayFrame(Display display, Layer layer,
237             const IComposerClient::Rect& frame);
238     Error setLayerPlaneAlpha(Display display, Layer layer,
239             float alpha);
240     Error setLayerSidebandStream(Display display, Layer layer,
241             const native_handle_t* stream);
242     Error setLayerSourceCrop(Display display, Layer layer,
243             const IComposerClient::FRect& crop);
244     Error setLayerTransform(Display display, Layer layer,
245             Transform transform);
246     Error setLayerVisibleRegion(Display display, Layer layer,
247             const std::vector<IComposerClient::Rect>& visible);
248     Error setLayerZOrder(Display display, Layer layer, uint32_t z);
249     Error setLayerInfo(Display display, Layer layer, uint32_t type,
250                        uint32_t appId);
251 private:
252     class CommandWriter : public CommandWriterBase {
253     public:
254         CommandWriter(uint32_t initialMaxSize);
255         ~CommandWriter() override;
256 
257         void setLayerInfo(uint32_t type, uint32_t appId);
258         void setClientTargetMetadata(
259                 const IVrComposerClient::BufferMetadata& metadata);
260         void setLayerBufferMetadata(
261                 const IVrComposerClient::BufferMetadata& metadata);
262 
263     private:
264         void writeBufferMetadata(
265                 const IVrComposerClient::BufferMetadata& metadata);
266     };
267 
268     // Many public functions above simply write a command into the command
269     // queue to batch the calls.  validateDisplay and presentDisplay will call
270     // this function to execute the command queue.
271     Error execute();
272 
273     sp<IComposer> mComposer;
274     sp<IComposerClient> mClient;
275 
276     // 64KiB minus a small space for metadata such as read/write pointers
277     static constexpr size_t kWriterInitialSize =
278         64 * 1024 / sizeof(uint32_t) - 16;
279     CommandWriter mWriter;
280     CommandReader mReader;
281 
282     // When true, the we attach to the vr_hwcomposer service instead of the
283     // hwcomposer. This allows us to redirect surfaces to 3d surfaces in vr.
284     const bool mIsUsingVrComposer;
285 };
286 
287 } // namespace Hwc2
288 
289 } // namespace android
290 
291 #endif // ANDROID_SF_COMPOSER_HAL_H
292