blob: 814ca243714d1bf9a1acc10d82f8e3953d499b06 [file] [log] [blame]
Sean Paul98e73c82015-06-24 14:38:49 -07001/*
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 "drm_hwcomposer.h"
Zach Reizner09807052015-08-13 14:53:41 -070021#include "drmcrtc.h"
Sean Paul98e73c82015-06-24 14:38:49 -070022#include "drmplane.h"
Zach Reizner09807052015-08-13 14:53:41 -070023#include "glworker.h"
Sean Paul98e73c82015-06-24 14:38:49 -070024#include "importer.h"
25
26#include <vector>
27
Zach Reiznerb44fd102015-08-07 16:00:01 -070028#include <hardware/gralloc.h>
Sean Paul98e73c82015-06-24 14:38:49 -070029#include <hardware/hardware.h>
30#include <hardware/hwcomposer.h>
31
32namespace android {
33
Zach Reizner92f8e632015-10-12 17:47:13 -070034struct SquashState;
35
Sean Paulacb2a442015-06-24 18:43:01 -070036enum DrmCompositionType {
37 DRM_COMPOSITION_TYPE_EMPTY,
38 DRM_COMPOSITION_TYPE_FRAME,
Sean Pauldb7a17d2015-06-24 18:46:05 -070039 DRM_COMPOSITION_TYPE_DPMS,
Sean Paul57355412015-09-19 09:14:34 -040040 DRM_COMPOSITION_TYPE_MODESET,
Sean Paulacb2a442015-06-24 18:43:01 -070041};
42
Zach Reizner92f8e632015-10-12 17:47:13 -070043struct DrmCompositionRegion {
44 DrmHwcRect<int> frame;
45 std::vector<size_t> source_layers;
46};
Sean Paul98e73c82015-06-24 14:38:49 -070047
Zach Reizner92f8e632015-10-12 17:47:13 -070048struct DrmCompositionPlane {
49 const static size_t kSourceNone = SIZE_MAX;
50 const static size_t kSourcePreComp = kSourceNone - 1;
51 const static size_t kSourceSquash = kSourcePreComp - 1;
52 const static size_t kSourceLayerMax = kSourceSquash - 1;
53 DrmPlane *plane;
54 DrmCrtc *crtc;
55 size_t source_layer;
Zach Reizner4a253652015-09-10 18:30:54 -070056};
Sean Paul98e73c82015-06-24 14:38:49 -070057
58class DrmDisplayComposition {
59 public:
Zach Reizner92f8e632015-10-12 17:47:13 -070060 DrmDisplayComposition() = default;
61 DrmDisplayComposition(const DrmDisplayComposition &) = delete;
Sean Paul98e73c82015-06-24 14:38:49 -070062 ~DrmDisplayComposition();
63
Sean Paulbdc67bf2015-09-21 10:04:02 -040064 int Init(DrmResources *drm, DrmCrtc *crtc, Importer *importer,
65 uint64_t frame_no);
Sean Paul98e73c82015-06-24 14:38:49 -070066
Zach Reizner92f8e632015-10-12 17:47:13 -070067 int SetLayers(DrmHwcLayer *layers, size_t num_layers);
Sean Paul2e46fbd2015-07-09 17:22:22 -040068 int AddPlaneDisable(DrmPlane *plane);
Zach Reizner09807052015-08-13 14:53:41 -070069 int SetDpmsMode(uint32_t dpms_mode);
Sean Paul57355412015-09-19 09:14:34 -040070 int SetDisplayMode(const DrmMode &display_mode);
Sean Paul98e73c82015-06-24 14:38:49 -070071
Zach Reizner92f8e632015-10-12 17:47:13 -070072 int Plan(SquashState *squash, std::vector<DrmPlane *> *primary_planes,
73 std::vector<DrmPlane *> *overlay_planes);
Sean Paulacb2a442015-06-24 18:43:01 -070074
Zach Reizner09807052015-08-13 14:53:41 -070075 int CreateNextTimelineFence();
Zach Reizner92f8e632015-10-12 17:47:13 -070076 int SignalSquashDone() {
77 return IncreaseTimelineToPoint(timeline_squash_done_);
78 }
79 int SignalPreCompDone() {
80 return IncreaseTimelineToPoint(timeline_pre_comp_done_);
81 }
82 int SignalCompositionDone() {
83 return IncreaseTimelineToPoint(timeline_);
84 }
85
86 std::vector<DrmHwcLayer> &layers() {
87 return layers_;
88 }
89
90 std::vector<DrmCompositionRegion> &squash_regions() {
91 return squash_regions_;
92 }
93
94 std::vector<DrmCompositionRegion> &pre_comp_regions() {
95 return pre_comp_regions_;
96 }
97
98 std::vector<DrmCompositionPlane> &composition_planes() {
99 return composition_planes_;
100 }
101
102 uint64_t frame_no() const {
103 return frame_no_;
104 }
105
106 DrmCompositionType type() const {
107 return type_;
108 }
109
110 uint32_t dpms_mode() const {
111 return dpms_mode_;
112 }
113
114 const DrmMode &display_mode() const {
115 return display_mode_;
116 }
117
118 DrmCrtc *crtc() const {
119 return crtc_;
120 }
121
122 Importer *importer() const {
123 return importer_;
124 }
125
126 private:
127 bool validate_composition_type(DrmCompositionType desired);
128
Zach Reizner09807052015-08-13 14:53:41 -0700129 int IncreaseTimelineToPoint(int point);
130
Zach Reizner92f8e632015-10-12 17:47:13 -0700131 DrmResources *drm_ = NULL;
132 DrmCrtc *crtc_ = NULL;
133 Importer *importer_ = NULL;
Sean Paul98e73c82015-06-24 14:38:49 -0700134
Zach Reizner92f8e632015-10-12 17:47:13 -0700135 DrmCompositionType type_ = DRM_COMPOSITION_TYPE_EMPTY;
136 uint32_t dpms_mode_ = DRM_MODE_DPMS_ON;
Sean Paul57355412015-09-19 09:14:34 -0400137 DrmMode display_mode_;
Sean Paulbdc67bf2015-09-21 10:04:02 -0400138
Zach Reizner92f8e632015-10-12 17:47:13 -0700139 int timeline_fd_ = -1;
140 int timeline_ = 0;
141 int timeline_current_ = 0;
142 int timeline_squash_done_ = 0;
143 int timeline_pre_comp_done_ = 0;
144
145 std::vector<DrmHwcLayer> layers_;
146 std::vector<DrmCompositionRegion> squash_regions_;
147 std::vector<DrmCompositionRegion> pre_comp_regions_;
148 std::vector<DrmCompositionPlane> composition_planes_;
149
150 uint64_t frame_no_ = 0;
Sean Paul98e73c82015-06-24 14:38:49 -0700151};
152}
153
154#endif // ANDROID_DRM_DISPLAY_COMPOSITION_H_