}
DrmDisplayComposition::DrmDisplayComposition()
- : drm_(NULL), importer_(NULL), timeline_fd_(-1), timeline_(0) {
+ : drm_(NULL),
+ importer_(NULL),
+ type_(DRM_COMPOSITION_TYPE_EMPTY),
+ timeline_fd_(-1),
+ timeline_(0) {
}
DrmDisplayComposition::~DrmDisplayComposition() {
return 0;
}
+DrmCompositionType DrmDisplayComposition::type() const {
+ return type_;
+}
+
+bool DrmDisplayComposition::validate_composition_type(DrmCompositionType des) {
+ return type_ == DRM_COMPOSITION_TYPE_EMPTY || type_ == des;
+}
+
int DrmDisplayComposition::AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo,
DrmCrtc *crtc, DrmPlane *plane) {
if (layer->transform != 0)
return -EINVAL;
+ if (!validate_composition_type(DRM_COMPOSITION_TYPE_FRAME))
+ return -EINVAL;
+
++timeline_;
layer->releaseFenceFd =
sw_sync_fence_create(timeline_fd_, "drm_fence", timeline_);
layer->acquireFenceFd = -1; // We own this now
layers_.push_back(c_layer);
+ type_ = DRM_COMPOSITION_TYPE_FRAME;
return 0;
}
namespace android {
+enum DrmCompositionType {
+ DRM_COMPOSITION_TYPE_EMPTY,
+ DRM_COMPOSITION_TYPE_FRAME,
+};
+
typedef struct DrmCompositionLayer {
DrmCompositionLayer();
~DrmCompositionLayer();
int Init(DrmResources *drm, Importer *importer);
+ DrmCompositionType type() const;
+
int AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo, DrmCrtc *crtc,
DrmPlane *plane);
private:
DrmDisplayComposition(const DrmDisplayComposition &) = delete;
+ bool validate_composition_type(DrmCompositionType desired);
+
DrmResources *drm_;
Importer *importer_;
+ DrmCompositionType type_;
+
int timeline_fd_;
int timeline_;
int DrmDisplayCompositor::QueueComposition(
std::unique_ptr<DrmDisplayComposition> composition) {
- if (composition->GetCompositionLayers()->empty())
+ switch (composition->type()) {
+ case DRM_COMPOSITION_TYPE_FRAME:
+ break;
+ case DRM_COMPOSITION_TYPE_EMPTY:
return 0;
+ default:
+ ALOGE("Unknown composition type %d/%d", composition->type(), display_);
+ return -ENOENT;
+ }
int ret = pthread_mutex_lock(&lock_);
if (ret) {
return ret;
}
- ret = ApplyFrame(composition.get());
- if (ret) {
- ALOGE("Composite failed for display %d", display_);
- return ret;
+ switch (composition->type()) {
+ case DRM_COMPOSITION_TYPE_FRAME:
+ ret = ApplyFrame(composition.get());
+ if (ret) {
+ ALOGE("Composite failed for display %d", display_);
+ return ret;
+ }
+ ++dump_frames_composited_;
+ break;
+ default:
+ ALOGE("Unknown composition type %d", composition->type());
+ return -EINVAL;
}
- ++dump_frames_composited_;
if (active_composition_)
active_composition_->FinishComposition();