OSDN Git Service

drm_hwcomposer: use in-class member initializers for AutoEGLDisplayImage
[android-x86/external-drm_hwcomposer.git] / drmdisplaycomposition.h
index 2ae696f..57e8521 100644 (file)
 #define ANDROID_DRM_DISPLAY_COMPOSITION_H_
 
 #include "drm_hwcomposer.h"
+#include "drmcrtc.h"
 #include "drmplane.h"
+#include "glworker.h"
 #include "importer.h"
 
 #include <vector>
 
+#include <hardware/gralloc.h>
 #include <hardware/hardware.h>
 #include <hardware/hwcomposer.h>
 
@@ -32,52 +35,93 @@ enum DrmCompositionType {
   DRM_COMPOSITION_TYPE_EMPTY,
   DRM_COMPOSITION_TYPE_FRAME,
   DRM_COMPOSITION_TYPE_DPMS,
+  DRM_COMPOSITION_TYPE_MODESET,
 };
 
-typedef struct DrmCompositionLayer {
-  DrmCompositionLayer();
-  ~DrmCompositionLayer();
+struct DrmCompositionLayer {
+  DrmCrtc *crtc = NULL;
+  DrmPlane *plane = NULL;
 
-  hwc_layer_1_t layer;
-  hwc_drm_bo_t bo;
-  DrmCrtc *crtc;
-  DrmPlane *plane;
-} DrmCompositionLayer_t;
-typedef std::vector<DrmCompositionLayer_t> DrmCompositionLayerVector_t;
+  buffer_handle_t sf_handle = NULL;
+  DrmHwcBuffer buffer;
+  DrmHwcNativeHandle handle;
+  DrmHwcTransform transform = DrmHwcTransform::kIdentity;
+  DrmHwcBlending blending = DrmHwcBlending::kNone;
+  uint8_t alpha = 0xff;
+  DrmHwcRect<float> source_crop;
+  DrmHwcRect<int> display_frame;
+  std::vector<DrmHwcRect<int>> source_damage;
+
+  UniqueFd acquire_fence;
+
+  DrmCompositionLayer() = default;
+  DrmCompositionLayer(DrmCrtc *crtc, DrmHwcLayer &&l);
+  DrmCompositionLayer(DrmCompositionLayer &&l) = default;
+
+  DrmCompositionLayer &operator=(DrmCompositionLayer &&l) = default;
+
+  buffer_handle_t get_usable_handle() const {
+    return handle.get() != NULL ? handle.get() : sf_handle;
+  }
+};
 
 class DrmDisplayComposition {
  public:
   DrmDisplayComposition();
   ~DrmDisplayComposition();
 
-  int Init(DrmResources *drm, Importer *importer);
+  int Init(DrmResources *drm, DrmCrtc *crtc, Importer *importer,
+           uint64_t frame_no);
 
   DrmCompositionType type() const;
 
-  int AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo, DrmCrtc *crtc,
-               DrmPlane *plane);
-  int AddDpmsMode(uint32_t dpms_mode);
+  int SetLayers(DrmHwcLayer *layers, size_t num_layers,
+                std::vector<DrmPlane *> *primary_planes,
+                std::vector<DrmPlane *> *overlay_planes);
+  int AddPlaneDisable(DrmPlane *plane);
+  int SetDpmsMode(uint32_t dpms_mode);
+  int SetDisplayMode(const DrmMode &display_mode);
 
+  void RemoveNoPlaneLayers();
+  int SignalPreCompositionDone();
   int FinishComposition();
 
-  DrmCompositionLayerVector_t *GetCompositionLayers();
+  std::vector<DrmCompositionLayer> *GetCompositionLayers();
+  int pre_composition_layer_index() const;
   uint32_t dpms_mode() const;
+  const DrmMode &display_mode() const;
+
+  uint64_t frame_no() const;
+
+  Importer *importer() const;
 
  private:
   DrmDisplayComposition(const DrmDisplayComposition &) = delete;
 
   bool validate_composition_type(DrmCompositionType desired);
 
+  int CreateNextTimelineFence();
+  int IncreaseTimelineToPoint(int point);
+
   DrmResources *drm_;
+  DrmCrtc *crtc_;
   Importer *importer_;
+  const gralloc_module_t *gralloc_;
+  EGLDisplay egl_display_;
 
   DrmCompositionType type_;
 
   int timeline_fd_;
   int timeline_;
+  int timeline_current_;
+  int timeline_pre_comp_done_;
 
-  DrmCompositionLayerVector_t layers_;
+  std::vector<DrmCompositionLayer> layers_;
+  int pre_composition_layer_index_;
   uint32_t dpms_mode_;
+  DrmMode display_mode_;
+
+  uint64_t frame_no_;
 };
 }