1 /*
2 // Copyright (c) 2014 Intel Corporation
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 #include <common/utils/HwcTrace.h>
17 #include <common/base/Drm.h>
18 #include <common/base/HwcLayer.h>
19 #include <Hwcomposer.h>
20 #include <GraphicBuffer.h>
21 #include <IDisplayDevice.h>
22 #include <DisplayQuery.h>
23 #include <PlaneCapabilities.h>
24
25
26 namespace android {
27 namespace intel {
28
operator ==(const hwc_rect_t & x,const hwc_rect_t & y)29 inline bool operator==(const hwc_rect_t& x, const hwc_rect_t& y)
30 {
31 return (x.top == y.top &&
32 x.bottom == y.bottom &&
33 x.left == y.left &&
34 x.right == y.right);
35 }
36
operator !=(const hwc_rect_t & x,const hwc_rect_t & y)37 inline bool operator !=(const hwc_rect_t& x, const hwc_rect_t& y)
38 {
39 return !operator==(x, y);
40 }
41
operator ==(const hwc_frect_t & x,const hwc_frect_t & y)42 inline bool operator ==(const hwc_frect_t& x, const hwc_frect_t& y)
43 {
44 return (x.top == y.top &&
45 x.bottom == y.bottom &&
46 x.left == y.left &&
47 x.right == y.right);
48 }
49
operator !=(const hwc_frect_t & x,const hwc_frect_t & y)50 inline bool operator !=(const hwc_frect_t& x, const hwc_frect_t& y)
51 {
52 return !operator==(x, y);
53 }
54
HwcLayer(int index,hwc_layer_1_t * layer)55 HwcLayer::HwcLayer(int index, hwc_layer_1_t *layer)
56 : mIndex(index),
57 mZOrder(index + 1), // 0 is reserved for frame buffer target
58 mDevice(0),
59 mLayer(layer),
60 mPlane(0),
61 mFormat(DataBuffer::FORMAT_INVALID),
62 mWidth(0),
63 mHeight(0),
64 mUsage(0),
65 mHandle(0),
66 mIsProtected(false),
67 mType(LAYER_FB),
68 mPriority(0),
69 mTransform(0),
70 mUpdated(false)
71 {
72 memset(&mSourceCropf, 0, sizeof(mSourceCropf));
73 memset(&mDisplayFrame, 0, sizeof(mDisplayFrame));
74 memset(&mStride, 0, sizeof(mStride));
75
76 mPlaneCandidate = false;
77 setupAttributes();
78 }
79
~HwcLayer()80 HwcLayer::~HwcLayer()
81 {
82 if (mPlane) {
83 WLOGTRACE("HwcLayer is not cleaned up");
84 }
85
86 mLayer = NULL;
87 mPlane = NULL;
88 }
89
attachPlane(DisplayPlane * plane,int device)90 bool HwcLayer::attachPlane(DisplayPlane* plane, int device)
91 {
92 if (mPlane) {
93 ELOGTRACE("failed to attach plane, plane exists");
94 return false;
95 }
96
97 if (!plane) {
98 ELOGTRACE("Invalid plane");
99 return false;
100 }
101
102 mDevice = device;
103 //plane->setZOrder(mIndex);
104 plane->assignToDevice(device);
105 mPlane = plane;
106 return true;
107 }
108
detachPlane()109 DisplayPlane* HwcLayer::detachPlane()
110 {
111 // reset plane's z order
112 if (mPlane)
113 mPlane->setZOrder(-1);
114 DisplayPlane *plane = mPlane;
115 mPlane = 0;
116 mDevice = 0;
117 return plane;
118 }
119
setType(uint32_t type)120 void HwcLayer::setType(uint32_t type)
121 {
122 if (!mLayer)
123 return;
124
125 switch (type) {
126 case LAYER_OVERLAY:
127 case LAYER_SKIPPED:
128 mLayer->compositionType = HWC_OVERLAY;
129 mLayer->hints |= HWC_HINT_CLEAR_FB;
130 break;
131 // NOTE: set compositionType to HWC_FRAMEBUFFER here so that we have
132 // a chance to submit the primary changes to HW.
133 // Upper layer HWComposer will reset the compositionType automatically.
134 case LAYER_FB:
135 case LAYER_FORCE_FB:
136 mLayer->compositionType = HWC_FRAMEBUFFER;
137 break;
138 case LAYER_SIDEBAND:
139 mLayer->compositionType = HWC_SIDEBAND;
140 break;
141 case LAYER_CURSOR_OVERLAY:
142 mLayer->compositionType = HWC_CURSOR_OVERLAY;
143 break;
144 default:
145 break;
146 }
147
148 mType = type;
149 }
150
getType() const151 uint32_t HwcLayer::getType() const
152 {
153 return mType;
154 }
155
setCompositionType(int32_t type)156 void HwcLayer::setCompositionType(int32_t type)
157 {
158 mLayer->compositionType = type;
159 }
160
getCompositionType() const161 int32_t HwcLayer::getCompositionType() const
162 {
163 return mLayer->compositionType;
164 }
165
getIndex() const166 int HwcLayer::getIndex() const
167 {
168 return mIndex;
169 }
170
getZOrder() const171 int HwcLayer::getZOrder() const
172 {
173 return mZOrder;
174 }
175
getFormat() const176 uint32_t HwcLayer::getFormat() const
177 {
178 return mFormat;
179 }
180
getBufferWidth() const181 uint32_t HwcLayer::getBufferWidth() const
182 {
183 return mWidth;
184 }
185
getBufferHeight() const186 uint32_t HwcLayer::getBufferHeight() const
187 {
188 return mHeight;
189 }
190
getBufferStride() const191 const stride_t& HwcLayer::getBufferStride() const
192 {
193 return mStride;
194 }
195
getUsage() const196 uint32_t HwcLayer::getUsage() const
197 {
198 return mUsage;
199 }
200
getHandle() const201 uint32_t HwcLayer::getHandle() const
202 {
203 return mHandle;
204 }
205
getTransform() const206 uint32_t HwcLayer::getTransform() const
207 {
208 return mTransform;
209 }
210
isProtected() const211 bool HwcLayer::isProtected() const
212 {
213 return mIsProtected;
214 }
215
getLayer() const216 hwc_layer_1_t* HwcLayer::getLayer() const
217 {
218 return mLayer;
219 }
220
getPlane() const221 DisplayPlane* HwcLayer::getPlane() const
222 {
223 return mPlane;
224 }
225
setPriority(uint32_t priority)226 void HwcLayer::setPriority(uint32_t priority)
227 {
228 mPriority = priority;
229 }
230
getPriority() const231 uint32_t HwcLayer::getPriority() const
232 {
233 return mPriority;
234 }
235
update(hwc_layer_1_t * layer)236 bool HwcLayer::update(hwc_layer_1_t *layer)
237 {
238 // update layer
239 mLayer = layer;
240 setupAttributes();
241
242 // if not a FB layer & a plane was attached update plane's data buffer
243 if (mPlane) {
244 mPlane->setPosition(layer->displayFrame.left,
245 layer->displayFrame.top,
246 layer->displayFrame.right - layer->displayFrame.left,
247 layer->displayFrame.bottom - layer->displayFrame.top);
248 mPlane->setSourceCrop(layer->sourceCropf.left,
249 layer->sourceCropf.top,
250 layer->sourceCropf.right - layer->sourceCropf.left,
251 layer->sourceCropf.bottom - layer->sourceCropf.top);
252 mPlane->setTransform(layer->transform);
253 mPlane->setPlaneAlpha(layer->planeAlpha, layer->blending);
254 bool ret = mPlane->setDataBuffer((uint32_t)layer->handle);
255 if (ret == true) {
256 return true;
257 }
258 DLOGTRACE("failed to set data buffer, reset handle to 0!!");
259 mHandle = 0;
260 if (!mIsProtected) {
261 // typical case: rotated buffer is not ready or handle is null
262 return false;
263 } else {
264 // protected video has to be rendered using overlay.
265 // if buffer is not ready overlay will still be attached to this layer
266 // but rendering needs to be skipped.
267 WLOGTRACE("ignoring result of data buffer setting for protected video");
268 return true;
269 }
270 }
271
272 return true;
273 }
274
isUpdated()275 bool HwcLayer::isUpdated()
276 {
277 return mUpdated;
278 }
279
postFlip()280 void HwcLayer::postFlip()
281 {
282 mUpdated = false;
283 if (mPlane) {
284 mPlane->postFlip();
285 }
286 }
287
setupAttributes()288 void HwcLayer::setupAttributes()
289 {
290 if ((mLayer->flags & HWC_SKIP_LAYER) ||
291 mTransform != mLayer->transform ||
292 mSourceCropf != mLayer->sourceCropf ||
293 mDisplayFrame != mLayer->displayFrame ||
294 mHandle != (uint32_t)mLayer->handle ||
295 DisplayQuery::isVideoFormat(mFormat)) {
296 // TODO: same handle does not mean there is always no update
297 mUpdated = true;
298 }
299
300 // update handle always as it can become "NULL"
301 // if the given layer is not ready
302 mTransform = mLayer->transform;
303 mSourceCropf = mLayer->sourceCropf;
304 mDisplayFrame = mLayer->displayFrame;
305 mHandle = (uint32_t)mLayer->handle;
306
307 if (mFormat != DataBuffer::FORMAT_INVALID) {
308 // other attributes have been set.
309 return;
310 }
311
312 if (mLayer->handle == NULL) {
313 VLOGTRACE("invalid handle");
314 return;
315 }
316
317 BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
318 if (bm == NULL) {
319 // TODO: this check is redundant
320 return;
321 }
322
323 DataBuffer *buffer = bm->lockDataBuffer((uint32_t)mLayer->handle);
324 if (!buffer) {
325 ELOGTRACE("failed to get buffer");
326 } else {
327 mFormat = buffer->getFormat();
328 mWidth = buffer->getWidth();
329 mHeight = buffer->getHeight();
330 mStride = buffer->getStride();
331 mPriority = (mSourceCropf.right - mSourceCropf.left) * (mSourceCropf.bottom - mSourceCropf.top);
332 mPriority <<= LAYER_PRIORITY_SIZE_OFFSET;
333 mPriority |= mIndex;
334 GraphicBuffer *gBuffer = (GraphicBuffer*)buffer;
335 mUsage = gBuffer->getUsage();
336 mIsProtected = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer);
337 if (mIsProtected) {
338 mPriority |= LAYER_PRIORITY_PROTECTED;
339 } else if (PlaneCapabilities::isFormatSupported(DisplayPlane::PLANE_OVERLAY, this)) {
340 mPriority |= LAYER_PRIORITY_OVERLAY;
341 }
342 bm->unlockDataBuffer(buffer);
343 }
344 }
345
346 } // namespace intel
347 } // namespace android
348