Home | History | Annotate | Download | only in impl
      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 #ifndef ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
     17 #define ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
     18 
     19 #include <android-base/unique_fd.h>
     20 #include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
     21 #include <android/hardware/graphics/composer/2.1/IComposer.h>
     22 #include <composer-hal/2.1/ComposerHal.h>
     23 #include <ui/Fence.h>
     24 #include <ui/GraphicBuffer.h>
     25 #include <utils/StrongPointer.h>
     26 
     27 #include <mutex>
     28 #include <unordered_map>
     29 
     30 using namespace android::frameworks::vr::composer::V1_0;
     31 using namespace android::hardware::graphics::common::V1_0;
     32 using namespace android::hardware::graphics::composer::V2_1;
     33 
     34 using android::hardware::hidl_handle;
     35 using android::hardware::hidl_string;
     36 using android::hardware::hidl_vec;
     37 using android::hardware::Return;
     38 using android::hardware::Void;
     39 
     40 namespace android {
     41 
     42 class Fence;
     43 
     44 namespace dvr {
     45 
     46 class VrComposerClient;
     47 
     48 using android::hardware::graphics::common::V1_0::PixelFormat;
     49 using android::hardware::graphics::composer::V2_1::hal::ComposerHal;
     50 
     51 class 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 
     59     Layer id;
     60     sp<GraphicBuffer> buffer;
     61     sp<Fence> fence;
     62     Recti display_frame;
     63     Rectf crop;
     64     BlendMode blend_mode;
     65     float alpha;
     66     uint32_t type;
     67     uint32_t app_id;
     68     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;
     76   };
     77 
     78   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;
     84     int32_t display_width;
     85     int32_t display_height;
     86     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;
     92     std::vector<ComposerLayer> layers;
     93   };
     94 
     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.
    101     virtual base::unique_fd OnNewFrame(const Frame& frame) = 0;
    102   };
    103 
    104   virtual ~ComposerView() {}
    105 
    106   virtual void ForceDisplaysRefresh() = 0;
    107   virtual void RegisterObserver(Observer* observer) = 0;
    108   virtual void UnregisterObserver(Observer* observer) = 0;
    109 };
    110 
    111 struct HwcLayer {
    112   using Composition =
    113       hardware::graphics::composer::V2_1::IComposerClient::Composition;
    114 
    115   HwcLayer(Layer new_id) {
    116     info.id = new_id;
    117   }
    118 
    119   void dumpDebugInfo(std::string* result) const;
    120 
    121   Composition composition_type;
    122   ComposerView::ComposerLayer info;
    123   IVrComposerClient::BufferMetadata buffer_metadata;
    124 };
    125 
    126 class HwcDisplay {
    127  public:
    128   HwcDisplay(int32_t width, int32_t height);
    129   ~HwcDisplay();
    130 
    131   int32_t width() const { return width_; }
    132   int32_t height() const { return height_; }
    133 
    134   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);
    139   void SetClientTargetMetadata(
    140       const IVrComposerClient::BufferMetadata& metadata);
    141 
    142   void GetChangedCompositionTypes(
    143       std::vector<Layer>* layer_ids,
    144       std::vector<IComposerClient::Composition>* composition);
    145 
    146   Error GetFrame(std::vector<ComposerView::ComposerLayer>* out_frame);
    147 
    148   std::vector<Layer> UpdateLastFrameAndGetLastFrameLayers();
    149 
    150   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 
    168   void dumpDebugInfo(std::string* result) const;
    169 
    170  private:
    171   // The client target buffer and the associated fence.
    172   sp<GraphicBuffer> buffer_;
    173   IVrComposerClient::BufferMetadata buffer_metadata_;
    174   sp<Fence> fence_;
    175 
    176   // List of currently active layers.
    177   std::vector<HwcLayer> layers_;
    178 
    179   std::vector<Layer> last_frame_layers_ids_;
    180 
    181   // Layer ID generator.
    182   uint64_t layer_ids_ = 1;
    183 
    184   int32_t width_;
    185   int32_t height_;
    186 
    187   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 
    194   HwcDisplay(const HwcDisplay&) = delete;
    195   void operator=(const HwcDisplay&) = delete;
    196 };
    197 
    198 class VrHwc : public IComposer, public ComposerHal, public ComposerView {
    199  public:
    200   VrHwc();
    201   ~VrHwc() override;
    202 
    203   Error setLayerInfo(Display display, Layer layer, uint32_t type,
    204                      uint32_t appId);
    205   Error setClientTargetMetadata(
    206       Display display, const IVrComposerClient::BufferMetadata& metadata);
    207   Error setLayerBufferMetadata(
    208       Display display, Layer layer,
    209       const IVrComposerClient::BufferMetadata& metadata);
    210 
    211   // ComposerHal
    212   bool hasCapability(hwc2_capability_t capability) override;
    213 
    214   std::string dumpDebugInfo() override { return {}; }
    215   void registerEventCallback(EventCallback* callback) override;
    216   void unregisterEventCallback() override;
    217 
    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:
    297   void ForceDisplaysRefresh() override;
    298   void RegisterObserver(Observer* observer) override;
    299   void UnregisterObserver(Observer* observer) override;
    300 
    301  private:
    302   HwcDisplay* FindDisplay(Display display);
    303 
    304   wp<VrComposerClient> client_;
    305 
    306   // Guard access to internal state from binder threads.
    307   std::mutex mutex_;
    308 
    309   std::unordered_map<Display, std::unique_ptr<HwcDisplay>> displays_;
    310   Display display_count_ = 2;
    311 
    312   EventCallback* event_callback_ = nullptr;
    313   Observer* observer_ = nullptr;
    314 
    315   VrHwc(const VrHwc&) = delete;
    316   void operator=(const VrHwc&) = delete;
    317 };
    318 
    319 }  // namespace dvr
    320 }  // namespace android
    321 
    322 #endif  // ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
    323