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 <private/dvr/vsync_service.h>
     24 #include <ui/Fence.h>
     25 #include <ui/GraphicBuffer.h>
     26 #include <utils/StrongPointer.h>
     27 
     28 #include <mutex>
     29 #include <unordered_map>
     30 
     31 using namespace android::frameworks::vr::composer::V1_0;
     32 using namespace android::hardware::graphics::common::V1_0;
     33 using namespace android::hardware::graphics::composer::V2_1;
     34 
     35 using android::hardware::hidl_handle;
     36 using android::hardware::hidl_string;
     37 using android::hardware::hidl_vec;
     38 using android::hardware::Return;
     39 using android::hardware::Void;
     40 
     41 namespace android {
     42 
     43 class Fence;
     44 
     45 namespace dvr {
     46 
     47 class VrComposerClient;
     48 
     49 using android::hardware::graphics::common::V1_0::PixelFormat;
     50 using android::hardware::graphics::composer::V2_1::hal::ComposerHal;
     51 
     52 class ComposerView {
     53  public:
     54   struct ComposerLayer {
     55     using Recti = hardware::graphics::composer::V2_1::IComposerClient::Rect;
     56     using Rectf = hardware::graphics::composer::V2_1::IComposerClient::FRect;
     57     using BlendMode =
     58         hardware::graphics::composer::V2_1::IComposerClient::BlendMode;
     59 
     60     Layer id;
     61     sp<GraphicBuffer> buffer;
     62     sp<Fence> fence;
     63     Recti display_frame;
     64     Rectf crop;
     65     BlendMode blend_mode;
     66     float alpha;
     67     uint32_t type;
     68     uint32_t app_id;
     69     uint32_t z_order;
     70     int32_t cursor_x;
     71     int32_t cursor_y;
     72     IComposerClient::Color color;
     73     int32_t dataspace;
     74     int32_t transform;
     75     std::vector<hwc_rect_t> visible_regions;
     76     std::vector<hwc_rect_t> damaged_regions;
     77   };
     78 
     79   struct Frame {
     80     Display display_id;
     81     // This is set to true to notify the upper layer that the display is
     82     // being removed, or left false in the case of a normal frame. The upper
     83     // layer tracks display IDs and will handle new ones showing up.
     84     bool removed = false;
     85     int32_t display_width;
     86     int32_t display_height;
     87     Config active_config;
     88     ColorMode color_mode;
     89     IComposerClient::PowerMode power_mode;
     90     IComposerClient::Vsync vsync_enabled;
     91     float color_transform[16];
     92     int32_t color_transform_hint;
     93     std::vector<ComposerLayer> layers;
     94   };
     95 
     96   class Observer {
     97    public:
     98     virtual ~Observer() {}
     99 
    100     // Returns a list of layers that need to be shown together. Layers are
    101     // returned in z-order, with the lowest layer first.
    102     virtual base::unique_fd OnNewFrame(const Frame& frame) = 0;
    103   };
    104 
    105   virtual ~ComposerView() {}
    106 
    107   virtual void ForceDisplaysRefresh() = 0;
    108   virtual void RegisterObserver(Observer* observer) = 0;
    109   virtual void UnregisterObserver(Observer* observer) = 0;
    110 };
    111 
    112 struct HwcLayer {
    113   using Composition =
    114       hardware::graphics::composer::V2_1::IComposerClient::Composition;
    115 
    116   explicit HwcLayer(Layer new_id) { info.id = new_id; }
    117 
    118   void dumpDebugInfo(std::string* result) const;
    119 
    120   Composition composition_type;
    121   ComposerView::ComposerLayer info;
    122   IVrComposerClient::BufferMetadata buffer_metadata;
    123 };
    124 
    125 class HwcDisplay {
    126  public:
    127   HwcDisplay(int32_t width, int32_t height);
    128   ~HwcDisplay();
    129 
    130   int32_t width() const { return width_; }
    131   int32_t height() const { return height_; }
    132 
    133   HwcLayer* CreateLayer();
    134   bool DestroyLayer(Layer id);
    135   HwcLayer* GetLayer(Layer id);
    136 
    137   bool SetClientTarget(const native_handle_t* handle, base::unique_fd fence);
    138   void SetClientTargetMetadata(
    139       const IVrComposerClient::BufferMetadata& metadata);
    140 
    141   void GetChangedCompositionTypes(
    142       std::vector<Layer>* layer_ids,
    143       std::vector<IComposerClient::Composition>* composition);
    144 
    145   Error GetFrame(std::vector<ComposerView::ComposerLayer>* out_frame);
    146 
    147   std::vector<Layer> UpdateLastFrameAndGetLastFrameLayers();
    148 
    149   Config active_config() const { return active_config_; }
    150   void set_active_config(Config config) { active_config_ = config; }
    151 
    152   ColorMode color_mode() const { return color_mode_; }
    153   void set_color_mode(ColorMode mode) { color_mode_ = mode; }
    154 
    155   IComposerClient::PowerMode power_mode() const { return power_mode_; }
    156   void set_power_mode(IComposerClient::PowerMode mode) { power_mode_ = mode; }
    157 
    158   bool vsync_enabled() const { return vsync_enabled_; }
    159   void set_vsync_enabled(bool vsync) {vsync_enabled_ = vsync;}
    160 
    161   const float* color_transform() const { return color_transform_; }
    162   int32_t color_transform_hint() const { return color_transform_hint_; }
    163   void SetColorTransform(const float* matrix, int32_t hint);
    164 
    165   void dumpDebugInfo(std::string* result) const;
    166 
    167  private:
    168   // The client target buffer and the associated fence.
    169   sp<GraphicBuffer> buffer_;
    170   IVrComposerClient::BufferMetadata buffer_metadata_;
    171   sp<Fence> fence_;
    172 
    173   // List of currently active layers.
    174   std::vector<HwcLayer> layers_;
    175 
    176   std::vector<Layer> last_frame_layers_ids_;
    177 
    178   // Layer ID generator.
    179   uint64_t layer_ids_ = 1;
    180 
    181   int32_t width_;
    182   int32_t height_;
    183 
    184   Config active_config_;
    185   ColorMode color_mode_;
    186   IComposerClient::PowerMode power_mode_;
    187   bool vsync_enabled_ = false;
    188   float color_transform_[16];
    189   int32_t color_transform_hint_;
    190 
    191   HwcDisplay(const HwcDisplay&) = delete;
    192   void operator=(const HwcDisplay&) = delete;
    193 };
    194 
    195 class VrHwc : public IComposer, public ComposerHal, public ComposerView {
    196  public:
    197   VrHwc();
    198   ~VrHwc() override;
    199 
    200   Error setLayerInfo(Display display, Layer layer, uint32_t type,
    201                      uint32_t appId);
    202   Error setClientTargetMetadata(
    203       Display display, const IVrComposerClient::BufferMetadata& metadata);
    204   Error setLayerBufferMetadata(
    205       Display display, Layer layer,
    206       const IVrComposerClient::BufferMetadata& metadata);
    207 
    208   // ComposerHal
    209   bool hasCapability(hwc2_capability_t capability) override;
    210 
    211   std::string dumpDebugInfo() override { return {}; }
    212   void registerEventCallback(EventCallback* callback) override;
    213   void unregisterEventCallback() override;
    214 
    215   uint32_t getMaxVirtualDisplayCount() override;
    216   Error createVirtualDisplay(uint32_t width, uint32_t height,
    217       PixelFormat* format, Display* outDisplay) override;
    218   Error destroyVirtualDisplay(Display display) override;
    219 
    220   Error createLayer(Display display, Layer* outLayer) override;
    221   Error destroyLayer(Display display, Layer layer) override;
    222 
    223   Error getActiveConfig(Display display, Config* outConfig) override;
    224   Error getClientTargetSupport(Display display,
    225           uint32_t width, uint32_t height,
    226           PixelFormat format, Dataspace dataspace) override;
    227   Error getColorModes(Display display, hidl_vec<ColorMode>* outModes) override;
    228   Error getDisplayAttribute(Display display, Config config,
    229           IComposerClient::Attribute attribute, int32_t* outValue) override;
    230   Error getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) override;
    231   Error getDisplayName(Display display, hidl_string* outName) override;
    232   Error getDisplayType(Display display,
    233           IComposerClient::DisplayType* outType) override;
    234   Error getDozeSupport(Display display, bool* outSupport) override;
    235   Error getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes,
    236           float* outMaxLuminance, float* outMaxAverageLuminance,
    237           float* outMinLuminance) override;
    238 
    239   Error setActiveConfig(Display display, Config config) override;
    240   Error setColorMode(Display display, ColorMode mode) override;
    241   Error setPowerMode(Display display, IComposerClient::PowerMode mode) override;
    242   Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override;
    243 
    244   Error setColorTransform(Display display, const float* matrix,
    245           int32_t hint) override;
    246   Error setClientTarget(Display display, buffer_handle_t target,
    247           int32_t acquireFence, int32_t dataspace,
    248           const std::vector<hwc_rect_t>& damage) override;
    249   Error setOutputBuffer(Display display, buffer_handle_t buffer,
    250           int32_t releaseFence) override;
    251   Error validateDisplay(Display display,
    252           std::vector<Layer>* outChangedLayers,
    253           std::vector<IComposerClient::Composition>* outCompositionTypes,
    254           uint32_t* outDisplayRequestMask,
    255           std::vector<Layer>* outRequestedLayers,
    256           std::vector<uint32_t>* outRequestMasks) override;
    257   Error acceptDisplayChanges(Display display) override;
    258   Error presentDisplay(Display display, int32_t* outPresentFence,
    259           std::vector<Layer>* outLayers,
    260           std::vector<int32_t>* outReleaseFences) override;
    261 
    262   Error setLayerCursorPosition(Display display, Layer layer,
    263           int32_t x, int32_t y) override;
    264   Error setLayerBuffer(Display display, Layer layer,
    265           buffer_handle_t buffer, int32_t acquireFence) override;
    266   Error setLayerSurfaceDamage(Display display, Layer layer,
    267           const std::vector<hwc_rect_t>& damage) override;
    268   Error setLayerBlendMode(Display display, Layer layer, int32_t mode) override;
    269   Error setLayerColor(Display display, Layer layer,
    270           IComposerClient::Color color) override;
    271   Error setLayerCompositionType(Display display, Layer layer,
    272           int32_t type) override;
    273   Error setLayerDataspace(Display display, Layer layer,
    274           int32_t dataspace) override;
    275   Error setLayerDisplayFrame(Display display, Layer layer,
    276           const hwc_rect_t& frame) override;
    277   Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
    278   Error setLayerSidebandStream(Display display, Layer layer,
    279           buffer_handle_t stream) override;
    280   Error setLayerSourceCrop(Display display, Layer layer,
    281           const hwc_frect_t& crop) override;
    282   Error setLayerTransform(Display display, Layer layer,
    283           int32_t transform) override;
    284   Error setLayerVisibleRegion(Display display, Layer layer,
    285           const std::vector<hwc_rect_t>& visible) override;
    286   Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
    287 
    288   // IComposer:
    289   Return<void> getCapabilities(getCapabilities_cb hidl_cb) override;
    290   Return<void> dumpDebugInfo(dumpDebugInfo_cb hidl_cb) override;
    291   Return<void> createClient(createClient_cb hidl_cb) override;
    292 
    293   // ComposerView:
    294   void ForceDisplaysRefresh() override;
    295   void RegisterObserver(Observer* observer) override;
    296   void UnregisterObserver(Observer* observer) override;
    297 
    298  private:
    299   class VsyncCallback : public BnVsyncCallback {
    300    public:
    301     status_t onVsync(int64_t vsync_timestamp) override;
    302     void SetEventCallback(EventCallback* callback);
    303    private:
    304     std::mutex mutex_;
    305     EventCallback* callback_;
    306   };
    307 
    308   HwcDisplay* FindDisplay(Display display);
    309 
    310   // Re-evaluate whether or not we should start making onVsync() callbacks to
    311   // the client. We need enableCallback(true) to have been called, and
    312   // setVsyncEnabled() to have been called for the primary display. The caller
    313   // must have mutex_ locked already.
    314   void UpdateVsyncCallbackEnabledLocked();
    315 
    316   wp<VrComposerClient> client_;
    317 
    318   // Guard access to internal state from binder threads.
    319   std::mutex mutex_;
    320 
    321   std::unordered_map<Display, std::unique_ptr<HwcDisplay>> displays_;
    322   Display display_count_ = 2;
    323 
    324   EventCallback* event_callback_ = nullptr;
    325   Observer* observer_ = nullptr;
    326 
    327   sp<VsyncCallback> vsync_callback_;
    328 
    329   VrHwc(const VrHwc&) = delete;
    330   void operator=(const VrHwc&) = delete;
    331 };
    332 
    333 }  // namespace dvr
    334 }  // namespace android
    335 
    336 #endif  // ANDROID_DVR_HARDWARE_COMPOSER_IMPL_VR_HWC_H
    337