Home | History | Annotate | Download | only in DisplayHardware
      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();
    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