#ifndef ANDROID_DRM_COMPOSITION_H_
#define ANDROID_DRM_COMPOSITION_H_
-#include "compositor.h"
#include "drm_hwcomposer.h"
+#include "drmdisplaycomposition.h"
#include "drmplane.h"
#include "importer.h"
-#include <deque>
#include <map>
#include <vector>
namespace android {
-typedef struct DrmCompositionLayer {
- DrmCompositionLayer();
- ~DrmCompositionLayer();
+class DrmDisplayCompositor;
- hwc_layer_1_t layer;
- hwc_drm_bo_t bo;
- DrmCrtc *crtc;
- DrmPlane *plane;
-} DrmCompositionLayer_t;
+struct DrmCompositionDisplayLayersMap {
+ int display;
+ bool geometry_changed = true;
+ std::vector<DrmHwcLayer> layers;
-typedef std::multimap<int, DrmCompositionLayer> DrmCompositionLayerMap_t;
-typedef std::pair<int, DrmCompositionLayer> DrmCompositionLayerPair_t;
+ DrmCompositionDisplayLayersMap() = default;
+ DrmCompositionDisplayLayersMap(DrmCompositionDisplayLayersMap &&rhs) =
+ default;
+};
-class DrmComposition : public Composition {
+class DrmComposition {
public:
- DrmComposition(DrmResources *drm, Importer *importer, uint64_t frame_no);
- ~DrmComposition();
+ DrmComposition(DrmResources *drm, Importer *importer);
- virtual int Init();
+ int Init(uint64_t frame_no);
- virtual unsigned GetRemainingLayers(int display, unsigned num_needed) const;
- virtual int AddLayer(int display, hwc_layer_1_t *layer, hwc_drm_bo_t *bo);
+ int SetLayers(size_t num_displays, DrmCompositionDisplayLayersMap *maps);
+ int SetDpmsMode(int display, uint32_t dpms_mode);
+ int SetDisplayMode(int display, const DrmMode &display_mode);
- int FinishComposition();
+ std::unique_ptr<DrmDisplayComposition> TakeDisplayComposition(int display);
+ DrmDisplayComposition *GetDisplayComposition(int display);
- DrmCompositionLayerMap_t *GetCompositionMap();
+ int Plan(std::map<int, DrmDisplayCompositor> &compositor_map);
+ int DisableUnusedPlanes();
private:
+ DrmComposition(const DrmComposition &) = delete;
+
DrmResources *drm_;
Importer *importer_;
- uint64_t frame_no_;
-
- int timeline_fd_;
- int timeline_;
-
std::vector<DrmPlane *> primary_planes_;
- std::deque<DrmPlane *> overlay_planes_;
- DrmCompositionLayerMap_t composition_map_;
+ std::vector<DrmPlane *> overlay_planes_;
+
+ /*
+ * This _must_ be read-only after it's passed to QueueComposition. Otherwise
+ * locking is required to maintain consistency across the compositor threads.
+ */
+ std::map<int, std::unique_ptr<DrmDisplayComposition>> composition_map_;
};
}