blob: 77675fbce2ba7a5e9f1bf69c52a6f576d92461f0 [file] [log] [blame]
Chia-I Wuaab99f52016-10-05 12:59:58 +08001/*
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
Chia-I Wucd8d7f02016-11-16 11:02:31 +080020#include <memory>
Chia-I Wuaab99f52016-10-05 12:59:58 +080021#include <string>
Chia-I Wucd8d7f02016-11-16 11:02:31 +080022#include <unordered_map>
23#include <utility>
Chia-I Wuaab99f52016-10-05 12:59:58 +080024#include <vector>
25
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040026#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
Chia-I Wuaab99f52016-10-05 12:59:58 +080027#include <android/hardware/graphics/composer/2.1/IComposer.h>
Courtney Goeltzenleuchter87551222018-01-16 14:00:09 -080028#include <composer-command-buffer/2.1/ComposerCommandBuffer.h>
Lloyd Piqued0094aa2017-12-20 16:43:28 -080029#include <ui/GraphicBuffer.h>
Chia-I Wuaab99f52016-10-05 12:59:58 +080030#include <utils/StrongPointer.h>
31
32namespace android {
33
34namespace Hwc2 {
35
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040036using android::frameworks::vr::composer::V1_0::IVrComposerClient;
37
Chia-I Wu5901fda2016-11-17 10:26:37 +080038using android::hardware::graphics::common::V1_0::ColorMode;
39using android::hardware::graphics::common::V1_0::ColorTransform;
40using android::hardware::graphics::common::V1_0::Dataspace;
41using android::hardware::graphics::common::V1_0::Hdr;
42using android::hardware::graphics::common::V1_0::PixelFormat;
43using android::hardware::graphics::common::V1_0::Transform;
Chia-I Wuaab99f52016-10-05 12:59:58 +080044
45using android::hardware::graphics::composer::V2_1::IComposer;
46using android::hardware::graphics::composer::V2_1::IComposerCallback;
Chia-I Wucd8d7f02016-11-16 11:02:31 +080047using android::hardware::graphics::composer::V2_1::IComposerClient;
Chia-I Wuaab99f52016-10-05 12:59:58 +080048using android::hardware::graphics::composer::V2_1::Error;
49using android::hardware::graphics::composer::V2_1::Display;
50using android::hardware::graphics::composer::V2_1::Layer;
51using android::hardware::graphics::composer::V2_1::Config;
52
Daniel Nicoara3c9cbd42017-01-17 12:04:06 -050053using android::hardware::graphics::composer::V2_1::CommandWriterBase;
Chia-I Wucd8d7f02016-11-16 11:02:31 +080054using android::hardware::graphics::composer::V2_1::CommandReaderBase;
55
56using android::hardware::kSynchronizedReadWrite;
57using android::hardware::MessageQueue;
58using android::hardware::MQDescriptorSync;
59using android::hardware::hidl_vec;
60using android::hardware::hidl_handle;
61
Lloyd Piquea822d522017-12-20 16:42:57 -080062class Composer {
63public:
64 virtual ~Composer() = 0;
65
66 virtual std::vector<IComposer::Capability> getCapabilities() = 0;
67 virtual std::string dumpDebugInfo() = 0;
68
69 virtual void registerCallback(const sp<IComposerCallback>& callback) = 0;
70
71 // Returns true if the connected composer service is running in a remote
72 // process, false otherwise. This will return false if the service is
73 // configured in passthrough mode, for example.
74 virtual bool isRemote() = 0;
75
76 // Reset all pending commands in the command buffer. Useful if you want to
77 // skip a frame but have already queued some commands.
78 virtual void resetCommands() = 0;
79
80 // Explicitly flush all pending commands in the command buffer.
81 virtual Error executeCommands() = 0;
82
83 virtual uint32_t getMaxVirtualDisplayCount() = 0;
84 virtual bool isUsingVrComposer() const = 0;
85 virtual Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
86 Display* outDisplay) = 0;
87 virtual Error destroyVirtualDisplay(Display display) = 0;
88
89 virtual Error acceptDisplayChanges(Display display) = 0;
90
91 virtual Error createLayer(Display display, Layer* outLayer) = 0;
92 virtual Error destroyLayer(Display display, Layer layer) = 0;
93
94 virtual Error getActiveConfig(Display display, Config* outConfig) = 0;
95 virtual Error getChangedCompositionTypes(
96 Display display, std::vector<Layer>* outLayers,
97 std::vector<IComposerClient::Composition>* outTypes) = 0;
98 virtual Error getColorModes(Display display, std::vector<ColorMode>* outModes) = 0;
99 virtual Error getDisplayAttribute(Display display, Config config,
100 IComposerClient::Attribute attribute, int32_t* outValue) = 0;
101 virtual Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs) = 0;
102 virtual Error getDisplayName(Display display, std::string* outName) = 0;
103
104 virtual Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
105 std::vector<Layer>* outLayers,
106 std::vector<uint32_t>* outLayerRequestMasks) = 0;
107
108 virtual Error getDisplayType(Display display, IComposerClient::DisplayType* outType) = 0;
109 virtual Error getDozeSupport(Display display, bool* outSupport) = 0;
110 virtual Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes,
111 float* outMaxLuminance, float* outMaxAverageLuminance,
112 float* outMinLuminance) = 0;
113
114 virtual Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
115 std::vector<int>* outReleaseFences) = 0;
116
117 virtual Error presentDisplay(Display display, int* outPresentFence) = 0;
118
119 virtual Error setActiveConfig(Display display, Config config) = 0;
120
121 /*
122 * The composer caches client targets internally. When target is nullptr,
123 * the composer uses slot to look up the client target from its cache.
124 * When target is not nullptr, the cache is updated with the new target.
125 */
126 virtual Error setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
127 int acquireFence, Dataspace dataspace,
128 const std::vector<IComposerClient::Rect>& damage) = 0;
129 virtual Error setColorMode(Display display, ColorMode mode) = 0;
130 virtual Error setColorTransform(Display display, const float* matrix, ColorTransform hint) = 0;
131 virtual Error setOutputBuffer(Display display, const native_handle_t* buffer,
132 int releaseFence) = 0;
133 virtual Error setPowerMode(Display display, IComposerClient::PowerMode mode) = 0;
134 virtual Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) = 0;
135
136 virtual Error setClientTargetSlotCount(Display display) = 0;
137
138 virtual Error validateDisplay(Display display, uint32_t* outNumTypes,
139 uint32_t* outNumRequests) = 0;
140
141 virtual Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes,
142 uint32_t* outNumRequests, int* outPresentFence,
143 uint32_t* state) = 0;
144
145 virtual Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) = 0;
146 /* see setClientTarget for the purpose of slot */
147 virtual Error setLayerBuffer(Display display, Layer layer, uint32_t slot,
148 const sp<GraphicBuffer>& buffer, int acquireFence) = 0;
149 virtual Error setLayerSurfaceDamage(Display display, Layer layer,
150 const std::vector<IComposerClient::Rect>& damage) = 0;
151 virtual Error setLayerBlendMode(Display display, Layer layer,
152 IComposerClient::BlendMode mode) = 0;
153 virtual Error setLayerColor(Display display, Layer layer,
154 const IComposerClient::Color& color) = 0;
155 virtual Error setLayerCompositionType(Display display, Layer layer,
156 IComposerClient::Composition type) = 0;
157 virtual Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) = 0;
158 virtual Error setLayerDisplayFrame(Display display, Layer layer,
159 const IComposerClient::Rect& frame) = 0;
160 virtual Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) = 0;
161 virtual Error setLayerSidebandStream(Display display, Layer layer,
162 const native_handle_t* stream) = 0;
163 virtual Error setLayerSourceCrop(Display display, Layer layer,
164 const IComposerClient::FRect& crop) = 0;
165 virtual Error setLayerTransform(Display display, Layer layer, Transform transform) = 0;
166 virtual Error setLayerVisibleRegion(Display display, Layer layer,
167 const std::vector<IComposerClient::Rect>& visible) = 0;
168 virtual Error setLayerZOrder(Display display, Layer layer, uint32_t z) = 0;
169 virtual Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) = 0;
170};
171
172namespace impl {
173
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800174class CommandReader : public CommandReaderBase {
175public:
176 ~CommandReader();
177
178 // Parse and execute commands from the command queue. The commands are
179 // actually return values from the server and will be saved in ReturnData.
180 Error parse();
181
182 // Get and clear saved errors.
183 struct CommandError {
184 uint32_t location;
185 Error error;
186 };
187 std::vector<CommandError> takeErrors();
188
Chia-I Wu67e376d2016-12-19 11:36:22 +0800189 bool hasChanges(Display display, uint32_t* outNumChangedCompositionTypes,
190 uint32_t* outNumLayerRequestMasks) const;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800191
192 // Get and clear saved changed composition types.
193 void takeChangedCompositionTypes(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800194 std::vector<Layer>* outLayers,
195 std::vector<IComposerClient::Composition>* outTypes);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800196
197 // Get and clear saved display requests.
198 void takeDisplayRequests(Display display,
Chia-I Wu67e376d2016-12-19 11:36:22 +0800199 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers,
200 std::vector<uint32_t>* outLayerRequestMasks);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800201
202 // Get and clear saved release fences.
Chia-I Wu67e376d2016-12-19 11:36:22 +0800203 void takeReleaseFences(Display display, std::vector<Layer>* outLayers,
204 std::vector<int>* outReleaseFences);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800205
206 // Get and clear saved present fence.
Chia-I Wu67e376d2016-12-19 11:36:22 +0800207 void takePresentFence(Display display, int* outPresentFence);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800208
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700209 // Get what stage succeeded during PresentOrValidate: Present or Validate
210 void takePresentOrValidateStage(Display display, uint32_t * state);
211
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800212private:
213 void resetData();
214
215 bool parseSelectDisplay(uint16_t length);
216 bool parseSetError(uint16_t length);
217 bool parseSetChangedCompositionTypes(uint16_t length);
218 bool parseSetDisplayRequests(uint16_t length);
219 bool parseSetPresentFence(uint16_t length);
220 bool parseSetReleaseFences(uint16_t length);
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700221 bool parseSetPresentOrValidateDisplayResult(uint16_t length);
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800222
223 struct ReturnData {
224 uint32_t displayRequests = 0;
225
226 std::vector<Layer> changedLayers;
227 std::vector<IComposerClient::Composition> compositionTypes;
228
229 std::vector<Layer> requestedLayers;
230 std::vector<uint32_t> requestMasks;
231
232 int presentFence = -1;
233
234 std::vector<Layer> releasedLayers;
235 std::vector<int> releaseFences;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700236
237 uint32_t presentOrValidateState;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800238 };
239
240 std::vector<CommandError> mErrors;
241 std::unordered_map<Display, ReturnData> mReturnData;
242
243 // When SELECT_DISPLAY is parsed, this is updated to point to the
244 // display's return data in mReturnData. We use it to avoid repeated
245 // map lookups.
246 ReturnData* mCurrentReturnData;
247};
248
Chia-I Wuaab99f52016-10-05 12:59:58 +0800249// Composer is a wrapper to IComposer, a proxy to server-side composer.
Lloyd Piquea822d522017-12-20 16:42:57 -0800250class Composer final : public Hwc2::Composer {
Chia-I Wuaab99f52016-10-05 12:59:58 +0800251public:
Kalle Raitaa099a242017-01-11 11:17:29 -0800252 Composer(const std::string& serviceName);
Lloyd Piquea822d522017-12-20 16:42:57 -0800253 ~Composer() override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800254
Lloyd Piquea822d522017-12-20 16:42:57 -0800255 std::vector<IComposer::Capability> getCapabilities() override;
256 std::string dumpDebugInfo() override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800257
Lloyd Piquea822d522017-12-20 16:42:57 -0800258 void registerCallback(const sp<IComposerCallback>& callback) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800259
Steven Thomas94e35b92017-07-26 18:48:28 -0700260 // Returns true if the connected composer service is running in a remote
261 // process, false otherwise. This will return false if the service is
262 // configured in passthrough mode, for example.
Lloyd Piquea822d522017-12-20 16:42:57 -0800263 bool isRemote() override;
Steven Thomas94e35b92017-07-26 18:48:28 -0700264
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700265 // Reset all pending commands in the command buffer. Useful if you want to
266 // skip a frame but have already queued some commands.
Lloyd Piquea822d522017-12-20 16:42:57 -0800267 void resetCommands() override;
Steven Thomas0af4b9f2017-04-26 14:34:01 -0700268
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700269 // Explicitly flush all pending commands in the command buffer.
Lloyd Piquea822d522017-12-20 16:42:57 -0800270 Error executeCommands() override;
Chia-I Wuae5a6b82017-10-10 09:09:22 -0700271
Lloyd Piquea822d522017-12-20 16:42:57 -0800272 uint32_t getMaxVirtualDisplayCount() override;
273 bool isUsingVrComposer() const override { return mIsUsingVrComposer; }
274 Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format,
275 Display* outDisplay) override;
276 Error destroyVirtualDisplay(Display display) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800277
Lloyd Piquea822d522017-12-20 16:42:57 -0800278 Error acceptDisplayChanges(Display display) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800279
Lloyd Piquea822d522017-12-20 16:42:57 -0800280 Error createLayer(Display display, Layer* outLayer) override;
281 Error destroyLayer(Display display, Layer layer) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800282
Lloyd Piquea822d522017-12-20 16:42:57 -0800283 Error getActiveConfig(Display display, Config* outConfig) override;
284 Error getChangedCompositionTypes(Display display, std::vector<Layer>* outLayers,
285 std::vector<IComposerClient::Composition>* outTypes) override;
286 Error getColorModes(Display display, std::vector<ColorMode>* outModes) override;
287 Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute,
288 int32_t* outValue) override;
Chia-I Wu67e376d2016-12-19 11:36:22 +0800289 Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs);
Lloyd Piquea822d522017-12-20 16:42:57 -0800290 Error getDisplayName(Display display, std::string* outName) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800291
Chia-I Wu67e376d2016-12-19 11:36:22 +0800292 Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
Lloyd Piquea822d522017-12-20 16:42:57 -0800293 std::vector<Layer>* outLayers,
294 std::vector<uint32_t>* outLayerRequestMasks) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800295
Lloyd Piquea822d522017-12-20 16:42:57 -0800296 Error getDisplayType(Display display, IComposerClient::DisplayType* outType) override;
297 Error getDozeSupport(Display display, bool* outSupport) override;
298 Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
299 float* outMaxAverageLuminance, float* outMinLuminance) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800300
Chia-I Wu67e376d2016-12-19 11:36:22 +0800301 Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
Lloyd Piquea822d522017-12-20 16:42:57 -0800302 std::vector<int>* outReleaseFences) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800303
Lloyd Piquea822d522017-12-20 16:42:57 -0800304 Error presentDisplay(Display display, int* outPresentFence) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800305
Lloyd Piquea822d522017-12-20 16:42:57 -0800306 Error setActiveConfig(Display display, Config config) override;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800307
308 /*
309 * The composer caches client targets internally. When target is nullptr,
310 * the composer uses slot to look up the client target from its cache.
311 * When target is not nullptr, the cache is updated with the new target.
312 */
Lloyd Piquea822d522017-12-20 16:42:57 -0800313 Error setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
314 int acquireFence, Dataspace dataspace,
315 const std::vector<IComposerClient::Rect>& damage) override;
316 Error setColorMode(Display display, ColorMode mode) override;
317 Error setColorTransform(Display display, const float* matrix, ColorTransform hint) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800318 Error setOutputBuffer(Display display, const native_handle_t* buffer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800319 int releaseFence) override;
320 Error setPowerMode(Display display, IComposerClient::PowerMode mode) override;
321 Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800322
Lloyd Piquea822d522017-12-20 16:42:57 -0800323 Error setClientTargetSlotCount(Display display) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800324
Chia-I Wu67e376d2016-12-19 11:36:22 +0800325 Error validateDisplay(Display display, uint32_t* outNumTypes,
Lloyd Piquea822d522017-12-20 16:42:57 -0800326 uint32_t* outNumRequests) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800327
Lloyd Piquea822d522017-12-20 16:42:57 -0800328 Error presentOrValidateDisplay(Display display, uint32_t* outNumTypes, uint32_t* outNumRequests,
329 int* outPresentFence, uint32_t* state) override;
Fabien Sanglard249c0ae2017-06-19 19:22:36 -0700330
Lloyd Piquea822d522017-12-20 16:42:57 -0800331 Error setCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override;
Chia-I Wu06d63de2017-01-04 14:58:51 +0800332 /* see setClientTarget for the purpose of slot */
333 Error setLayerBuffer(Display display, Layer layer, uint32_t slot,
Lloyd Piquea822d522017-12-20 16:42:57 -0800334 const sp<GraphicBuffer>& buffer, int acquireFence) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800335 Error setLayerSurfaceDamage(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800336 const std::vector<IComposerClient::Rect>& damage) override;
337 Error setLayerBlendMode(Display display, Layer layer, IComposerClient::BlendMode mode) override;
338 Error setLayerColor(Display display, Layer layer, const IComposerClient::Color& color) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800339 Error setLayerCompositionType(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800340 IComposerClient::Composition type) override;
341 Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800342 Error setLayerDisplayFrame(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800343 const IComposerClient::Rect& frame) override;
344 Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800345 Error setLayerSidebandStream(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800346 const native_handle_t* stream) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800347 Error setLayerSourceCrop(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800348 const IComposerClient::FRect& crop) override;
349 Error setLayerTransform(Display display, Layer layer, Transform transform) override;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800350 Error setLayerVisibleRegion(Display display, Layer layer,
Lloyd Piquea822d522017-12-20 16:42:57 -0800351 const std::vector<IComposerClient::Rect>& visible) override;
352 Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
353 Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) override;
354
Chia-I Wuaab99f52016-10-05 12:59:58 +0800355private:
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500356 class CommandWriter : public CommandWriterBase {
357 public:
358 CommandWriter(uint32_t initialMaxSize);
359 ~CommandWriter() override;
360
361 void setLayerInfo(uint32_t type, uint32_t appId);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400362 void setClientTargetMetadata(
363 const IVrComposerClient::BufferMetadata& metadata);
364 void setLayerBufferMetadata(
365 const IVrComposerClient::BufferMetadata& metadata);
366
367 private:
368 void writeBufferMetadata(
369 const IVrComposerClient::BufferMetadata& metadata);
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500370 };
371
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800372 // Many public functions above simply write a command into the command
373 // queue to batch the calls. validateDisplay and presentDisplay will call
374 // this function to execute the command queue.
375 Error execute();
376
377 sp<IComposer> mComposer;
378 sp<IComposerClient> mClient;
379
380 // 64KiB minus a small space for metadata such as read/write pointers
381 static constexpr size_t kWriterInitialSize =
382 64 * 1024 / sizeof(uint32_t) - 16;
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500383 CommandWriter mWriter;
Chia-I Wucd8d7f02016-11-16 11:02:31 +0800384 CommandReader mReader;
Daniel Nicoara2f5f8a52016-12-20 16:11:58 -0500385
Hendrik Wagenaar87670ff2017-02-01 12:10:46 -0800386 // When true, the we attach to the vr_hwcomposer service instead of the
387 // hwcomposer. This allows us to redirect surfaces to 3d surfaces in vr.
388 const bool mIsUsingVrComposer;
Chia-I Wuaab99f52016-10-05 12:59:58 +0800389};
390
Lloyd Piquea822d522017-12-20 16:42:57 -0800391} // namespace impl
392
Chia-I Wuaab99f52016-10-05 12:59:58 +0800393} // namespace Hwc2
394
395} // namespace android
396
397#endif // ANDROID_SF_COMPOSER_HAL_H