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