Home | History | Annotate | Download | only in drm_hwcomposer
      1 /*
      2  * Copyright (C) 2015 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_DRM_DISPLAY_COMPOSITION_H_
     18 #define ANDROID_DRM_DISPLAY_COMPOSITION_H_
     19 
     20 #include "drmcrtc.h"
     21 #include "drmhwcomposer.h"
     22 #include "drmplane.h"
     23 
     24 #include <sstream>
     25 #include <vector>
     26 
     27 #include <hardware/hardware.h>
     28 #include <hardware/hwcomposer.h>
     29 
     30 namespace android {
     31 
     32 class Importer;
     33 class Planner;
     34 class SquashState;
     35 
     36 enum DrmCompositionType {
     37   DRM_COMPOSITION_TYPE_EMPTY,
     38   DRM_COMPOSITION_TYPE_FRAME,
     39   DRM_COMPOSITION_TYPE_DPMS,
     40   DRM_COMPOSITION_TYPE_MODESET,
     41 };
     42 
     43 struct DrmCompositionDisplayLayersMap {
     44   int display;
     45   bool geometry_changed = true;
     46   std::vector<DrmHwcLayer> layers;
     47 
     48   DrmCompositionDisplayLayersMap() = default;
     49   DrmCompositionDisplayLayersMap(DrmCompositionDisplayLayersMap &&rhs) =
     50       default;
     51 };
     52 
     53 struct DrmCompositionRegion {
     54   std::vector<size_t> source_layers;
     55 };
     56 
     57 class DrmCompositionPlane {
     58  public:
     59   enum class Type : int32_t {
     60     kDisable,
     61     kLayer,
     62   };
     63 
     64   DrmCompositionPlane() = default;
     65   DrmCompositionPlane(DrmCompositionPlane &&rhs) = default;
     66   DrmCompositionPlane &operator=(DrmCompositionPlane &&other) = default;
     67   DrmCompositionPlane(Type type, DrmPlane *plane, DrmCrtc *crtc)
     68       : type_(type), plane_(plane), crtc_(crtc) {
     69   }
     70   DrmCompositionPlane(Type type, DrmPlane *plane, DrmCrtc *crtc,
     71                       size_t source_layer)
     72       : type_(type),
     73         plane_(plane),
     74         crtc_(crtc),
     75         source_layers_(1, source_layer) {
     76   }
     77 
     78   Type type() const {
     79     return type_;
     80   }
     81 
     82   DrmPlane *plane() const {
     83     return plane_;
     84   }
     85   void set_plane(DrmPlane *plane) {
     86     plane_ = plane;
     87   }
     88 
     89   DrmCrtc *crtc() const {
     90     return crtc_;
     91   }
     92 
     93   std::vector<size_t> &source_layers() {
     94     return source_layers_;
     95   }
     96 
     97   const std::vector<size_t> &source_layers() const {
     98     return source_layers_;
     99   }
    100 
    101  private:
    102   Type type_ = Type::kDisable;
    103   DrmPlane *plane_ = NULL;
    104   DrmCrtc *crtc_ = NULL;
    105   std::vector<size_t> source_layers_;
    106 };
    107 
    108 class DrmDisplayComposition {
    109  public:
    110   DrmDisplayComposition() = default;
    111   DrmDisplayComposition(const DrmDisplayComposition &) = delete;
    112   ~DrmDisplayComposition();
    113 
    114   int Init(DrmDevice *drm, DrmCrtc *crtc, Importer *importer, Planner *planner,
    115            uint64_t frame_no);
    116 
    117   int SetLayers(DrmHwcLayer *layers, size_t num_layers, bool geometry_changed);
    118   int AddPlaneComposition(DrmCompositionPlane plane);
    119   int AddPlaneDisable(DrmPlane *plane);
    120   int SetDpmsMode(uint32_t dpms_mode);
    121   int SetDisplayMode(const DrmMode &display_mode);
    122 
    123   int Plan(std::vector<DrmPlane *> *primary_planes,
    124            std::vector<DrmPlane *> *overlay_planes);
    125 
    126   std::vector<DrmHwcLayer> &layers() {
    127     return layers_;
    128   }
    129 
    130   std::vector<DrmCompositionPlane> &composition_planes() {
    131     return composition_planes_;
    132   }
    133 
    134   bool geometry_changed() const {
    135     return geometry_changed_;
    136   }
    137 
    138   uint64_t frame_no() const {
    139     return frame_no_;
    140   }
    141 
    142   DrmCompositionType type() const {
    143     return type_;
    144   }
    145 
    146   uint32_t dpms_mode() const {
    147     return dpms_mode_;
    148   }
    149 
    150   const DrmMode &display_mode() const {
    151     return display_mode_;
    152   }
    153 
    154   DrmCrtc *crtc() const {
    155     return crtc_;
    156   }
    157 
    158   Importer *importer() const {
    159     return importer_;
    160   }
    161 
    162   Planner *planner() const {
    163     return planner_;
    164   }
    165 
    166   int take_out_fence() {
    167     return out_fence_.Release();
    168   }
    169 
    170   void set_out_fence(int out_fence) {
    171     out_fence_.Set(out_fence);
    172   }
    173 
    174   void Dump(std::ostringstream *out) const;
    175 
    176  private:
    177   bool validate_composition_type(DrmCompositionType desired);
    178 
    179   DrmDevice *drm_ = NULL;
    180   DrmCrtc *crtc_ = NULL;
    181   Importer *importer_ = NULL;
    182   Planner *planner_ = NULL;
    183 
    184   DrmCompositionType type_ = DRM_COMPOSITION_TYPE_EMPTY;
    185   uint32_t dpms_mode_ = DRM_MODE_DPMS_ON;
    186   DrmMode display_mode_;
    187 
    188   UniqueFd out_fence_ = -1;
    189 
    190   bool geometry_changed_;
    191   std::vector<DrmHwcLayer> layers_;
    192   std::vector<DrmCompositionPlane> composition_planes_;
    193 
    194   uint64_t frame_no_ = 0;
    195 };
    196 }  // namespace android
    197 
    198 #endif  // ANDROID_DRM_DISPLAY_COMPOSITION_H_
    199