summaryrefslogtreecommitdiff
path: root/hwc2/common/devices/PhysicalDevice.cpp (plain)
blob: 7311796bab546799f941a5f3e03f584864ff8476
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// This file is modified by Amlogic, Inc. 2017.01.17.
17*/
18
19#include <fcntl.h>
20#include <inttypes.h>
21#include <HwcTrace.h>
22#include <PhysicalDevice.h>
23#include <Hwcomposer.h>
24#include <sys/ioctl.h>
25#include <sync/sync.h>
26#include <Utils.h>
27#include <HwcFenceControl.h>
28#include <cutils/properties.h>
29#include <tvp/OmxUtil.h>
30#include <sys/utsname.h>
31#define FBIOPUT_OSD_CURSOR 0x451a
32
33static int Amvideo_Handle = 0;
34
35namespace android {
36namespace amlogic {
37
38PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc, DeviceControlFactory* controlFactory)
39 : mId(id),
40 mHwc(hwc),
41 mControlFactory(controlFactory),
42 mVsyncObserver(NULL),
43 mIsConnected(false),
44 mSecure(false),
45 mFramebufferHnd(NULL),
46 mSystemControl(NULL),
47 mFbSlot(0),
48 mComposer(NULL),
49 mPriorFrameRetireFence(-1),
50 mClientTargetHnd(NULL),
51 mTargetAcquireFence(-1),
52 mRenderMode(GLES_COMPOSE_MODE),
53 mIsValidated(false),
54 mIsContinuousBuf(true),
55 mDirectRenderLayerId(0),
56 mVideoOverlayLayerId(0),
57 mGE2DClearVideoRegionCount(0),
58 mGE2DComposeFrameCount(0),
59 mDirectComposeFrameCount(0),
60 mInitialized(false)
61{
62 CTRACE();
63
64 switch (id) {
65 case DEVICE_PRIMARY:
66 mName = "Primary";
67 break;
68 case DEVICE_EXTERNAL:
69 mName = "External";
70 break;
71 default:
72 mName = "Unknown";
73 }
74
75 mHdrCapabilities.init = false;
76 // init Display here.
77 initDisplay();
78
79 // set capacity of layers, layer's changed type, layer's changed request.
80 // mHwcLayersChangeType.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
81 // mHwcLayersChangeRequest.setCapacity(LAYER_MAX_NUM_CHANGE_REQUEST);
82 // mHwcGlesLayers.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
83 // mHwcLayers.setCapacity(LAYER_MAX_NUM_SUPPORT);
84#ifdef HWC_ENABLE_SECURE_LAYER
85 // mHwcSecureLayers.setCapacity(LAYER_MAX_NUM_SECURE_PROTECTED);
86 mHwcSecureLayers.clear();
87#endif
88
89 // clear layers vectors.
90 mHwcLayersChangeType.clear();
91 mHwcLayersChangeRequest.clear();
92 mHwcGlesLayers.clear();
93 mHwcLayers.clear();
94
95 // mGE2DRenderSortedLayerIds.setCapacity(HWC2_MAX_LAYERS);
96 mGE2DRenderSortedLayerIds.clear();
97
98 mHwcCurReleaseFences = mHwcPriorReleaseFences = NULL;
99
100 int major = 0, minor = 0;
101 struct utsname info;
102 if (uname(&info) || sscanf(info.release, "%d.%d", &major, &minor) <= 0) {
103 ETRACE("Could not get linux version: %s", strerror(errno));
104 }
105 // from kernel 4.9 use FBIOPUT_OSD_CURSOR instead of FBIO_CURSOR
106 mUsingPutCurosr = major > 4 || (major == 4 && minor >= 9);
107}
108
109PhysicalDevice::~PhysicalDevice()
110{
111 WARN_IF_NOT_DEINIT();
112 clearFenceList(mHwcCurReleaseFences);
113 clearFenceList(mHwcPriorReleaseFences);
114}
115
116bool PhysicalDevice::initialize() {
117 CTRACE();
118
119 if (mId != DEVICE_PRIMARY && mId != DEVICE_EXTERNAL) {
120 ETRACE("invalid device type");
121 return false;
122 }
123
124 // create vsync event observer, we only have soft vsync now...
125 mVsyncObserver = new SoftVsyncObserver(*this);
126 if (!mVsyncObserver || !mVsyncObserver->initialize()) {
127 DEINIT_AND_RETURN_FALSE("failed to create vsync observer");
128 }
129
130 mDisplayHdmi = new DisplayHdmi(mId);
131 mDisplayHdmi->initialize();
132 UeventObserver *observer = Hwcomposer::getInstance().getUeventObserver();
133 if (observer) {
134 observer->registerListener(
135 Utils::getHdcpUeventEnvelope(),
136 hdcpEventListener,
137 this);
138 } else {
139 ETRACE("PhysicalDevice::Uevent observer is NULL");
140 }
141
142 mInitialized = true;
143 return true;
144}
145
146void PhysicalDevice::hdcpEventListener(void *data, bool status)
147{
148 PhysicalDevice *pThis = (PhysicalDevice*)data;
149 if (pThis) {
150 pThis->setSecureStatus(status);
151 }
152}
153
154void PhysicalDevice::setSecureStatus(bool status)
155{
156 DTRACE("hdcp event: %d", status);
157 mSecure = status;
158}
159
160void PhysicalDevice::deinitialize() {
161 Mutex::Autolock _l(mLock);
162
163 DEINIT_AND_DELETE_OBJ(mVsyncObserver);
164 DEINIT_AND_DELETE_OBJ(mDisplayHdmi);
165 DEINIT_AND_DELETE_OBJ(mComposer);
166
167 if (mFramebufferContext != NULL) {
168 delete mFramebufferContext;
169 mFramebufferContext = NULL;
170 }
171
172 if (mCursorContext != NULL) {
173 delete mCursorContext;
174 mCursorContext = NULL;
175 }
176
177 mInitialized = false;
178}
179
180HwcLayer* PhysicalDevice::getLayerById(hwc2_layer_t layerId) {
181 HwcLayer* layer = NULL;
182 ssize_t index = mHwcLayers.indexOfKey(layerId);
183
184 if (index >= 0) {
185 layer = mHwcLayers.valueFor(layerId);
186 }
187
188 if (!layer) {
189 DTRACE("getLayerById %lld error!", layerId);
190 }
191 return layer;
192}
193
194int32_t PhysicalDevice::acceptDisplayChanges() {
195 HwcLayer* layer = NULL;
196
197 for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
198 hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
199 layer = mHwcLayersChangeType.valueAt(i);
200 if (layer) {
201#ifdef HWC_ENABLE_SECURE_LAYER
202 // deal non secure display.
203 if (!mSecure && !mHwcSecureLayers.isEmpty()) {
204 for (uint32_t j=0; j<mHwcSecureLayers.size(); j++) {
205 hwc2_layer_t secureLayerId = mHwcSecureLayers.keyAt(j);
206 HwcLayer* secureLayer = mHwcSecureLayers.valueAt(j);
207 // deal secure layers release fence and composition type on non secure display.
208 addReleaseFence(secureLayerId, secureLayer->getDuppedAcquireFence());
209 if (layerId == secureLayerId) {
210 if (layer->getCompositionType() != HWC2_COMPOSITION_DEVICE) {
211 layer->setCompositionType(HWC2_COMPOSITION_DEVICE);
212 continue;
213 }
214 }
215 }
216 }
217#endif
218 if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE
219 || layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
220 layer->setCompositionType(HWC2_COMPOSITION_CLIENT);
221 } else if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND) {
222 layer->setCompositionType(HWC2_COMPOSITION_DEVICE);
223 }
224 }
225 }
226 // reset layer changed or requested size to zero.
227 mHwcLayersChangeType.clear();
228 mHwcLayersChangeRequest.clear();
229
230#ifdef HWC_ENABLE_SECURE_LAYER
231 // deal non secure display device.
232 if (!mHwcSecureLayers.isEmpty()) {
233 mHwcSecureLayers.clear();
234 }
235#endif
236
237 return HWC2_ERROR_NONE;
238}
239
240bool PhysicalDevice::createLayer(hwc2_layer_t* outLayer) {
241 HwcLayer* layer = new HwcLayer(mId);
242
243 if (layer == NULL || !layer->initialize()) {
244 ETRACE("createLayer: failed !");
245 return false;
246 }
247
248 hwc2_layer_t layerId = reinterpret_cast<hwc2_layer_t>(layer);
249 mHwcLayers.add(layerId, layer);
250 *outLayer = layerId;
251 DTRACE("::createLayer layerId %lld, size: [%d].\n", layerId, mHwcLayers.size());
252
253 return true;
254}
255
256bool PhysicalDevice::destroyLayer(hwc2_layer_t layerId) {
257 HwcLayer* layer = mHwcLayers.valueFor(layerId);
258 DTRACE("::destroyLayer layerId %lld, size: [%d].\n", layerId, mHwcLayers.size());
259
260 if (layer == NULL) {
261 ETRACE("destroyLayer: no Hwclayer found (%d)", layerId);
262 return false;
263 }
264
265 for (int i = 0; i < 2; i++) {
266 ssize_t idx = mLayerReleaseFences[i].indexOfKey(layerId);
267 if (idx >= 0) {
268 HwcFenceControl::closeFd(mLayerReleaseFences[i].valueAt(idx));
269 mLayerReleaseFences[i].removeItemsAt(idx);
270 DTRACE("destroyLayer remove layer %lld from cur release list %p\n", layerId, &(mLayerReleaseFences[i]));
271 }
272 }
273
274 mHwcLayers.removeItem(layerId);
275 DEINIT_AND_DELETE_OBJ(layer);
276 return true;
277}
278
279int32_t PhysicalDevice::getActiveConfig(
280 hwc2_config_t* outConfig) {
281 Mutex::Autolock _l(mLock);
282
283 return mDisplayHdmi->getActiveConfig(outConfig);
284}
285
286int32_t PhysicalDevice::getChangedCompositionTypes(
287 uint32_t* outNumElements,
288 hwc2_layer_t* outLayers,
289 int32_t* /*hwc2_composition_t*/ outTypes) {
290 HwcLayer* layer = NULL;
291
292 // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
293 if (NULL == outLayers || NULL == outTypes) {
294 *outNumElements = mHwcLayersChangeType.size();
295 } else {
296 for (uint32_t i=0; i<mHwcLayersChangeType.size(); i++) {
297 hwc2_layer_t layerId = mHwcLayersChangeType.keyAt(i);
298 layer = mHwcLayersChangeType.valueAt(i);
299 if (layer) {
300#ifdef HWC_ENABLE_SECURE_LAYER
301 // deal non secure display.
302 if (!mSecure && !mHwcSecureLayers.isEmpty()) {
303 for (uint32_t j=0; j<mHwcSecureLayers.size(); j++) {
304 hwc2_layer_t secureLayerId = mHwcSecureLayers.keyAt(j);
305 if (layerId == secureLayerId) {
306 if (layer->getCompositionType() != HWC2_COMPOSITION_DEVICE) {
307 outLayers[i] = layerId;
308 outTypes[i] = HWC2_COMPOSITION_DEVICE;
309 continue;
310 }
311 }
312 }
313 }
314#endif
315
316 if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE
317 || layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
318 // change all other device type to client.
319 outLayers[i] = layerId;
320 outTypes[i] = HWC2_COMPOSITION_CLIENT;
321 continue;
322 }
323
324 // sideband stream.
325 if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND
326 && layer->getSidebandStream()) {
327 // TODO: we just transact SIDEBAND to OVERLAY for now;
328 DTRACE("get HWC_SIDEBAND layer, just change to overlay");
329 outLayers[i] = layerId;
330 outTypes[i] = HWC2_COMPOSITION_DEVICE;
331 continue;
332 }
333 }
334 }
335
336 if (mHwcLayersChangeType.size() > 0) {
337 DTRACE("There are %d layers type has changed.", mHwcLayersChangeType.size());
338 *outNumElements = mHwcLayersChangeType.size();
339 } else {
340 DTRACE("No layers compositon type changed.");
341 }
342 }
343
344 return HWC2_ERROR_NONE;
345}
346
347int32_t PhysicalDevice::getClientTargetSupport(
348 uint32_t width,
349 uint32_t height,
350 int32_t /*android_pixel_format_t*/ format,
351 int32_t /*android_dataspace_t*/ dataspace) {
352 framebuffer_info_t* fbInfo = mFramebufferContext->getInfo();
353
354 if (width == fbInfo->info.xres
355 && height == fbInfo->info.yres
356 && format == HAL_PIXEL_FORMAT_RGBA_8888
357 && dataspace == HAL_DATASPACE_UNKNOWN) {
358 return HWC2_ERROR_NONE;
359 }
360
361 DTRACE("fbinfo: [%d x %d], client: [%d x %d]"
362 "format: %d, dataspace: %d",
363 fbInfo->info.xres,
364 fbInfo->info.yres,
365 width, height, format, dataspace);
366
367 // TODO: ?
368 return HWC2_ERROR_UNSUPPORTED;
369}
370
371int32_t PhysicalDevice::getColorModes(
372 uint32_t* outNumModes,
373 int32_t* /*android_color_mode_t*/ outModes) {
374
375 if (NULL == outModes) {
376 *outNumModes = 1;
377 } else {
378 *outModes = HAL_COLOR_MODE_NATIVE;
379 }
380
381 return HWC2_ERROR_NONE;
382}
383
384int32_t PhysicalDevice::getDisplayAttribute(
385 hwc2_config_t config,
386 int32_t /*hwc2_attribute_t*/ attribute,
387 int32_t* outValue) {
388 Mutex::Autolock _l(mLock);
389
390 if (!mIsConnected) {
391 ETRACE("display %d is not connected.", mId);
392 }
393
394 int ret = mDisplayHdmi->getDisplayAttribute(config, attribute, outValue);
395 if (ret < 0)
396 return HWC2_ERROR_BAD_CONFIG;
397
398 return HWC2_ERROR_NONE;
399}
400
401int32_t PhysicalDevice::getDisplayConfigs(
402 uint32_t* outNumConfigs,
403 hwc2_config_t* outConfigs) {
404 Mutex::Autolock _l(mLock);
405
406 return mDisplayHdmi->getDisplayConfigs(outNumConfigs, outConfigs);
407}
408
409int32_t PhysicalDevice::getDisplayName(
410 uint32_t* outSize,
411 char* outName) {
412 return HWC2_ERROR_NONE;
413}
414
415int32_t PhysicalDevice::getDisplayRequests(
416 int32_t* /*hwc2_display_request_t*/ outDisplayRequests,
417 uint32_t* outNumElements,
418 hwc2_layer_t* outLayers,
419 int32_t* /*hwc2_layer_request_t*/ outLayerRequests) {
420
421 // if outLayers or outTypes were NULL, the number of layers and types which would have been returned.
422 if (NULL == outLayers || NULL == outLayerRequests) {
423 *outNumElements = mHwcLayersChangeRequest.size();
424 } else {
425 for (uint32_t i=0; i<mHwcLayersChangeRequest.size(); i++) {
426 hwc2_layer_t layerId = mHwcLayersChangeRequest.keyAt(i);
427 HwcLayer *layer = mHwcLayersChangeRequest.valueAt(i);
428 if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE) {
429 // video overlay.
430 if (layerId == mVideoOverlayLayerId) {
431 outLayers[i] = layerId;
432 outLayerRequests[i] = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
433 }
434 /* if (layer->getBufferHandle()) {
435 private_handle_t const* hnd =
436 reinterpret_cast<private_handle_t const*>(layer->getBufferHandle());
437 if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
438 outLayers[i] = layerId;
439 outLayerRequests[i] = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
440 continue;
441 }
442 } */
443 }
444
445 // sideband stream.
446 if ((layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND && layer->getSidebandStream())
447 //|| layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR
448 || layer->getCompositionType() == HWC2_COMPOSITION_CURSOR) {
449 // TODO: we just transact SIDEBAND to OVERLAY for now;
450 DTRACE("get HWC_SIDEBAND layer, just change to overlay");
451 outLayers[i] = layerId;
452 outLayerRequests[i] = HWC2_LAYER_REQUEST_CLEAR_CLIENT_TARGET;
453 continue;
454 }
455 }
456
457 if (mHwcLayersChangeRequest.size() > 0) {
458 DTRACE("There are %d layer requests.", mHwcLayersChangeRequest.size());
459 *outNumElements = mHwcLayersChangeRequest.size();
460 } else {
461 DTRACE("No layer requests.");
462 }
463 }
464
465 return HWC2_ERROR_NONE;
466}
467
468int32_t PhysicalDevice::getDisplayType(
469 int32_t* /*hwc2_display_type_t*/ outType) {
470
471 *outType = HWC2_DISPLAY_TYPE_PHYSICAL;
472 return HWC2_ERROR_NONE;
473}
474
475int32_t PhysicalDevice::getDozeSupport(
476 int32_t* outSupport) {
477 return HWC2_ERROR_NONE;
478}
479
480int32_t PhysicalDevice::getHdrCapabilities(
481 uint32_t* outNumTypes,
482 int32_t* /*android_hdr_t*/ outTypes,
483 float* outMaxLuminance,
484 float* outMaxAverageLuminance,
485 float* outMinLuminance) {
486
487 Mutex::Autolock _l(mLock);
488 if (!mIsConnected) {
489 ETRACE("disp: %llu is not connected", mId);
490 return HWC2_ERROR_BAD_DISPLAY;
491 }
492
493 if (!mHdrCapabilities.init) {
494 parseHdrCapabilities();
495 mHdrCapabilities.init = true;
496 }
497
498 if (NULL == outTypes) {
499 int num = 0;
500 if (mHdrCapabilities.dvSupport) num++;
501 if (mHdrCapabilities.hdrSupport) num++;
502
503 *outNumTypes = num;
504 } else {
505 if (mHdrCapabilities.dvSupport) *outTypes++ = HAL_HDR_DOLBY_VISION;
506 if (mHdrCapabilities.hdrSupport) *outTypes++ = HAL_HDR_HDR10;
507
508 *outMaxLuminance = mHdrCapabilities.maxLuminance;
509 *outMaxAverageLuminance = mHdrCapabilities.avgLuminance;
510 *outMinLuminance = mHdrCapabilities.minLuminance;
511 }
512
513 return HWC2_ERROR_NONE;
514}
515
516void PhysicalDevice::swapReleaseFence() {
517 //dumpFenceList(mHwcCurReleaseFences);
518
519 if (mHwcCurReleaseFences == NULL || mHwcPriorReleaseFences == NULL) {
520 if (mHwcCurReleaseFences) {
521 clearFenceList(mHwcPriorReleaseFences);
522 }
523
524 if (mHwcPriorReleaseFences) {
525 clearFenceList(mHwcPriorReleaseFences);
526 }
527
528 mHwcCurReleaseFences = &(mLayerReleaseFences[0]);
529 mHwcPriorReleaseFences = &(mLayerReleaseFences[1]);
530 } else {
531 KeyedVector<hwc2_layer_t, int32_t> * tmp = mHwcCurReleaseFences;
532 clearFenceList(mHwcPriorReleaseFences);
533 mHwcCurReleaseFences = mHwcPriorReleaseFences;
534 mHwcPriorReleaseFences = tmp;
535 }
536}
537
538
539void PhysicalDevice::addReleaseFence(hwc2_layer_t layerId, int32_t fenceFd) {
540 ssize_t idx = mHwcCurReleaseFences->indexOfKey(layerId);
541 if (idx >= 0 && idx < mHwcCurReleaseFences->size()) {
542 int32_t oldFence = mHwcCurReleaseFences->valueAt(idx);
543 String8 mergeName("hwc-release");
544 int32_t newFence = HwcFenceControl::merge(mergeName, oldFence, fenceFd);
545 mHwcCurReleaseFences->replaceValueAt(idx, newFence);
546 HwcFenceControl::closeFd(oldFence);
547 HwcFenceControl::closeFd(fenceFd);
548 ETRACE("addReleaseFence:(%d, %d) + %d -> (%d,%d)\n", idx, oldFence, fenceFd, idx, newFence);
549 dumpFenceList(mHwcCurReleaseFences);
550 } else {
551 mHwcCurReleaseFences->add(layerId, fenceFd);
552 }
553}
554
555void PhysicalDevice::clearFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) {
556 if (!fenceList || !fenceList->size())
557 return;
558
559 for (int i = 0; i < fenceList->size(); i++) {
560 int32_t fenceFd = fenceList->valueAt(i);
561 HwcFenceControl::closeFd(fenceFd);
562 DTRACE("clearFenceList close fd %d\n", fenceFd);
563 fenceList->replaceValueAt(i, -1);
564 }
565 fenceList->clear();
566}
567
568void PhysicalDevice::dumpFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) {
569 if (!fenceList || fenceList->isEmpty())
570 return;
571
572 String8 resultStr("dumpFenceList: ");
573 for (int i = 0; i < fenceList->size(); i++) {
574 hwc2_layer_t layerId = fenceList->keyAt(i);
575 int32_t fenceFd = fenceList->valueAt(i);
576 resultStr.appendFormat("(%lld, %d), ", layerId, fenceFd);
577 }
578
579 ETRACE("%s", resultStr.string());
580}
581
582int32_t PhysicalDevice::getReleaseFences(
583 uint32_t* outNumElements,
584 hwc2_layer_t* outLayers,
585 int32_t* outFences) {
586 *outNumElements = mHwcPriorReleaseFences->size();
587
588 if (outLayers && outFences) {
589 for (uint32_t i=0; i<mHwcPriorReleaseFences->size(); i++) {
590 outLayers[i] = mHwcPriorReleaseFences->keyAt(i);
591 outFences[i] = HwcFenceControl::dupFence(mHwcPriorReleaseFences->valueAt(i));
592 }
593 }
594
595 return HWC2_ERROR_NONE;
596}
597
598void PhysicalDevice::directCompose(framebuffer_info_t * fbInfo) {
599 HwcLayer* layer = NULL;
600 ssize_t idx = mHwcLayers.indexOfKey(mDirectRenderLayerId);
601 if (idx >= 0) {
602 layer = mHwcLayers.valueAt(idx);
603 if (mTargetAcquireFence > -1) {
604 ETRACE("ERROR:directCompose with mTargetAcquireFence %d\n", mTargetAcquireFence);
605 HwcFenceControl::closeFd(mTargetAcquireFence);
606 }
607
608 mTargetAcquireFence = layer->getDuppedAcquireFence();
609 mClientTargetHnd = layer->getBufferHandle();
610 DTRACE("Hit only one non video overlay layer, handle: %08" PRIxPTR ", fence: %d",
611 intptr_t(mClientTargetHnd), mTargetAcquireFence);
612
613 // fill up fb sync request struct.
614 hwc_frect_t srcCrop = layer->getSourceCrop();
615 hwc_rect_t displayFrame = layer->getDisplayFrame();
616 mFbSyncRequest.xoffset = (unsigned int)srcCrop.left;
617 mFbSyncRequest.yoffset = (unsigned int)srcCrop.top;
618 mFbSyncRequest.width = (unsigned int)(srcCrop.right - srcCrop.left);
619 mFbSyncRequest.height = (unsigned int)(srcCrop.bottom - srcCrop.top);
620 mFbSyncRequest.dst_x = displayFrame.left;
621 mFbSyncRequest.dst_y = displayFrame.top;
622 mFbSyncRequest.dst_w = displayFrame.right - displayFrame.left;
623 mFbSyncRequest.dst_h = displayFrame.bottom - displayFrame.top;
624 return;
625 }
626
627 ETRACE("Didn't find direct compose layer!");
628}
629
630#ifdef ENABLE_AML_GE2D_COMPOSER
631void PhysicalDevice::ge2dCompose(framebuffer_info_t * fbInfo, bool hasVideoOverlay) {
632 if (mGE2DRenderSortedLayerIds.size() > 0) {
633 DTRACE("GE2D compose mFbSlot: %d", mFbSlot);
634 if (hasVideoOverlay) {
635 if (mGE2DClearVideoRegionCount < 3) {
636 mComposer->setVideoOverlayLayerId(mVideoOverlayLayerId);
637 }
638 }
639 if (mTargetAcquireFence > -1) {
640 ETRACE("ERROR:GE2D compose with mTargetAcquireFence %d\n", mTargetAcquireFence);
641 HwcFenceControl::closeFd(mTargetAcquireFence);
642 }
643 mTargetAcquireFence = mComposer->startCompose(mGE2DRenderSortedLayerIds, &mFbSlot, mGE2DComposeFrameCount);
644 for (uint32_t i=0; i<mGE2DRenderSortedLayerIds.size(); i++) {
645 addReleaseFence(mGE2DRenderSortedLayerIds.itemAt(i), HwcFenceControl::dupFence(mTargetAcquireFence));
646 }
647 // HwcFenceControl::traceFenceInfo(mTargetAcquireFence);
648 // dumpLayers(mGE2DRenderSortedLayerIds);
649 if (mGE2DComposeFrameCount < 3) {
650 mGE2DComposeFrameCount++;
651 }
652 mClientTargetHnd = mComposer->getBufHnd();
653 fbInfo->yOffset = mFbSlot;
654 return;
655 }
656
657 ETRACE("Didn't find ge2d compose layers!");
658}
659#endif
660
661int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence, bool hasVideoOverlay) {
662 HwcLayer* layer = NULL;
663 void *cbuffer;
664
665 // deal physical display's client target layer
666 framebuffer_info_t fbInfo = *(mFramebufferContext->getInfo());
667 framebuffer_info_t* cbInfo = mCursorContext->getInfo();
668 bool cursorShow = false;
669 bool haveCursorLayer = false;
670 for (uint32_t i=0; i<mHwcLayers.size(); i++) {
671 hwc2_layer_t layerId = mHwcLayers.keyAt(i);
672 layer = mHwcLayers.valueAt(i);
673 if (layer && layer->getCompositionType()== HWC2_COMPOSITION_CURSOR) {
674 private_handle_t *hnd = (private_handle_t *)(layer->getBufferHandle());
675 if (private_handle_t::validate(hnd) < 0) {
676 ETRACE("invalid cursor layer handle.");
677 break;
678 }
679 haveCursorLayer = true;
680 DTRACE("This is a Sprite, hnd->stride is %d, hnd->height is %d", hnd->stride, hnd->height);
681 if (cbInfo->info.xres != (uint32_t)hnd->stride || cbInfo->info.yres != (uint32_t)hnd->height) {
682 ETRACE("disp: %d cursor need to redrew", mId);
683 update_cursor_buffer_locked(cbInfo, hnd->stride, hnd->height);
684 cbuffer = mmap(NULL, hnd->size, PROT_READ|PROT_WRITE, MAP_SHARED, cbInfo->fd, 0);
685 if (cbuffer != MAP_FAILED) {
686 memcpy(cbuffer, hnd->base, hnd->size);
687 munmap(cbuffer, hnd->size);
688 DTRACE("setCursor ok");
689 } else {
690 ETRACE("buffer mmap fail");
691 }
692 }
693 cursorShow = true;
694 break;
695 }
696 }
697
698 if (mRenderMode == GLES_COMPOSE_MODE) {
699 //if no layers to compose, post blank op to osd.
700 if (mHwcGlesLayers.size() == 0) {
701 mClientTargetHnd = NULL;
702 }
703 } else if (mRenderMode == DIRECT_COMPOSE_MODE) { // if only one layer exists, let hwc do her work.
704 directCompose(&fbInfo);
705 }
706#ifdef ENABLE_AML_GE2D_COMPOSER
707 else if (mRenderMode == GE2D_COMPOSE_MODE) {
708 ge2dCompose(&fbInfo, hasVideoOverlay);
709 }
710#endif
711 mFbSyncRequest.type = mRenderMode;
712
713 bool needBlankFb0 = false;
714 uint32_t layerNum = mHwcLayers.size();
715 if (hasVideoOverlay && (layerNum == 1 || (layerNum == 2 && haveCursorLayer)))
716 needBlankFb0 = true;
717
718 if (mIsContinuousBuf) {
719 // bit 0 is osd blank flag.
720 if (needBlankFb0) {
721 mFbSyncRequest.op |= OSD_BLANK_OP_BIT;
722 } else {
723 mFbSyncRequest.op &= ~(OSD_BLANK_OP_BIT);
724 }
725 mFramebufferContext->setStatus(needBlankFb0);
726 } else {
727 setOSD0Blank(needBlankFb0);
728 }
729
730 if (!mClientTargetHnd || private_handle_t::validate(mClientTargetHnd) < 0 || mPowerMode == HWC2_POWER_MODE_OFF) {
731 ETRACE("Post blank to screen, mClientTargetHnd(%p, %d), mTargetAcquireFence(%d)",
732 mClientTargetHnd, private_handle_t::validate(mClientTargetHnd), mTargetAcquireFence);
733 *outRetireFence = HwcFenceControl::merge(String8("ScreenBlank"), mPriorFrameRetireFence, mPriorFrameRetireFence);
734 HwcFenceControl::closeFd(mTargetAcquireFence);
735 mTargetAcquireFence = -1;
736 HwcFenceControl::closeFd(mPriorFrameRetireFence);
737 mPriorFrameRetireFence = -1;
738 //for nothing to display, post blank to osd which will signal the last retire fence.
739 mFbSyncRequest.type = DIRECT_COMPOSE_MODE;
740 mFbSyncRequest.op |= OSD_BLANK_OP_BIT;
741 mFramebufferContext->setStatus(true);
742 mPriorFrameRetireFence = hwc_fb_post_with_fence_locked(&fbInfo, &mFbSyncRequest, NULL);
743 } else {
744 *outRetireFence = HwcFenceControl::dupFence(mPriorFrameRetireFence);
745 if (*outRetireFence >= 0) {
746 DTRACE("Get prior frame's retire fence %d", *outRetireFence);
747 } else {
748 ETRACE("No valid prior frame's retire returned. %d ", *outRetireFence);
749 // -1 means no fence, less than -1 is some error
750 *outRetireFence = -1;
751 }
752 HwcFenceControl::closeFd(mPriorFrameRetireFence);
753 mPriorFrameRetireFence = -1;
754
755 // real post framebuffer here.
756 DTRACE("render type: %d", mFbSyncRequest.type);
757 if (!mIsContinuousBuf) {
758 mPriorFrameRetireFence = fb_post_with_fence_locked(&fbInfo, mClientTargetHnd, mTargetAcquireFence);
759 } else {
760 // acquire fence.
761 mFbSyncRequest.in_fen_fd = mTargetAcquireFence;
762 mPriorFrameRetireFence = hwc_fb_post_with_fence_locked(&fbInfo, &mFbSyncRequest, mClientTargetHnd);
763 }
764 mTargetAcquireFence = -1;
765
766 if (mRenderMode == GE2D_COMPOSE_MODE) {
767 mComposer->mergeRetireFence(mFbSlot, HwcFenceControl::dupFence(mPriorFrameRetireFence));
768 } else {
769 if (mComposer && mGE2DComposeFrameCount != 0) {
770 mComposer->removeRetireFence(mFbSlot);
771 }
772
773 if (mRenderMode == DIRECT_COMPOSE_MODE) {
774 addReleaseFence(mDirectRenderLayerId, HwcFenceControl::dupFence(mPriorFrameRetireFence));
775 }
776 }
777
778 // finally we need to update cursor's blank status.
779 if (cbInfo->fd > 0 && cursorShow != mCursorContext->getStatus()) {
780 mCursorContext->setStatus(cursorShow);
781 DTRACE("UPDATE FB1 status to %d", !cursorShow);
782 ioctl(cbInfo->fd, FBIOBLANK, !cursorShow);
783 }
784 }
785
786 if (mRenderMode != GE2D_COMPOSE_MODE) {
787 mGE2DComposeFrameCount = 0;
788 }
789
790 return HWC2_ERROR_NONE;
791}
792
793// TODO: need add fence wait.
794int32_t PhysicalDevice::setOSD0Blank(bool blank) {
795 framebuffer_info_t* fbInfo = mFramebufferContext->getInfo();
796
797 if (fbInfo->fd > 0 && blank != mFramebufferContext->getStatus()) {
798 mFramebufferContext->setStatus(blank);
799 DTRACE("UPDATE FB0 status to %d", blank);
800 ioctl(fbInfo->fd, FBIOBLANK, blank);
801 }
802
803 return HWC2_ERROR_NONE;
804}
805
806int32_t PhysicalDevice::presentDisplay(int32_t* outRetireFence) {
807 int32_t err = HWC2_ERROR_NONE;
808 HwcLayer* layer = NULL;
809 bool hasVideoOverlay = false;
810
811 if (mIsValidated) {
812 // TODO: need improve the way to set video axis.
813#if WITH_LIBPLAYER_MODULE
814 ssize_t index = mHwcLayers.indexOfKey(mVideoOverlayLayerId);
815 if (index >= 0) {
816 layer = mHwcLayers.valueFor(mVideoOverlayLayerId);
817 if (layer != NULL) {
818 layer->presentOverlay();
819 hasVideoOverlay = true;
820 if (mGE2DClearVideoRegionCount < 3) {
821 mGE2DClearVideoRegionCount++;
822 }
823 }
824 } else {
825 mGE2DClearVideoRegionCount = 0;
826 }
827#endif
828 err = postFramebuffer(outRetireFence, hasVideoOverlay);
829 } else { // display not validate yet.
830 err = HWC2_ERROR_NOT_VALIDATED;
831 }
832
833 // reset layers' acquire fence.
834 for (uint32_t i=0; i<mHwcLayers.size(); i++) {
835 hwc2_layer_t layerId = mHwcLayers.keyAt(i);
836 layer = mHwcLayers.valueAt(i);
837 if (layer != NULL) {
838 layer->resetAcquireFence();
839 }
840 }
841
842 mClientTargetHnd = NULL;
843
844 return err;
845}
846
847int32_t PhysicalDevice::setActiveConfig(
848 hwc2_config_t config) {
849 Mutex::Autolock _l(mLock);
850
851 int32_t err = mDisplayHdmi->setActiveConfig(config);
852 if (err == HWC2_ERROR_NONE)
853 mVsyncObserver->setRefreshRate(mDisplayHdmi->getActiveRefreshRate());
854
855 return err;
856}
857
858int32_t PhysicalDevice::setClientTarget(
859 buffer_handle_t target,
860 int32_t acquireFence,
861 int32_t /*android_dataspace_t*/ dataspace,
862 hwc_region_t damage) {
863
864 if (target && private_handle_t::validate(target) < 0) {
865 return HWC2_ERROR_BAD_PARAMETER;
866 }
867
868 if (NULL != target) {
869 mClientTargetHnd = target;
870 mClientTargetDamageRegion = damage;
871 mTargetAcquireFence = acquireFence;
872 DTRACE("setClientTarget %p, %d", target, acquireFence);
873 // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage.
874 } else {
875 DTRACE("client target is null!, no need to update this frame.");
876 }
877
878 return HWC2_ERROR_NONE;
879}
880
881int32_t PhysicalDevice::setColorMode(
882 int32_t /*android_color_mode_t*/ mode) {
883 return HWC2_ERROR_NONE;
884}
885
886int32_t PhysicalDevice::setColorTransform(
887 const float* matrix,
888 int32_t /*android_color_transform_t*/ hint) {
889 return HWC2_ERROR_NONE;
890}
891
892int32_t PhysicalDevice::setPowerMode(
893 int32_t /*hwc2_power_mode_t*/ mode){
894
895 mPowerMode = mode;
896 return HWC2_ERROR_NONE;
897}
898
899bool PhysicalDevice::vsyncControl(bool enabled) {
900 RETURN_FALSE_IF_NOT_INIT();
901
902 ATRACE("disp = %d, enabled = %d", mId, enabled);
903 return mVsyncObserver->control(enabled);
904}
905
906void PhysicalDevice::dumpLayers(Vector < hwc2_layer_t > layerIds) {
907 for (uint32_t x=0; x<layerIds.size(); x++) {
908 HwcLayer* layer = getLayerById(layerIds.itemAt(x));
909 static char const* compositionTypeName[] = {
910 "UNKNOWN",
911 "GLES",
912 "HWC",
913 "SOLID",
914 "HWC_CURSOR",
915 "SIDEBAND"};
916 ETRACE(" %11s | %12" PRIxPTR " | %10d | %02x | %1.2f | %02x | %04x |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d \n",
917 compositionTypeName[layer->getCompositionType()],
918 intptr_t(layer->getBufferHandle()), layer->getZ(), layer->getDataspace(),
919 layer->getPlaneAlpha(), layer->getTransform(), layer->getBlendMode(),
920 layer->getSourceCrop().left, layer->getSourceCrop().top, layer->getSourceCrop().right, layer->getSourceCrop().bottom,
921 layer->getDisplayFrame().left, layer->getDisplayFrame().top, layer->getDisplayFrame().right, layer->getDisplayFrame().bottom);
922 }
923}
924
925void PhysicalDevice::dumpLayers(KeyedVector<hwc2_layer_t, HwcLayer*> layers) {
926 for (uint32_t x=0; x<layers.size(); x++) {
927 HwcLayer* layer = layers.valueAt(x);
928 static char const* compositionTypeName[] = {
929 "UNKNOWN",
930 "GLES",
931 "HWC",
932 "SOLID",
933 "HWC_CURSOR",
934 "SIDEBAND"};
935 ETRACE(" %11s | %12" PRIxPTR " | %10d | %02x | %1.2f | %02x | %04x |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d \n",
936 compositionTypeName[layer->getCompositionType()],
937 intptr_t(layer->getBufferHandle()), layer->getZ(), layer->getDataspace(),
938 layer->getPlaneAlpha(), layer->getTransform(), layer->getBlendMode(),
939 layer->getSourceCrop().left, layer->getSourceCrop().top, layer->getSourceCrop().right, layer->getSourceCrop().bottom,
940 layer->getDisplayFrame().left, layer->getDisplayFrame().top, layer->getDisplayFrame().right, layer->getDisplayFrame().bottom);
941 }
942}
943
944bool PhysicalDevice::layersStateCheck(int32_t renderMode,
945 KeyedVector<hwc2_layer_t, HwcLayer*> & composeLayers) {
946 bool ret = false;
947 uint32_t layerNum = composeLayers.size();
948 hwc_frect_t sourceCrop[HWC2_MAX_LAYERS];
949 HwcLayer* layer[HWC2_MAX_LAYERS] = { NULL };
950 private_handle_t const* hnd[HWC2_MAX_LAYERS] = { NULL };
951 hwc_rect_t displayFrame[HWC2_MAX_LAYERS];
952
953 for (int32_t i=0; i<layerNum; i++) {
954 layer[i] = composeLayers.valueAt(i);
955 sourceCrop[i] = layer[i]->getSourceCrop();
956 displayFrame[i] = layer[i]->getDisplayFrame();
957 hnd[i] = reinterpret_cast<private_handle_t const*>(layer[i]->getBufferHandle());
958 if (hnd[i] == NULL) return false; // no buffer to process.
959 if (hnd[i]->share_fd == -1) return false; // no buffer to process.
960 DTRACE("layer[%d] zorder: %d, blend: %d, PlaneAlpha: %f, "
961 "mColor: [%d, %d, %d, %d], mDataSpace: %d, format hnd[%d]: %x",
962 i, layer[i]->getZ(), layer[i]->getBlendMode(), layer[i]->getPlaneAlpha(),
963 layer[i]->getColor().r, layer[i]->getColor().g, layer[i]->getColor().b,
964 layer[i]->getColor().a, layer[i]->getDataspace(), i, hnd[i]->format);
965 }
966
967 if (renderMode == DIRECT_COMPOSE_MODE) {
968 switch (hnd[0]->format) {
969 case HAL_PIXEL_FORMAT_RGBA_8888:
970 case HAL_PIXEL_FORMAT_RGBX_8888:
971 case HAL_PIXEL_FORMAT_RGB_888:
972 case HAL_PIXEL_FORMAT_RGB_565:
973 case HAL_PIXEL_FORMAT_BGRA_8888:
974 DTRACE("Layer format match direct composer.");
975 ret = true;
976 break;
977 default:
978 DTRACE("Layer format not support by direct compose");
979 return false;
980 break;
981 }
982 if (layer[0]->isCropped()
983 || layer[0]->isScaled()
984 || layer[0]->isOffset()) {
985 DTRACE("direct compose can not process!");
986 return false;
987 }
988 }
989#ifdef ENABLE_AML_GE2D_COMPOSER
990 else if (renderMode == GE2D_COMPOSE_MODE) {
991 bool yuv420Sp = false;
992 for (int32_t i=0; i<layerNum; i++) {
993 switch (hnd[i]->format) {
994 case HAL_PIXEL_FORMAT_YCrCb_420_SP:
995 yuv420Sp = true;
996 case HAL_PIXEL_FORMAT_RGBA_8888:
997 case HAL_PIXEL_FORMAT_RGBX_8888:
998 case HAL_PIXEL_FORMAT_RGB_888:
999 case HAL_PIXEL_FORMAT_RGB_565:
1000 case HAL_PIXEL_FORMAT_BGRA_8888:
1001 case HAL_PIXEL_FORMAT_YV12:
1002 case HAL_PIXEL_FORMAT_Y8:
1003 case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1004 case HAL_PIXEL_FORMAT_YCbCr_422_I:
1005 DTRACE("Layer format match ge2d composer.");
1006 ret = true;
1007 break;
1008 default:
1009 DTRACE("Layer format not support by ge2d");
1010 return false;
1011 break;
1012 }
1013 if (layer[i]->havePlaneAlpha()
1014 || layer[i]->haveColor()
1015 || layer[i]->haveDataspace()
1016 || (layer[i]->isBlended()
1017 && layer[i]->isScaled())) {
1018 DTRACE("ge2d compose can not process!");
1019 return false;
1020 }
1021 }
1022#if 0
1023 if (yuv420Sp && HWC2_TWO_LAYERS == layerNum) {
1024 if (Utils::compareRect(sourceCrop[0], sourceCrop[1])
1025 && Utils::compareRect(sourceCrop[0], displayFrame[0])
1026 && Utils::compareRect(sourceCrop[1], displayFrame[1])) {
1027 DTRACE("2 layers is same size and have yuv420sp format ge2d compose can not process!");
1028 return false;
1029 }
1030 }
1031#endif
1032 if (HWC2_TWO_LAYERS == layerNum
1033 && (!Utils::compareSize(sourceCrop[0], sourceCrop[1])
1034 || !Utils::compareSize(displayFrame[0], displayFrame[1]))) {
1035 DTRACE("when 2 layer's size is difference, ge2d compose can not process!");
1036 return false;
1037 }
1038 }
1039#endif
1040
1041 return ret;
1042}
1043
1044/*************************************************************
1045 * For direct framebuffer composer:
1046 * 1) only support one layer.
1047 * 2) layer format: rgba, rgbx,rgb565,bgra;
1048 * 3) layer no need scale to display;
1049 * 4) layer has no offset to display;
1050
1051 * For ge2d composer:
1052 * 1) support layer format that direct composer can't support.
1053 * 2) support 2 layers blending.
1054 * 3) support scale and rotation etc.
1055**************************************************************/
1056int32_t PhysicalDevice::composersFilter(
1057 KeyedVector<hwc2_layer_t, HwcLayer*> & composeLayers) {
1058
1059 // direct Composer.
1060 if (composeLayers.size() == HWC2_ONE_LAYER) {
1061 // if only one layer exists, do direct framebuffer composer.
1062 bool directCompose = layersStateCheck(DIRECT_COMPOSE_MODE, composeLayers);
1063 if (directCompose) {
1064 if (mDirectComposeFrameCount >= 3) {
1065 hwc2_layer_t layerGlesLayerId = composeLayers.keyAt(0);
1066 composeLayers.clear();
1067 mDirectRenderLayerId = layerGlesLayerId;
1068 return DIRECT_COMPOSE_MODE;
1069 }
1070 mDirectComposeFrameCount++;
1071 return GLES_COMPOSE_MODE;
1072 }
1073 }
1074
1075#ifdef ENABLE_AML_GE2D_COMPOSER
1076 // if direct composer can't work, try this.
1077 if (composeLayers.size() > HWC2_NO_LAYER
1078 && composeLayers.size() < HWC2_MAX_LAYERS) {
1079 bool ge2dCompose = layersStateCheck(GE2D_COMPOSE_MODE, composeLayers);
1080 if (!ge2dCompose) return GLES_COMPOSE_MODE;
1081 mGE2DRenderSortedLayerIds.clear();
1082 for (uint32_t i=0; i<composeLayers.size(); i++) {
1083 hwc2_layer_t layerGlesLayerId = composeLayers.keyAt(i);
1084 HwcLayer* layer = getLayerById(layerGlesLayerId);
1085 if (0 == i) {
1086 mGE2DRenderSortedLayerIds.push_front(layerGlesLayerId);
1087 continue;
1088 }
1089 for (uint32_t j=0; j<i; j++) {
1090 HwcLayer* layer1 = getLayerById(mGE2DRenderSortedLayerIds.itemAt(j));
1091 HwcLayer* layer2 = getLayerById(layerGlesLayerId);
1092 if (layer1 != NULL && layer2 != NULL) {
1093 uint32_t z1 = layer1->getZ();
1094 uint32_t z2 = layer2->getZ();
1095 if (layer1->getZ() > layer2->getZ()) {
1096 mGE2DRenderSortedLayerIds.insertAt(layerGlesLayerId, j, 1);
1097 break;
1098 }
1099 if (j == i-1) mGE2DRenderSortedLayerIds.push_back(layerGlesLayerId);
1100 } else {
1101 ETRACE("Layer1 or Layer2 is NULL!!!");
1102 }
1103 }
1104 }
1105
1106 // Vector < hwc2_layer_t > layerIds;
1107 if (!mComposer) {
1108 // create ge2d composer...
1109 mComposer = mControlFactory->createComposer(*this);
1110 if (!mComposer || !mComposer->initialize(mFramebufferContext->getInfo())) {
1111 DEINIT_AND_DELETE_OBJ(mComposer);
1112 return GLES_COMPOSE_MODE;
1113 }
1114 }
1115 composeLayers.clear();
1116 return GE2D_COMPOSE_MODE;
1117 }
1118#endif
1119
1120 return GLES_COMPOSE_MODE;
1121}
1122
1123int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
1124 uint32_t* outNumRequests) {
1125 HwcLayer* layer = NULL;
1126 bool istvp = false;
1127 KeyedVector<hwc2_layer_t, HwcLayer*> composeLayers;
1128 composeLayers.clear();
1129
1130 mRenderMode = GLES_COMPOSE_MODE;
1131 mVideoOverlayLayerId = 0;
1132 mIsContinuousBuf = true;
1133 swapReleaseFence();
1134 memset(&mFbSyncRequest, 0, sizeof(mFbSyncRequest));
1135 mHwcGlesLayers.clear();
1136 mIsValidated = false;
1137
1138 for (uint32_t i=0; i<mHwcLayers.size(); i++) {
1139 hwc2_layer_t layerId = mHwcLayers.keyAt(i);
1140 layer = mHwcLayers.valueAt(i);
1141 if (layer != NULL) {
1142 // Physical Display.
1143 private_handle_t const* hnd =
1144 reinterpret_cast<private_handle_t const*>(layer->getBufferHandle());
1145 if (hnd) {
1146 // continous buffer.
1147 if (!(hnd->flags & private_handle_t::PRIV_FLAGS_CONTINUOUS_BUF
1148 || hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY)) {
1149 DTRACE("continous buffer flag is not set, bufhnd: 0x%" PRIxPTR "", intptr_t(layer->getBufferHandle()));
1150 mIsContinuousBuf = false;
1151 }
1152#ifdef HWC_ENABLE_SECURE_LAYER
1153 // secure or protected layer.
1154 if (!mSecure && (hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_PROTECTED)) {
1155 ETRACE("layer's secure or protected buffer flag is set!");
1156 if (layer->getCompositionType() != HWC2_COMPOSITION_DEVICE) {
1157 mHwcLayersChangeType.add(layerId, layer);
1158 }
1159 mHwcSecureLayers.add(layerId, layer);
1160 continue;
1161 }
1162#endif
1163 if (layer->getCompositionType() == HWC2_COMPOSITION_DEVICE) {
1164 // video overlay.
1165 if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OMX) {
1166 set_omx_pts((char*)hnd->base, &Amvideo_Handle);
1167 istvp = true;
1168 }
1169 if (hnd->flags & private_handle_t::PRIV_FLAGS_VIDEO_OVERLAY) {
1170 DTRACE("PRIV_FLAGS_VIDEO_OVERLAY!!!!");
1171 mVideoOverlayLayerId = layerId;
1172 mHwcLayersChangeRequest.add(layerId, layer);
1173 continue;
1174 }
1175
1176 composeLayers.add(layerId, layer);
1177 continue;
1178 }
1179 }
1180
1181 // cursor layer.
1182 if (layer->getCompositionType() == HWC2_COMPOSITION_CURSOR) {
1183 DTRACE("This is a Cursor layer!");
1184 mHwcLayersChangeRequest.add(layerId, layer);
1185 continue;
1186 }
1187
1188 // sideband stream.
1189 if (layer->getCompositionType() == HWC2_COMPOSITION_SIDEBAND
1190 && layer->getSidebandStream()) {
1191 // TODO: we just transact SIDEBAND to OVERLAY for now;
1192 DTRACE("get HWC_SIDEBAND layer, just change to overlay");
1193 mHwcLayersChangeRequest.add(layerId, layer);
1194 mHwcLayersChangeType.add(layerId, layer);
1195 mVideoOverlayLayerId = layerId;
1196 continue;
1197 }
1198
1199 // solid color.
1200 if (layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
1201 DTRACE("This is a Solid Color layer!");
1202 // mHwcLayersChangeRequest.add(layerId, layer);
1203 // mHwcLayersChangeType.add(layerId, layer);
1204 composeLayers.add(layerId, layer);
1205 continue;
1206 }
1207
1208 if (layer->getCompositionType() == HWC2_COMPOSITION_CLIENT) {
1209 mHwcGlesLayers.add(layerId, layer);
1210 DTRACE("Meet a client layer!");
1211 }
1212 }
1213 }
1214
1215 bool noDevComp = Utils::checkBoolProp("sys.sf.debug.nohwc");
1216#ifndef USE_CONTINOUS_BUFFER_COMPOSER
1217 DTRACE("No continous buffer composer!");
1218 noDevComp = true;
1219 mIsContinuousBuf = false;
1220#endif
1221
1222 if (mHwcLayers.size() == 0) {
1223 mIsContinuousBuf = false;
1224 }
1225
1226 // dumpLayers(mHwcLayers);
1227 if (mIsContinuousBuf && !noDevComp && (mHwcGlesLayers.size() == 0)) {
1228 mRenderMode = composersFilter(composeLayers);
1229 } else {
1230 mDirectComposeFrameCount = 0;
1231 }
1232
1233 //DEVICE_COMPOSE layers set to CLIENT_COMPOSE layers.
1234 for (int i=0; i<composeLayers.size(); i++) {
1235 mHwcLayersChangeType.add(composeLayers.keyAt(i), composeLayers.valueAt(i));
1236 mHwcGlesLayers.add(composeLayers.keyAt(i), composeLayers.valueAt(i));
1237 }
1238
1239 if (istvp == false && Amvideo_Handle!=0) {
1240 closeamvideo();
1241 Amvideo_Handle = 0;
1242 }
1243
1244 if (mHwcLayersChangeRequest.size() > 0) {
1245 DTRACE("There are %d layer requests.", mHwcLayersChangeRequest.size());
1246 *outNumRequests = mHwcLayersChangeRequest.size();
1247 }
1248
1249 mIsValidated = true;
1250
1251 if (mHwcLayersChangeType.size() > 0) {
1252 DTRACE("there are %d layer types has changed.", mHwcLayersChangeType.size());
1253 *outNumTypes = mHwcLayersChangeType.size();
1254 return HWC2_ERROR_HAS_CHANGES;
1255 }
1256
1257 return HWC2_ERROR_NONE;
1258}
1259
1260int32_t PhysicalDevice::setCursorPosition(hwc2_layer_t layerId, int32_t x, int32_t y) {
1261 HwcLayer* layer = getLayerById(layerId);
1262 if (layer && HWC2_COMPOSITION_CURSOR == layer->getCompositionType()) {
1263 framebuffer_info_t* cbInfo = mCursorContext->getInfo();
1264 fb_cursor cinfo;
1265 if (cbInfo->fd < 0) {
1266 ETRACE("setCursorPosition fd=%d", cbInfo->fd );
1267 }else {
1268 cinfo.hot.x = x;
1269 cinfo.hot.y = y;
1270 DTRACE("setCursorPosition x_pos=%d, y_pos=%d", cinfo.hot.x, cinfo.hot.y);
1271
1272 // from kernel 4.9 use FBIOPUT_OSD_CURSOR instead of FBIO_CURSOR
1273 if (mUsingPutCurosr)
1274 ioctl(cbInfo->fd, FBIOPUT_OSD_CURSOR, &cinfo);
1275 else
1276 ioctl(cbInfo->fd, FBIO_CURSOR, &cinfo);
1277 }
1278 } else {
1279 ETRACE("setCursorPosition bad layer.");
1280 return HWC2_ERROR_BAD_LAYER;
1281 }
1282
1283 return HWC2_ERROR_NONE;
1284}
1285
1286
1287/*
1288Operater of framebuffer
1289*/
1290int32_t PhysicalDevice::initDisplay() {
1291 if (mIsConnected) return 0;
1292
1293 Mutex::Autolock _l(mLock);
1294
1295 if (!mFramebufferHnd) {
1296 // init framebuffer context.
1297 mFramebufferContext = new FBContext();
1298 framebuffer_info_t* fbInfo = mFramebufferContext->getInfo();
1299 // init information from osd.
1300 fbInfo->displayType = mId;
1301 fbInfo->fbIdx = getOsdIdx(mId);
1302 int32_t err = init_frame_buffer_locked(fbInfo);
1303 int32_t bufferSize = fbInfo->finfo.line_length
1304 * fbInfo->info.yres;
1305 DTRACE("init_frame_buffer get fbinfo->fbIdx (%d) "
1306 "fbinfo->info.xres (%d) fbinfo->info.yres (%d)",
1307 fbInfo->fbIdx, fbInfo->info.xres,
1308 fbInfo->info.yres);
1309 int32_t usage = 0;
1310 private_module_t *grallocModule = Hwcomposer::getInstance().getGrallocModule();
1311 if (mId == HWC_DISPLAY_PRIMARY) {
1312 grallocModule->fb_primary.fb_info = *(fbInfo);
1313 } else if (mId == HWC_DISPLAY_EXTERNAL) {
1314 grallocModule->fb_external.fb_info = *(fbInfo);
1315 usage |= GRALLOC_USAGE_EXTERNAL_DISP;
1316 }
1317 fbInfo->grallocModule = grallocModule;
1318
1319 //Register the framebuffer to gralloc module
1320 mFramebufferHnd = new private_handle_t(
1321 private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
1322 usage, fbInfo->fbSize, 0,
1323 0, fbInfo->fd, bufferSize, 0);
1324 grallocModule->base.registerBuffer(&(grallocModule->base), mFramebufferHnd);
1325 DTRACE("init_frame_buffer get frame size %d usage %d",
1326 bufferSize, usage);
1327 }
1328
1329 mIsConnected = true;
1330
1331 // init cursor framebuffer
1332 mCursorContext = new FBContext();
1333 framebuffer_info_t* cbInfo = mCursorContext->getInfo();
1334 cbInfo->fd = -1;
1335
1336 //init information from cursor framebuffer.
1337 cbInfo->fbIdx = mId*2+1;
1338 if (1 != cbInfo->fbIdx && 3 != cbInfo->fbIdx) {
1339 ETRACE("invalid fb index: %d, need to check!",
1340 cbInfo->fbIdx);
1341 return 0;
1342 }
1343 int32_t err = init_cursor_buffer_locked(cbInfo);
1344 if (err != 0) {
1345 ETRACE("init_cursor_buffer_locked failed, need to check!");
1346 return 0;
1347 }
1348 ITRACE("init_cursor_buffer get cbinfo->fbIdx (%d) "
1349 "cbinfo->info.xres (%d) cbinfo->info.yres (%d)",
1350 cbInfo->fbIdx,
1351 cbInfo->info.xres,
1352 cbInfo->info.yres);
1353
1354 if ( cbInfo->fd >= 0) {
1355 DTRACE("init_cursor_buffer success!");
1356 }else{
1357 DTRACE("init_cursor_buffer fail!");
1358 }
1359
1360 return 0;
1361}
1362
1363bool PhysicalDevice::updateDisplayConfigs() {
1364 Mutex::Autolock _l(mLock);
1365 bool ret;
1366
1367 if (!mIsConnected) {
1368 ETRACE("disp: %llu is not connected", mId);
1369 return false;
1370 }
1371
1372 framebuffer_info_t* fbinfo = mFramebufferContext->getInfo();
1373 ret = Utils::checkVinfo(fbinfo);
1374 if (!ret) {
1375 ETRACE("checkVinfo fail");
1376 return false;
1377 }
1378
1379 mDisplayHdmi->updateHotplug(mIsConnected, fbinfo, mFramebufferHnd);
1380 if (mIsConnected)
1381 mVsyncObserver->setRefreshRate(mDisplayHdmi->getActiveRefreshRate());
1382 //ETRACE("updateDisplayConfigs rate:%d", mDisplayHdmi->getActiveRefreshRate());
1383
1384 // check hdcp authentication status when hotplug is happen.
1385 if (mSystemControl == NULL) {
1386 mSystemControl = getSystemControlService();
1387 } else {
1388 DTRACE("already have system control instance.");
1389 }
1390 if (mSystemControl != NULL) {
1391 // mSecure = Utils::checkHdcp();
1392 int status = 0;
1393 mSystemControl->isHDCPTxAuthSuccess(status);
1394 DTRACE("hdcp status: %d", status);
1395 mSecure = (status == 1) ? true : false;
1396 } else {
1397 ETRACE("can't get system control.");
1398 }
1399
1400 return true;
1401}
1402
1403sp<ISystemControlService> PhysicalDevice::getSystemControlService()
1404{
1405 sp<IServiceManager> sm = defaultServiceManager();
1406 if (sm == NULL) {
1407 ETRACE("Couldn't get default ServiceManager\n");
1408 return NULL;
1409 }
1410 sp<IBinder> binder = sm->getService(String16("system_control"));
1411 sp<ISystemControlService> sc = interface_cast<ISystemControlService>(binder);
1412
1413 return sc;
1414}
1415
1416void PhysicalDevice::onVsync(int64_t timestamp) {
1417 RETURN_VOID_IF_NOT_INIT();
1418 ATRACE("timestamp = %lld", timestamp);
1419
1420 if (!mIsConnected)
1421 return;
1422
1423 // notify hwc
1424 mHwc.vsync(mId, timestamp);
1425}
1426
1427int32_t PhysicalDevice::createVirtualDisplay(
1428 uint32_t width,
1429 uint32_t height,
1430 int32_t* /*android_pixel_format_t*/ format,
1431 hwc2_display_t* outDisplay) {
1432
1433 return HWC2_ERROR_NONE;
1434}
1435
1436int32_t PhysicalDevice::destroyVirtualDisplay(
1437 hwc2_display_t display) {
1438
1439 return HWC2_ERROR_NONE;
1440}
1441
1442int32_t PhysicalDevice::setOutputBuffer(
1443 buffer_handle_t buffer, int32_t releaseFence) {
1444 // Virtual Display Only.
1445 return HWC2_ERROR_NONE;
1446}
1447
1448void PhysicalDevice::updateHotplugState(bool connected) {
1449 Mutex::Autolock _l(mLock);
1450
1451 mIsConnected = connected;
1452 //if plug out, need reinit
1453 if (!connected)
1454 mHdrCapabilities.init = false;
1455}
1456
1457int32_t PhysicalDevice::getLineValue(const char *lineStr, const char *magicStr) {
1458 int len = 0;
1459 char value[100] = {0};
1460 char *pos = NULL;
1461
1462 if ((NULL == lineStr) || (NULL == magicStr)) {
1463 ETRACE("line string: %s, magic string: %s\n", lineStr, magicStr);
1464 return 0;
1465 }
1466
1467 if (NULL != (pos = strstr((char *)lineStr, magicStr))) {
1468 pos = pos + strlen(magicStr);
1469 char* start = pos;
1470 while (*start != '\n' && (strlen(start) > 0))
1471 start++;
1472
1473 len = start - pos;
1474 strncpy(value, pos, len);
1475 value[len] = '\0';
1476 return atoi(value);
1477 }
1478
1479 return 0;
1480}
1481
1482/*
1483cat /sys/class/amhdmitx/amhdmitx0/hdr_cap
1484Supported EOTF:
1485 Traditional SDR: 1
1486 Traditional HDR: 0
1487 SMPTE ST 2084: 1
1488 Future EOTF: 0
1489Supported SMD type1: 1
1490Luminance Data
1491 Max: 0
1492 Avg: 0
1493 Min: 0
1494cat /sys/class/amhdmitx/amhdmitx0/dv_cap
1495DolbyVision1 RX support list:
1496 2160p30hz: 1
1497 global dimming
1498 colorimetry
1499 IEEEOUI: 0x00d046
1500 DM Ver: 1
1501*/
1502int32_t PhysicalDevice::parseHdrCapabilities() {
1503 //DolbyVision1
1504 const char *DV_PATH = "/sys/class/amhdmitx/amhdmitx0/dv_cap";
1505 //HDR
1506 const char *HDR_PATH = "/sys/class/amhdmitx/amhdmitx0/hdr_cap";
1507
1508 char buf[1024+1] = {0};
1509 char* pos = buf;
1510 int fd, len;
1511
1512 memset(&mHdrCapabilities, 0, sizeof(hdr_capabilities_t));
1513 if ((fd = open(DV_PATH, O_RDONLY)) < 0) {
1514 ETRACE("open %s fail.", DV_PATH);
1515 goto exit;
1516 }
1517
1518 len = read(fd, buf, 1024);
1519 if (len < 0) {
1520 ETRACE("read error: %s, %s\n", DV_PATH, strerror(errno));
1521 goto exit;
1522 }
1523 close(fd);
1524
1525 if ((NULL != strstr(pos, "2160p30hz")) || (NULL != strstr(pos, "2160p60hz")))
1526 mHdrCapabilities.dvSupport = true;
1527 //dobly version parse end
1528
1529 memset(buf, 0, 1024);
1530 if ((fd = open(HDR_PATH, O_RDONLY)) < 0) {
1531 ETRACE("open %s fail.", HDR_PATH);
1532 goto exit;
1533 }
1534
1535 len = read(fd, buf, 1024);
1536 if (len < 0) {
1537 ETRACE("read error: %s, %s\n", HDR_PATH, strerror(errno));
1538 goto exit;
1539 }
1540
1541 pos = strstr(pos, "SMPTE ST 2084: ");
1542 if ((NULL != pos) && ('1' == *(pos + strlen("SMPTE ST 2084: ")))) {
1543 mHdrCapabilities.hdrSupport = true;
1544
1545 mHdrCapabilities.maxLuminance = getLineValue(pos, "Max: ");
1546 mHdrCapabilities.avgLuminance = getLineValue(pos, "Avg: ");
1547 mHdrCapabilities.minLuminance = getLineValue(pos, "Min: ");
1548 }
1549
1550 ITRACE("dolby version support:%d, hdr support:%d max:%d, avg:%d, min:%d\n",
1551 mHdrCapabilities.dvSupport?1:0, mHdrCapabilities.hdrSupport?1:0, mHdrCapabilities.maxLuminance, mHdrCapabilities.avgLuminance, mHdrCapabilities.minLuminance);
1552exit:
1553 close(fd);
1554 return HWC2_ERROR_NONE;
1555}
1556
1557void PhysicalDevice::dump(Dump& d) {
1558 Mutex::Autolock _l(mLock);
1559 d.append("-------------------------------------------------------------"
1560 "----------------------------------------------------------------\n");
1561 d.append("Device Name: %s (%s)\n", mName,
1562 mIsConnected ? "connected" : "disconnected");
1563 mDisplayHdmi->dump(d);
1564
1565 // dump layer list
1566 d.append(" Layers state:\n");
1567 d.append(" numLayers=%zu\n", mHwcLayers.size());
1568 // d.append(" numChangedTypeLayers=%zu\n", mHwcLayersChangeType.size());
1569 // d.append(" numChangedRequestLayers=%zu\n", mHwcLayersChangeRequest.size());
1570
1571 if (mHwcLayers.size() > 0) {
1572 d.append(
1573 " type | handle | zorder | ds | alpa | tr | blnd |"
1574 " source crop (l,t,r,b) | frame \n"
1575 " -------------+--------------+------------+----+------+----+------+"
1576 "--------------------------------+------------------------\n");
1577 for (uint32_t i=0; i<mHwcLayers.size(); i++) {
1578 hwc2_layer_t layerId = mHwcLayers.keyAt(i);
1579 HwcLayer *layer = mHwcLayers.valueAt(i);
1580 if (layer) layer->dump(d);
1581 }
1582 }
1583
1584 // HDR info
1585 d.append(" HDR Capabilities:\n");
1586 d.append(" DolbyVision1=%zu\n", mHdrCapabilities.dvSupport?1:0);
1587 d.append(" HDR10=%zu, maxLuminance=%zu, avgLuminance=%zu, minLuminance=%zu\n",
1588 mHdrCapabilities.hdrSupport?1:0, mHdrCapabilities.maxLuminance, mHdrCapabilities.avgLuminance, mHdrCapabilities.minLuminance);
1589}
1590
1591} // namespace amlogic
1592} // namespace android
1593