blob: d5d5f55e2ebd407ee3f1b7de27e8f9b2aa751111 [file] [log] [blame]
Daniel Nicoara51a0a562016-12-08 16:48:20 -05001/*
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 */
Daniel Nicoara4251e922017-04-13 15:19:15 -040016#ifndef ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
17#define ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
Daniel Nicoara51a0a562016-12-08 16:48:20 -050018
Daniel Nicoarae13ec182017-02-22 12:22:41 -050019#include <android-base/unique_fd.h>
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040020#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
Daniel Nicoara51a0a562016-12-08 16:48:20 -050021#include <android/hardware/graphics/composer/2.1/IComposer.h>
Chia-I Wud15d2d22018-01-29 13:59:18 -080022#include <composer-hal/2.1/ComposerHal.h>
Daniel Nicoara1c457102017-02-07 17:27:25 -050023#include <ui/Fence.h>
24#include <ui/GraphicBuffer.h>
Daniel Nicoara51a0a562016-12-08 16:48:20 -050025#include <utils/StrongPointer.h>
26
27#include <mutex>
Albert Chaulk2b3b6662017-03-06 13:24:51 -050028#include <unordered_map>
Daniel Nicoara51a0a562016-12-08 16:48:20 -050029
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -040030using namespace android::frameworks::vr::composer::V1_0;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050031using namespace android::hardware::graphics::common::V1_0;
32using namespace android::hardware::graphics::composer::V2_1;
33
34using android::hardware::hidl_handle;
35using android::hardware::hidl_string;
36using android::hardware::hidl_vec;
37using android::hardware::Return;
38using android::hardware::Void;
39
40namespace android {
41
42class Fence;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050043
44namespace dvr {
45
46class VrComposerClient;
47
48using android::hardware::graphics::common::V1_0::PixelFormat;
Chia-I Wud15d2d22018-01-29 13:59:18 -080049using android::hardware::graphics::composer::V2_1::hal::ComposerHal;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050050
51class ComposerView {
52 public:
53 struct ComposerLayer {
54 using Recti = hardware::graphics::composer::V2_1::IComposerClient::Rect;
55 using Rectf = hardware::graphics::composer::V2_1::IComposerClient::FRect;
56 using BlendMode =
57 hardware::graphics::composer::V2_1::IComposerClient::BlendMode;
58
Daniel Nicoarae13ec182017-02-22 12:22:41 -050059 Layer id;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050060 sp<GraphicBuffer> buffer;
61 sp<Fence> fence;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080062 Recti display_frame;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050063 Rectf crop;
64 BlendMode blend_mode;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080065 float alpha;
66 uint32_t type;
67 uint32_t app_id;
Albert Chaulk730c89a2017-04-10 13:53:32 -040068 uint32_t z_order;
69 int32_t cursor_x;
70 int32_t cursor_y;
71 IComposerClient::Color color;
72 int32_t dataspace;
73 int32_t transform;
74 std::vector<hwc_rect_t> visible_regions;
75 std::vector<hwc_rect_t> damaged_regions;
Daniel Nicoara51a0a562016-12-08 16:48:20 -050076 };
77
Albert Chaulk2b3b6662017-03-06 13:24:51 -050078 struct Frame {
79 Display display_id;
80 // This is set to true to notify the upper layer that the display is
81 // being removed, or left false in the case of a normal frame. The upper
82 // layer tracks display IDs and will handle new ones showing up.
83 bool removed = false;
Daniel Nicoarad330a622017-03-28 11:48:42 -040084 int32_t display_width;
85 int32_t display_height;
Albert Chaulk730c89a2017-04-10 13:53:32 -040086 Config active_config;
87 ColorMode color_mode;
88 IComposerClient::PowerMode power_mode;
89 IComposerClient::Vsync vsync_enabled;
90 float color_transform[16];
91 int32_t color_transform_hint;
Albert Chaulk2b3b6662017-03-06 13:24:51 -050092 std::vector<ComposerLayer> layers;
93 };
Daniel Nicoara51a0a562016-12-08 16:48:20 -050094
95 class Observer {
96 public:
97 virtual ~Observer() {}
98
99 // Returns a list of layers that need to be shown together. Layers are
100 // returned in z-order, with the lowest layer first.
Daniel Nicoarae13ec182017-02-22 12:22:41 -0500101 virtual base::unique_fd OnNewFrame(const Frame& frame) = 0;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500102 };
103
104 virtual ~ComposerView() {}
105
Daniel Nicoara8fc98222017-08-09 18:10:44 -0400106 virtual void ForceDisplaysRefresh() = 0;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500107 virtual void RegisterObserver(Observer* observer) = 0;
108 virtual void UnregisterObserver(Observer* observer) = 0;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500109};
110
111struct HwcLayer {
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800112 using Composition =
113 hardware::graphics::composer::V2_1::IComposerClient::Composition;
114
Daniel Nicoarae13ec182017-02-22 12:22:41 -0500115 HwcLayer(Layer new_id) {
116 info.id = new_id;
117 }
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500118
rongliu784ad682018-02-07 17:03:38 -0800119 void dumpDebugInfo(std::string* result) const;
120
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800121 Composition composition_type;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800122 ComposerView::ComposerLayer info;
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400123 IVrComposerClient::BufferMetadata buffer_metadata;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500124};
125
126class HwcDisplay {
127 public:
Daniel Nicoarad330a622017-03-28 11:48:42 -0400128 HwcDisplay(int32_t width, int32_t height);
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500129 ~HwcDisplay();
130
Daniel Nicoarad330a622017-03-28 11:48:42 -0400131 int32_t width() const { return width_; }
132 int32_t height() const { return height_; }
133
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500134 HwcLayer* CreateLayer();
135 bool DestroyLayer(Layer id);
136 HwcLayer* GetLayer(Layer id);
137
138 bool SetClientTarget(const native_handle_t* handle, base::unique_fd fence);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400139 void SetClientTargetMetadata(
140 const IVrComposerClient::BufferMetadata& metadata);
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500141
142 void GetChangedCompositionTypes(
143 std::vector<Layer>* layer_ids,
144 std::vector<IComposerClient::Composition>* composition);
145
Daniel Nicoarae7916f82017-02-02 11:18:02 -0500146 Error GetFrame(std::vector<ComposerView::ComposerLayer>* out_frame);
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500147
Daniel Nicoarae13ec182017-02-22 12:22:41 -0500148 std::vector<Layer> UpdateLastFrameAndGetLastFrameLayers();
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500149
Albert Chaulk730c89a2017-04-10 13:53:32 -0400150 Config active_config() const { return active_config_; }
151 void set_active_config(Config config) { active_config_ = config; }
152
153 ColorMode color_mode() const { return color_mode_; }
154 void set_color_mode(ColorMode mode) { color_mode_ = mode; }
155
156 IComposerClient::PowerMode power_mode() const { return power_mode_; }
157 void set_power_mode(IComposerClient::PowerMode mode) { power_mode_ = mode; }
158
159 IComposerClient::Vsync vsync_enabled() const { return vsync_enabled_; }
160 void set_vsync_enabled(IComposerClient::Vsync vsync) {
161 vsync_enabled_ = vsync;
162 }
163
164 const float* color_transform() const { return color_transform_; }
165 int32_t color_transform_hint() const { return color_transform_hint_; }
166 void SetColorTransform(const float* matrix, int32_t hint);
167
rongliu784ad682018-02-07 17:03:38 -0800168 void dumpDebugInfo(std::string* result) const;
169
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500170 private:
171 // The client target buffer and the associated fence.
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500172 sp<GraphicBuffer> buffer_;
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400173 IVrComposerClient::BufferMetadata buffer_metadata_;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500174 sp<Fence> fence_;
175
176 // List of currently active layers.
177 std::vector<HwcLayer> layers_;
178
Daniel Nicoarae13ec182017-02-22 12:22:41 -0500179 std::vector<Layer> last_frame_layers_ids_;
180
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500181 // Layer ID generator.
182 uint64_t layer_ids_ = 1;
183
Daniel Nicoarad330a622017-03-28 11:48:42 -0400184 int32_t width_;
185 int32_t height_;
186
Albert Chaulk730c89a2017-04-10 13:53:32 -0400187 Config active_config_;
188 ColorMode color_mode_;
189 IComposerClient::PowerMode power_mode_;
190 IComposerClient::Vsync vsync_enabled_;
191 float color_transform_[16];
192 int32_t color_transform_hint_;
193
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500194 HwcDisplay(const HwcDisplay&) = delete;
195 void operator=(const HwcDisplay&) = delete;
196};
197
Chia-I Wud15d2d22018-01-29 13:59:18 -0800198class VrHwc : public IComposer, public ComposerHal, public ComposerView {
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500199 public:
200 VrHwc();
201 ~VrHwc() override;
202
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500203 Error setLayerInfo(Display display, Layer layer, uint32_t type,
204 uint32_t appId);
Daniel Nicoara1f42e3a2017-04-10 13:27:32 -0400205 Error setClientTargetMetadata(
206 Display display, const IVrComposerClient::BufferMetadata& metadata);
207 Error setLayerBufferMetadata(
208 Display display, Layer layer,
209 const IVrComposerClient::BufferMetadata& metadata);
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500210
Chia-I Wud15d2d22018-01-29 13:59:18 -0800211 // ComposerHal
Chia-I Wu41b98d42017-12-11 11:04:36 -0800212 bool hasCapability(hwc2_capability_t capability) override;
213
Chia-I Wu513476a2018-01-31 09:30:01 -0800214 std::string dumpDebugInfo() override { return {}; }
215 void registerEventCallback(EventCallback* callback) override;
216 void unregisterEventCallback() override {}
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500217
218 uint32_t getMaxVirtualDisplayCount() override;
219 Error createVirtualDisplay(uint32_t width, uint32_t height,
220 PixelFormat* format, Display* outDisplay) override;
221 Error destroyVirtualDisplay(Display display) override;
222
223 Error createLayer(Display display, Layer* outLayer) override;
224 Error destroyLayer(Display display, Layer layer) override;
225
226 Error getActiveConfig(Display display, Config* outConfig) override;
227 Error getClientTargetSupport(Display display,
228 uint32_t width, uint32_t height,
229 PixelFormat format, Dataspace dataspace) override;
230 Error getColorModes(Display display, hidl_vec<ColorMode>* outModes) override;
231 Error getDisplayAttribute(Display display, Config config,
232 IComposerClient::Attribute attribute, int32_t* outValue) override;
233 Error getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) override;
234 Error getDisplayName(Display display, hidl_string* outName) override;
235 Error getDisplayType(Display display,
236 IComposerClient::DisplayType* outType) override;
237 Error getDozeSupport(Display display, bool* outSupport) override;
238 Error getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
239 float* outMaxLuminance, float* outMaxAverageLuminance,
240 float* outMinLuminance) override;
241
242 Error setActiveConfig(Display display, Config config) override;
243 Error setColorMode(Display display, ColorMode mode) override;
244 Error setPowerMode(Display display, IComposerClient::PowerMode mode) override;
245 Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override;
246
247 Error setColorTransform(Display display, const float* matrix,
248 int32_t hint) override;
249 Error setClientTarget(Display display, buffer_handle_t target,
250 int32_t acquireFence, int32_t dataspace,
251 const std::vector<hwc_rect_t>& damage) override;
252 Error setOutputBuffer(Display display, buffer_handle_t buffer,
253 int32_t releaseFence) override;
254 Error validateDisplay(Display display,
255 std::vector<Layer>* outChangedLayers,
256 std::vector<IComposerClient::Composition>* outCompositionTypes,
257 uint32_t* outDisplayRequestMask,
258 std::vector<Layer>* outRequestedLayers,
259 std::vector<uint32_t>* outRequestMasks) override;
260 Error acceptDisplayChanges(Display display) override;
261 Error presentDisplay(Display display, int32_t* outPresentFence,
262 std::vector<Layer>* outLayers,
263 std::vector<int32_t>* outReleaseFences) override;
264
265 Error setLayerCursorPosition(Display display, Layer layer,
266 int32_t x, int32_t y) override;
267 Error setLayerBuffer(Display display, Layer layer,
268 buffer_handle_t buffer, int32_t acquireFence) override;
269 Error setLayerSurfaceDamage(Display display, Layer layer,
270 const std::vector<hwc_rect_t>& damage) override;
271 Error setLayerBlendMode(Display display, Layer layer, int32_t mode) override;
272 Error setLayerColor(Display display, Layer layer,
273 IComposerClient::Color color) override;
274 Error setLayerCompositionType(Display display, Layer layer,
275 int32_t type) override;
276 Error setLayerDataspace(Display display, Layer layer,
277 int32_t dataspace) override;
278 Error setLayerDisplayFrame(Display display, Layer layer,
279 const hwc_rect_t& frame) override;
280 Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
281 Error setLayerSidebandStream(Display display, Layer layer,
282 buffer_handle_t stream) override;
283 Error setLayerSourceCrop(Display display, Layer layer,
284 const hwc_frect_t& crop) override;
285 Error setLayerTransform(Display display, Layer layer,
286 int32_t transform) override;
287 Error setLayerVisibleRegion(Display display, Layer layer,
288 const std::vector<hwc_rect_t>& visible) override;
289 Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
290
291 // IComposer:
292 Return<void> getCapabilities(getCapabilities_cb hidl_cb) override;
293 Return<void> dumpDebugInfo(dumpDebugInfo_cb hidl_cb) override;
294 Return<void> createClient(createClient_cb hidl_cb) override;
295
296 // ComposerView:
Daniel Nicoara8fc98222017-08-09 18:10:44 -0400297 void ForceDisplaysRefresh() override;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500298 void RegisterObserver(Observer* observer) override;
299 void UnregisterObserver(Observer* observer) override;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500300
301 private:
Albert Chaulk2b3b6662017-03-06 13:24:51 -0500302 HwcDisplay* FindDisplay(Display display);
303
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500304 wp<VrComposerClient> client_;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500305
306 // Guard access to internal state from binder threads.
307 std::mutex mutex_;
308
Albert Chaulk2b3b6662017-03-06 13:24:51 -0500309 std::unordered_map<Display, std::unique_ptr<HwcDisplay>> displays_;
Daniel Nicoaraa6cc4222017-03-15 18:50:16 -0400310 Display display_count_ = 2;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500311
Chia-I Wu513476a2018-01-31 09:30:01 -0800312 EventCallback* event_callback_ = nullptr;
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500313 Observer* observer_ = nullptr;
314
315 VrHwc(const VrHwc&) = delete;
316 void operator=(const VrHwc&) = delete;
317};
318
Daniel Nicoara51a0a562016-12-08 16:48:20 -0500319} // namespace dvr
320} // namespace android
321
Daniel Nicoara4251e922017-04-13 15:19:15 -0400322#endif // ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H