19d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 29d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Copyright (C) 2010 The Android Open Source Project 39d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * 49d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Licensed under the Apache License, Version 2.0 (the "License"); 59d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * you may not use this file except in compliance with the License. 69d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * You may obtain a copy of the License at 79d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * 89d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * http://www.apache.org/licenses/LICENSE-2.0 99d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * 109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Unless required by applicable law or agreed to in writing, software 119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * distributed under the License is distributed on an "AS IS" BASIS, 129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * See the License for the specific language governing permissions and 149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * limitations under the License. 159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#define ATRACE_TAG ATRACE_TAG_GRAPHICS 189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <inttypes.h> 209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <math.h> 219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <stdint.h> 229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <stdio.h> 239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <stdlib.h> 249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <string.h> 259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <sys/types.h> 269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/Errors.h> 289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/misc.h> 299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/NativeHandle.h> 309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/String8.h> 319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/Thread.h> 329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/Trace.h> 339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <utils/Vector.h> 349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <ui/GraphicBuffer.h> 369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <hardware/hardware.h> 389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <hardware/hwcomposer.h> 399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <android/configuration.h> 419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <cutils/properties.h> 437823e124e00576e20e47ec717cbe8bc89f0f2bf2Mark Salyzyn#include <log/log.h> 449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include <system/graphics.h> 469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include "HWComposer.h" 489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include "../Layer.h" // needed only for debugging 509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#include "../SurfaceFlinger.h" 519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardnamespace android { 539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#define MIN_HWC_HEADER_VERSION HWC_HEADER_VERSION 559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic uint32_t hwcApiVersion(const hwc_composer_device_1_t* hwc) { 579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t hwcVersion = hwc->common.version; 589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return hwcVersion & HARDWARE_API_VERSION_2_MAJ_MIN_MASK; 599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic uint32_t hwcHeaderVersion(const hwc_composer_device_1_t* hwc) { 629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t hwcVersion = hwc->common.version; 639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return hwcVersion & HARDWARE_API_VERSION_2_HEADER_MASK; 649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic bool hwcHasApiVersion(const hwc_composer_device_1_t* hwc, 679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t version) { 689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return hwcApiVersion(hwc) >= (version & HARDWARE_API_VERSION_2_MAJ_MIN_MASK); 699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// --------------------------------------------------------------------------- 729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstruct HWComposer::cb_context { 749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard struct callbacks : public hwc_procs_t { 759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // these are here to facilitate the transition when adding 769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // new callbacks (an implementation can check for NULL before 779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // calling a new callback). 789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard void (*zero[4])(void); 799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard }; 809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard callbacks procs; 819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWComposer* hwc; 829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; 839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// --------------------------------------------------------------------------- 859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 869d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::HWComposer( 879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<SurfaceFlinger>& flinger, 889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard EventHandler& handler) 899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard : mFlinger(flinger), 909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFbDev(0), mHwc(0), mNumDisplays(1), 919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext(new cb_context), 929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mEventHandler(handler), 939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDebugForceFakeVSync(false) 949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i =0 ; i<MAX_HWC_DISPLAYS ; i++) { 969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i] = 0; 979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) { 1009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLastHwVSync[i] = 0; 1019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVSyncCounts[i] = 0; 1029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard char value[PROPERTY_VALUE_MAX]; 1059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard property_get("debug.sf.no_hw_vsync", value, "0"); 1069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDebugForceFakeVSync = atoi(value); 1079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard bool needVSyncThread = true; 1099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Note: some devices may insist that the FB HAL be opened before HWC. 1119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fberr = loadFbHalModule(); 1129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard loadHwcModule(); 1139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mFbDev && mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 1159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // close FB HAL if we don't needed it. 1169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // FIXME: this is temporary until we're not forced to open FB HAL 1179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // before HWC. 1189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard framebuffer_close(mFbDev); 1199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFbDev = NULL; 1209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // If we have no HWC, or a pre-1.1 HWC, an FB dev is mandatory. 1239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if ((!mHwc || !hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) 1249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard && !mFbDev) { 1259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("ERROR: failed to open framebuffer (%s), aborting", 1269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard strerror(-fberr)); 1279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard abort(); 1289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // these display IDs are always reserved 1319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<NUM_BUILTIN_DISPLAYS ; i++) { 1329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mAllocatedDisplayIDs.markBit(i); 1339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 1369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGI("Using %s version %u.%u", HWC_HARDWARE_COMPOSER, 1379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard (hwcApiVersion(mHwc) >> 24) & 0xff, 1389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard (hwcApiVersion(mHwc) >> 16) & 0xff); 1399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc->registerProcs) { 1409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext->hwc = this; 1419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext->procs.invalidate = &hook_invalidate; 1429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext->procs.vsync = &hook_vsync; 1439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) 1449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext->procs.hotplug = &hook_hotplug; 1459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard else 1469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCBContext->procs.hotplug = NULL; 1479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero)); 1489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc->registerProcs(mHwc, &mCBContext->procs); 1499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // don't need a vsync thread if we have a hardware composer 1529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard needVSyncThread = false; 1539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // always turn vsync off when we start 1549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard eventControl(HWC_DISPLAY_PRIMARY, HWC_EVENT_VSYNC, 0); 1559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // the number of displays we actually have depends on the 1579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // hw composer version 1589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) { 1599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // 1.3 adds support for virtual displays 1609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mNumDisplays = MAX_HWC_DISPLAYS; 1619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 1629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // 1.1 adds support for multiple displays 1639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mNumDisplays = NUM_BUILTIN_DISPLAYS; 1649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 1659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mNumDisplays = 1; 1669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mFbDev) { 1709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOG_ASSERT(!(mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)), 1719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "should only have fbdev if no hwc or hwc is 1.0"); 1729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[HWC_DISPLAY_PRIMARY]); 1749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.connected = true; 1759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.format = mFbDev->format; 1769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayConfig config = DisplayConfig(); 1779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.width = mFbDev->width; 1789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.height = mFbDev->height; 1799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.xdpi = mFbDev->xdpi; 1809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.ydpi = mFbDev->ydpi; 1819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.refresh = nsecs_t(1e9 / mFbDev->fps); 1829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.configs.push_back(config); 1839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.currentConfig = 0; 1849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else if (mHwc) { 1859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're guaranteed to have at least HWC 1.1 1869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i =0 ; i<NUM_BUILTIN_DISPLAYS ; i++) { 1879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard queryDisplayProperties(i); 1889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (needVSyncThread) { 1929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we don't have VSYNC support, we need to fake it 1939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVSyncThread = new VSyncThread(*this); 1949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 1959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 1969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 1979d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::~HWComposer() { 1989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 1999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard eventControl(HWC_DISPLAY_PRIMARY, HWC_EVENT_VSYNC, 0); 2009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mVSyncThread != NULL) { 2029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVSyncThread->requestExitAndWait(); 2039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 2059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_close_1(mHwc); 2069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mFbDev) { 2089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard framebuffer_close(mFbDev); 2099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard delete mCBContext; 2119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// Load and prepare the hardware composer module. Sets mHwc. 2149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::loadHwcModule() 2159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 2169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hw_module_t const* module; 2179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hw_get_module(HWC_HARDWARE_MODULE_ID, &module) != 0) { 2199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("%s module not found", HWC_HARDWARE_MODULE_ID); 2209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 2219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int err = hwc_open_1(module, &mHwc); 2249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err) { 2259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("%s device failed to initialize (%s)", 2269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_HARDWARE_COMPOSER, strerror(-err)); 2279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 2289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_0) || 2319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwcHeaderVersion(mHwc) < MIN_HWC_HEADER_VERSION || 2329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwcHeaderVersion(mHwc) > HWC_HEADER_VERSION) { 2339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("%s device version %#x unsupported, will not be used", 2349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_HARDWARE_COMPOSER, mHwc->common.version); 2359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_close_1(mHwc); 2369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc = NULL; 2379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 2389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// Load and prepare the FB HAL, which uses the gralloc module. Sets mFbDev. 2429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardint HWComposer::loadFbHalModule() 2439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 2449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hw_module_t const* module; 2459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module); 2479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != 0) { 2489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("%s module not found", GRALLOC_HARDWARE_MODULE_ID); 2499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return err; 2509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return framebuffer_open(module, &mFbDev); 2539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::initCheck() const { 2569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mHwc ? NO_ERROR : NO_INIT; 2579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::hook_invalidate(const struct hwc_procs* procs) { 2609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard cb_context* ctx = reinterpret_cast<cb_context*>( 2619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const_cast<hwc_procs_t*>(procs)); 2629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ctx->hwc->invalidate(); 2639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::hook_vsync(const struct hwc_procs* procs, int disp, 2669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int64_t timestamp) { 2679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard cb_context* ctx = reinterpret_cast<cb_context*>( 2689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const_cast<hwc_procs_t*>(procs)); 2699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ctx->hwc->vsync(disp, timestamp); 2709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::hook_hotplug(const struct hwc_procs* procs, int disp, 2739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int connected) { 2749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard cb_context* ctx = reinterpret_cast<cb_context*>( 2759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const_cast<hwc_procs_t*>(procs)); 2769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ctx->hwc->hotplug(disp, connected); 2779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::invalidate() { 2803cfac28462910d3f976aebac54ac7301aca7e434Steven Thomas mEventHandler.onInvalidateReceived(this); 2819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 2829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::vsync(int disp, int64_t timestamp) { 2849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(disp) < HWC_NUM_PHYSICAL_DISPLAY_TYPES) { 2859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard { 2869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mLock); 2879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // There have been reports of HWCs that signal several vsync events 2899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // with the same timestamp when turning the display off and on. This 2909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // is a bug in the HWC implementation, but filter the extra events 2919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // out here so they don't cause havoc downstream. 2929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (timestamp == mLastHwVSync[disp]) { 2939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("Ignoring duplicate VSYNC event from HWC (t=%" PRId64 ")", 2949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard timestamp); 2959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 2969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 2979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 2989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLastHwVSync[disp] = timestamp; 2999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard char tag[16]; 3029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard snprintf(tag, sizeof(tag), "HW_VSYNC_%1u", disp); 3039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ATRACE_INT(tag, ++mVSyncCounts[disp] & 1); 3049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3053cfac28462910d3f976aebac54ac7301aca7e434Steven Thomas mEventHandler.onVSyncReceived(this, disp, timestamp); 3069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 3089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::hotplug(int disp, int connected) { 3109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp >= VIRTUAL_DISPLAY_ID_BASE) { 3119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("hotplug event received for invalid display: disp=%d connected=%d", 3129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp, connected); 3139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 3149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard queryDisplayProperties(disp); 3169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Do not teardown or recreate the primary display 3179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp != HWC_DISPLAY_PRIMARY) { 3187d3dcb9235ec149af2f5139a8a9c6eac859d92e2Stephen Kiazyk mEventHandler.onHotplugReceived(this, disp, bool(connected)); 3199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 3219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic float getDefaultDensity(uint32_t width, uint32_t height) { 3239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Default density is based on TVs: 1080p displays get XHIGH density, 3249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // lower-resolution displays get TV density. Maybe eventually we'll need 3259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // to update it for 4K displays, though hopefully those just report 3269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // accurate DPI information to begin with. This is also used for virtual 3279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // displays and even primary displays with older hwcomposers, so be 3289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // careful about orientation. 3299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t h = width < height ? width : height; 3319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (h >= 1080) return ACONFIGURATION_DENSITY_XHIGH; 3329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard else return ACONFIGURATION_DENSITY_TV; 3339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 3349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic const uint32_t DISPLAY_ATTRIBUTES[] = { 3369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_VSYNC_PERIOD, 3379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_WIDTH, 3389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_HEIGHT, 3399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_DPI_X, 3409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_DPI_Y, 3419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_COLOR_TRANSFORM, 3429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_NO_ATTRIBUTE, 3439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; 3449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard#define NUM_DISPLAY_ATTRIBUTES (sizeof(DISPLAY_ATTRIBUTES) / sizeof(DISPLAY_ATTRIBUTES)[0]) 3459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic const uint32_t PRE_HWC15_DISPLAY_ATTRIBUTES[] = { 3479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_VSYNC_PERIOD, 3489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_WIDTH, 3499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_HEIGHT, 3509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_DPI_X, 3519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_DPI_Y, 3529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWC_DISPLAY_NO_ATTRIBUTE, 3539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; 3549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::queryDisplayProperties(int disp) { 3569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_ALWAYS_FATAL_IF(!mHwc || !hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)); 3589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // use zero as default value for unspecified attributes 3609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int32_t values[NUM_DISPLAY_ATTRIBUTES - 1]; 3619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard memset(values, 0, sizeof(values)); 3629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const size_t MAX_NUM_CONFIGS = 128; 3649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t configs[MAX_NUM_CONFIGS] = {0}; 3659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t numConfigs = MAX_NUM_CONFIGS; 3669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = mHwc->getDisplayConfigs(mHwc, disp, configs, &numConfigs); 3679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 3689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this can happen if an unpluggable display is not connected 3699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].connected = false; 3709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return err; 3719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].currentConfig = 0; 3749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t c = 0; c < numConfigs; ++c) { 3759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc->getDisplayAttributes(mHwc, disp, configs[c], 3769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DISPLAY_ATTRIBUTES, values); 3779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // If this is a pre-1.5 HWC, it may not know about color transform, so 3789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // try again with a smaller set of attributes 3799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 3809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc->getDisplayAttributes(mHwc, disp, configs[c], 3819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard PRE_HWC15_DISPLAY_ATTRIBUTES, values); 3829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err != NO_ERROR) { 3849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we can't get this display's info. turn it off. 3859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].connected = false; 3869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return err; 3879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 3889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 3899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayConfig config = DisplayConfig(); 3909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 3919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard switch (DISPLAY_ATTRIBUTES[i]) { 3929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_VSYNC_PERIOD: 3939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.refresh = nsecs_t(values[i]); 3949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 3959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_WIDTH: 3969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.width = values[i]; 3979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 3989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_HEIGHT: 3999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.height = values[i]; 4009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 4019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_DPI_X: 4029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.xdpi = values[i] / 1000.0f; 4039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 4049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_DPI_Y: 4059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.ydpi = values[i] / 1000.0f; 4069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 4079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HWC_DISPLAY_COLOR_TRANSFORM: 4089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.colorMode = static_cast<android_color_mode_t>(values[i]); 4099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 4109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard default: 4119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOG_ASSERT(false, "unknown display attribute[%zu] %#x", 4129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard i, DISPLAY_ATTRIBUTES[i]); 4139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard break; 4149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (config.xdpi == 0.0f || config.ydpi == 0.0f) { 4189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard float dpi = getDefaultDensity(config.width, config.height); 4199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.xdpi = dpi; 4209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.ydpi = dpi; 4219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].configs.push_back(config); 4249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // FIXME: what should we set the format to? 4279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].format = HAL_PIXEL_FORMAT_RGBA_8888; 4289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].connected = true; 4299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 4309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setVirtualDisplayProperties(int32_t id, 4339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard uint32_t w, uint32_t h, uint32_t format) { 4349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (id < VIRTUAL_DISPLAY_ID_BASE || id >= int32_t(mNumDisplays) || 4359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard !mAllocatedDisplayIDs.hasBit(id)) { 4369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_INDEX; 4379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t configId = mDisplayData[id].currentConfig; 4399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[id].format = format; 4409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayConfig& config = mDisplayData[id].configs.editItemAt(configId); 4419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.width = w; 4429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.height = h; 4439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.xdpi = config.ydpi = getDefaultDensity(w, h); 4449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 4459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardint32_t HWComposer::allocateDisplayId() { 4489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mAllocatedDisplayIDs.count() >= mNumDisplays) { 4499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_MEMORY; 4509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int32_t id = mAllocatedDisplayIDs.firstUnmarkedBit(); 4529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mAllocatedDisplayIDs.markBit(id); 4539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[id].connected = true; 4549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[id].configs.resize(1); 4559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[id].currentConfig = 0; 4569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return id; 4579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::freeDisplayId(int32_t id) { 4609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (id < NUM_BUILTIN_DISPLAYS) { 4619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // cannot free the reserved IDs 4629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_VALUE; 4639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) { 4659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_INDEX; 4669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mAllocatedDisplayIDs.clearBit(id); 4689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[id].connected = false; 4699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 4709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardnsecs_t HWComposer::getRefreshTimestamp(int disp) const { 4739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this returns the last refresh timestamp. 4749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // if the last one is not available, we estimate it based on 4759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // the refresh period and whatever closest timestamp we have. 4769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mLock); 4779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t now = systemTime(CLOCK_MONOTONIC); 4789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t configId = mDisplayData[disp].currentConfig; 4799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return now - ((now - mLastHwVSync[disp]) % 4809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mDisplayData[disp].configs[configId].refresh); 4819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardsp<Fence> HWComposer::getDisplayFence(int disp) const { 4849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].lastDisplayFence; 4859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglarduint32_t HWComposer::getFormat(int disp) const { 4889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (static_cast<uint32_t>(disp) >= MAX_HWC_DISPLAYS || !mAllocatedDisplayIDs.hasBit(disp)) { 4899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return HAL_PIXEL_FORMAT_RGBA_8888; 4909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 4919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].format; 4929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 4939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool HWComposer::isConnected(int disp) const { 4969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].connected; 4979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 4989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 4999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglarduint32_t HWComposer::getWidth(int disp) const { 5009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].width; 5029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglarduint32_t HWComposer::getHeight(int disp) const { 5059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].height; 5079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardfloat HWComposer::getDpiX(int disp) const { 5109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].xdpi; 5129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardfloat HWComposer::getDpiY(int disp) const { 5159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].ydpi; 5179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardnsecs_t HWComposer::getRefreshPeriod(int disp) const { 5209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].refresh; 5229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardandroid_color_mode_t HWComposer::getColorMode(int disp) const { 5259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t currentConfig = mDisplayData[disp].currentConfig; 5269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs[currentConfig].colorMode; 5279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardconst Vector<HWComposer::DisplayConfig>& HWComposer::getConfigs(int disp) const { 5309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].configs; 5319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardsize_t HWComposer::getCurrentConfig(int disp) const { 5349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[disp].currentConfig; 5359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::eventControl(int disp, int event, int enabled) { 5389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(disp)>31 || !mAllocatedDisplayIDs.hasBit(disp)) { 5399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGD("eventControl ignoring event %d on unallocated disp %d (en=%d)", 5409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard event, disp, enabled); 5419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 5429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (event != EVENT_VSYNC) { 5449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("eventControl got unexpected event %d (disp=%d en=%d)", 5459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard event, disp, enabled); 5469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 5479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard status_t err = NO_ERROR; 5499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && !mDebugForceFakeVSync) { 5509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // NOTE: we use our own internal lock here because we have to call 5519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // into the HWC with the lock held, and we want to make sure 5529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // that even if HWC blocks (which it shouldn't), it won't 5539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // affect other threads. 5549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mEventControlLock); 5559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const int32_t eventBit = 1UL << event; 5569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const int32_t newValue = enabled ? eventBit : 0; 5579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const int32_t oldValue = mDisplayData[disp].events & eventBit; 5589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (newValue != oldValue) { 5599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ATRACE_CALL(); 5609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc->eventControl(mHwc, disp, event, enabled); 5619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!err) { 5629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int32_t& events(mDisplayData[disp].events); 5639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard events = (events & ~eventBit) | newValue; 5649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard char tag[16]; 5669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard snprintf(tag, sizeof(tag), "HW_VSYNC_ON_%1u", disp); 5679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ATRACE_INT(tag, enabled); 5689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // error here should not happen -- not sure what we should 5719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // do if it does. 5729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE_IF(err, "eventControl(%d, %d) failed %s", 5739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard event, enabled, strerror(-err)); 5749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err == NO_ERROR && mVSyncThread != NULL) { 5779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVSyncThread->setEnabled(enabled); 5789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 5809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::createWorkList(int32_t id, size_t numLayers) { 5829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) { 5839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_INDEX; 5849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 5869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 5879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[id]); 5889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 5899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we need space for the HWC_FRAMEBUFFER_TARGET 5909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard numLayers++; 5919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.capacity < numLayers || disp.list == NULL) { 5939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t size = sizeof(hwc_display_contents_1_t) 5949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard + numLayers * sizeof(hwc_layer_1_t); 5959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard free(disp.list); 5969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list = (hwc_display_contents_1_t*)malloc(size); 5979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.capacity = numLayers; 5989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 5999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 6009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget = &disp.list->hwLayers[numLayers - 1]; 6019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard memset(disp.framebufferTarget, 0, sizeof(hwc_layer_1_t)); 6029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const DisplayConfig& currentConfig = 6039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.configs[disp.currentConfig]; 6049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const hwc_rect_t r = { 0, 0, 6059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard (int) currentConfig.width, (int) currentConfig.height }; 6069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET; 6079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->hints = 0; 6089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->flags = 0; 6099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->handle = disp.fbTargetHandle; 6109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->transform = 0; 6119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->blending = HWC_BLENDING_PREMULT; 6129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) { 6139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->sourceCropf.left = 0; 6149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->sourceCropf.top = 0; 6159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->sourceCropf.right = 6169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard currentConfig.width; 6179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->sourceCropf.bottom = 6189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard currentConfig.height; 6199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 6209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->sourceCrop = r; 6219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->displayFrame = r; 6239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->visibleRegionScreen.numRects = 1; 6249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->visibleRegionScreen.rects = 6259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard &disp.framebufferTarget->displayFrame; 6269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->acquireFenceFd = -1; 6279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->releaseFenceFd = -1; 6289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->planeAlpha = 0xFF; 6299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->retireFenceFd = -1; 6319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->flags = HWC_GEOMETRY_CHANGED; 6329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->numHwLayers = numLayers; 6339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 6359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 6369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setFramebufferTarget(int32_t id, 6389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buf) { 6399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) { 6409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_INDEX; 6419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[id]); 6439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!disp.framebufferTarget) { 6449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // this should never happen, but apparently eglCreateWindowSurface() 6459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // triggers a Surface::queueBuffer() on some 6469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // devices (!?) -- log and ignore. 6479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE("HWComposer: framebufferTarget is null"); 6489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 6499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int acquireFenceFd = -1; 6529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (acquireFence->isValid()) { 6539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard acquireFenceFd = acquireFence->dup(); 6549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // ALOGD("fbPost: handle=%p, fence=%d", buf->handle, acquireFenceFd); 6579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.fbTargetHandle = buf->handle; 6589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->handle = disp.fbTargetHandle; 6599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->acquireFenceFd = acquireFenceFd; 6609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 6619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 6629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::prepare() { 6649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mDisplayLock); 6659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<mNumDisplays ; i++) { 6669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[i]); 6679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.framebufferTarget) { 6689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // make sure to reset the type to HWC_FRAMEBUFFER_TARGET 6699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // DO NOT reset the handle field to NULL, because it's possible 6709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // that we have nothing to redraw (eg: eglSwapBuffers() not called) 6719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // in which case, we should continue to use the same buffer. 6729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_FATAL_IF(disp.list == NULL); 6739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->compositionType = HWC_FRAMEBUFFER_TARGET; 6749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!disp.connected && disp.list != NULL) { 6769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGW("WARNING: disp %zu: connected, non-null list, layers=%zu", 6779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard i, disp.list->numHwLayers); 6789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i] = disp.list; 6809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mLists[i]) { 6819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) { 6829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->outbuf = disp.outbufHandle; 6839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->outbufAcquireFenceFd = -1; 6849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 6859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // garbage data to catch improper use 6869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->dpy = (hwc_display_t)0xDEADBEEF; 6879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->sur = (hwc_surface_t)0xDEADBEEF; 6889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 6899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->dpy = EGL_NO_DISPLAY; 6909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->sur = EGL_NO_SURFACE; 6919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 6949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int err = mHwc->prepare(mHwc, mNumDisplays, mLists); 6969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE_IF(err, "HWComposer: prepare failed (%s)", strerror(-err)); 6979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 6989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err == NO_ERROR) { 6999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // here we're just making sure that "skip" layers are set 7009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // to HWC_FRAMEBUFFER and we're also counting how many layers 7019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we have of each type. 7029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // 7039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // If there are no window layers, we treat the display has having FB 7049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // composition, because SurfaceFlinger will use GLES to draw the 7059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // wormhole region. 7069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<mNumDisplays ; i++) { 7079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[i]); 7089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasFbComp = false; 7099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasOvComp = false; 7109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.list) { 7119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<disp.list->numHwLayers ; i++) { 7129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_layer_1_t& l = disp.list->hwLayers[i]; 7139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard //ALOGD("prepare: %d, type=%d, handle=%p", 7159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // i, l.compositionType, l.handle); 7169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (l.flags & HWC_SKIP_LAYER) { 7189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l.compositionType = HWC_FRAMEBUFFER; 7199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (l.compositionType == HWC_FRAMEBUFFER) { 7219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasFbComp = true; 7229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (l.compositionType == HWC_OVERLAY) { 7249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasOvComp = true; 7259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (l.compositionType == HWC_CURSOR_OVERLAY) { 7279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasOvComp = true; 7289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.list->numHwLayers == (disp.framebufferTarget ? 1 : 0)) { 7319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasFbComp = true; 7329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 7349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.hasFbComp = true; 7359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)err; 7399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 7409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool HWComposer::hasHwcComposition(int32_t id) const { 7429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!mHwc || uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) 7439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return false; 7449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[id].hasOvComp; 7459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 7469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool HWComposer::hasGlesComposition(int32_t id) const { 7489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!mHwc || uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) 7499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 7509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[id].hasFbComp; 7519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 7529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardsp<Fence> HWComposer::getAndResetReleaseFence(int32_t id) { 7549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) 7559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Fence::NO_FENCE; 7569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fd = INVALID_OPERATION; 7589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 7599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const DisplayData& disp(mDisplayData[id]); 7609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.framebufferTarget) { 7619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard fd = disp.framebufferTarget->releaseFenceFd; 7629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->acquireFenceFd = -1; 7639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.framebufferTarget->releaseFenceFd = -1; 7649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return fd >= 0 ? new Fence(fd) : Fence::NO_FENCE; 7679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 7689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::commit() { 7709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int err = NO_ERROR; 7719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 7729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 7739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // On version 1.0, the OpenGL ES target surface is communicated 7749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // by the (dpy, sur) fields and we are guaranteed to have only 7759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // a single display. 7769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[0]->dpy = eglGetCurrentDisplay(); 7779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[0]->sur = eglGetCurrentSurface(EGL_DRAW); 7789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=VIRTUAL_DISPLAY_ID_BASE; i<mNumDisplays; i++) { 7819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[i]); 7829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.outbufHandle) { 7839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->outbuf = disp.outbufHandle; 7849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mLists[i]->outbufAcquireFenceFd = 7859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.outbufAcquireFence->dup(); 7869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 7889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = mHwc->set(mHwc, mNumDisplays, mLists); 7909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 7919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<mNumDisplays ; i++) { 7929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[i]); 7939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.lastDisplayFence = disp.lastRetireFence; 7949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.lastRetireFence = Fence::NO_FENCE; 7959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.list) { 7969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.list->retireFenceFd != -1) { 7979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.lastRetireFence = new Fence(disp.list->retireFenceFd); 7989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->retireFenceFd = -1; 7999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->flags &= ~HWC_GEOMETRY_CHANGED; 8019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)err; 8059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setPowerMode(int disp, int mode) { 8089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_FATAL_IF(disp >= VIRTUAL_DISPLAY_ID_BASE); 8099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 8109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mode == HWC_POWER_MODE_OFF) { 8119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard eventControl(disp, HWC_EVENT_VSYNC, 0); 8129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) { 8149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)mHwc->setPowerMode(mHwc, disp, mode); 8159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)mHwc->blank(mHwc, disp, 8179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mode == HWC_POWER_MODE_OFF ? 1 : 0); 8189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 8219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setActiveConfig(int disp, int mode) { 8249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_FATAL_IF(disp >= VIRTUAL_DISPLAY_ID_BASE); 8259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& dd(mDisplayData[disp]); 8269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.currentConfig = mode; 8279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) { 8289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)mHwc->setActiveConfig(mHwc, disp, mode); 8299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_FATAL_IF(mode != 0); 8319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 8339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::disconnectDisplay(int disp) { 8369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard LOG_ALWAYS_FATAL_IF(disp < 0 || disp == HWC_DISPLAY_PRIMARY); 8379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& dd(mDisplayData[disp]); 8389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard free(dd.list); 8399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.list = NULL; 8409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.framebufferTarget = NULL; // points into dd.list 8419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.fbTargetHandle = NULL; 8429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.outbufHandle = NULL; 8439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.lastRetireFence = Fence::NO_FENCE; 8449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.lastDisplayFence = Fence::NO_FENCE; 8459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.outbufAcquireFence = Fence::NO_FENCE; 8469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // clear all the previous configs and repopulate when a new 8479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // device is added 8489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard dd.configs.clear(); 8499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardint HWComposer::getVisualID() const { 8529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 8539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // FIXME: temporary hack until HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED 8549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // is supported by the implementation. we can only be in this case 8559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // if we have HWC 1.1 8569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return HAL_PIXEL_FORMAT_RGBA_8888; 8579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard //return HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 8589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mFbDev->format; 8609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool HWComposer::supportsFramebufferTarget() const { 8649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)); 8659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardint HWComposer::fbPost(int32_t id, 8689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buffer) { 8699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 8709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return setFramebufferTarget(id, acquireFence, buffer); 8719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard acquireFence->waitForever("HWComposer::fbPost"); 8739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mFbDev->post(mFbDev, buffer->handle); 8749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardint HWComposer::fbCompositionComplete() { 8789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) 8799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 8809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mFbDev->compositionComplete) { 8829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mFbDev->compositionComplete(mFbDev); 8839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 8849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return INVALID_OPERATION; 8859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::fbDump(String8& result) { 8899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mFbDev && mFbDev->common.version >= 1 && mFbDev->dump) { 8909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const size_t SIZE = 4096; 8919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard char buffer[SIZE]; 8929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFbDev->dump(mFbDev, buffer, SIZE); 8939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.append(buffer); 8949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 8959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 8969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 8979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setOutputBuffer(int32_t id, const sp<Fence>& acquireFence, 8989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<GraphicBuffer>& buf) { 8999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) 9009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return BAD_INDEX; 9019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (id < VIRTUAL_DISPLAY_ID_BASE) 9029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return INVALID_OPERATION; 9039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[id]); 9059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.outbufHandle = buf->handle; 9069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.outbufAcquireFence = acquireFence; 9079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 9089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardsp<Fence> HWComposer::getLastRetireFence(int32_t id) const { 9119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) 9129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return Fence::NO_FENCE; 9139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return mDisplayData[id].lastRetireFence; 9149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatus_t HWComposer::setCursorPositionAsync(int32_t id, const Rect& pos) 9179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 9189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc->setCursorPositionAsync) { 9199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return (status_t)mHwc->setCursorPositionAsync(mHwc, id, pos.left, pos.top); 9209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard else { 9229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 9239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 9259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 9279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Helper template to implement a concrete HWCLayer 9289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * This holds the pointer to the concrete hwc layer type 9299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * and implements the "iterable" side of HWCLayer. 9309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 9319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardtemplate<typename CONCRETE, typename HWCTYPE> 9329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardclass Iterable : public HWComposer::HWCLayer { 9339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardprotected: 9349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWCTYPE* const mLayerList; 9359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWCTYPE* mCurrentLayer; 9369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard explicit Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer), 9379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIndex(0) { } 9389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard inline HWCTYPE const * getLayer() const { return mCurrentLayer; } 9399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard inline HWCTYPE* getLayer() { return mCurrentLayer; } 9409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual ~Iterable() { } 9419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t mIndex; 9429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardprivate: 9439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // returns a copy of ourselves 9449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual HWComposer::HWCLayer* dup() { 9459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return new CONCRETE( static_cast<const CONCRETE&>(*this) ); 9469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual status_t setLayer(size_t index) { 9489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mIndex = index; 9499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCurrentLayer = &mLayerList[index]; 9509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return NO_ERROR; 9519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; 9539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 9559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0. 9569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * This implements the HWCLayer side of HWCIterableLayer. 9579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 9589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardclass HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> { 9599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard struct hwc_composer_device_1* mHwc; 9609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardpublic: 9619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard HWCLayerVersion1(struct hwc_composer_device_1* hwc, hwc_layer_1_t* layer, 9629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Vector<Region>* visibleRegions, 9639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Vector<Region>* surfaceDamageRegions) 9649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer), mHwc(hwc), 9659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVisibleRegions(visibleRegions), 9669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceDamageRegions(surfaceDamageRegions) {} 9679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 9689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual int32_t getCompositionType() const { 9699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return getLayer()->compositionType; 9709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual uint32_t getHints() const { 9729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return getLayer()->hints; 9739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual sp<Fence> getAndResetReleaseFence() { 9759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int fd = getLayer()->releaseFenceFd; 9769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->releaseFenceFd = -1; 9779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return fd >= 0 ? new Fence(fd) : Fence::NO_FENCE; 9789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setAcquireFenceFd(int fenceFd) { 9809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->acquireFenceFd = fenceFd; 9819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setPerFrameDefaultState() { 9839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard //getLayer()->compositionType = HWC_FRAMEBUFFER; 9849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setPlaneAlpha(uint8_t alpha) { 9869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_2)) { 9879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->planeAlpha = alpha; 9889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 9899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (alpha < 0xFF) { 9909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags |= HWC_SKIP_LAYER; 9919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 9949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setDefaultState() { 9959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_layer_1_t* const l = getLayer(); 9969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->compositionType = HWC_FRAMEBUFFER; 9979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->hints = 0; 9989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->flags = HWC_SKIP_LAYER; 9999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->handle = 0; 10009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->transform = 0; 10019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->blending = HWC_BLENDING_NONE; 10029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->visibleRegionScreen.numRects = 0; 10039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->visibleRegionScreen.rects = NULL; 10049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->acquireFenceFd = -1; 10059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->releaseFenceFd = -1; 10069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l->planeAlpha = 0xFF; 10079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setSkip(bool skip) { 10099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (skip) { 10109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags |= HWC_SKIP_LAYER; 10119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 10129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags &= ~HWC_SKIP_LAYER; 10139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setIsCursorLayerHint(bool isCursor) { 10169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_4)) { 10179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (isCursor) { 10189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags |= HWC_IS_CURSOR_LAYER; 10199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard else { 10219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags &= ~HWC_IS_CURSOR_LAYER; 10229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setBlending(uint32_t blending) { 10269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->blending = blending; 10279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setTransform(uint32_t transform) { 10299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->transform = transform; 10309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setFrame(const Rect& frame) { 10329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->displayFrame = reinterpret_cast<hwc_rect_t const&>(frame); 10339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10345a423eaa86f4c990afcef8c55e3949d0872068b4Dan Stoza virtual void setCrop(const FloatRect& crop) { 10359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) { 10369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->sourceCropf = reinterpret_cast<hwc_frect_t const&>(crop); 10379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 10389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard /* 10399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Since h/w composer didn't support a flot crop rect before version 1.3, 10409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * using integer coordinates instead produces a different output from the GL code in 10419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * Layer::drawWithOpenGL(). The difference can be large if the buffer crop to 10429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * window size ratio is large and a window crop is defined 10439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * (i.e.: if we scale the buffer a lot and we also crop it with a window crop). 10449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 10459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_rect_t& r = getLayer()->sourceCrop; 10469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard r.left = int(ceilf(crop.left)); 10479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard r.top = int(ceilf(crop.top)); 10489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard r.right = int(floorf(crop.right)); 10499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard r.bottom= int(floorf(crop.bottom)); 10509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setVisibleRegionScreen(const Region& reg) { 10539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_region_t& visibleRegion = getLayer()->visibleRegionScreen; 10549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVisibleRegions->editItemAt(mIndex) = reg; 10559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard visibleRegion.rects = reinterpret_cast<hwc_rect_t const *>( 10569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mVisibleRegions->itemAt(mIndex).getArray( 10579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard &visibleRegion.numRects)); 10589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setSurfaceDamage(const Region& reg) { 10609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_5)) { 10619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 10629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hwc_region_t& surfaceDamage = getLayer()->surfaceDamage; 10649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // We encode default full-screen damage as INVALID_RECT upstream, but as 10659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // 0 rects for HWComposer 10669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (reg.isRect() && reg.getBounds() == Rect::INVALID_RECT) { 10679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard surfaceDamage.numRects = 0; 10689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard surfaceDamage.rects = NULL; 10699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return; 10709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceDamageRegions->editItemAt(mIndex) = reg; 10729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard surfaceDamage.rects = reinterpret_cast<hwc_rect_t const *>( 10739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mSurfaceDamageRegions->itemAt(mIndex).getArray( 10749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard &surfaceDamage.numRects)); 10759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setSidebandStream(const sp<NativeHandle>& stream) { 10779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOG_ASSERT(stream->handle() != NULL); 10789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->compositionType = HWC_SIDEBAND; 10799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->sidebandStream = stream->handle(); 10809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void setBuffer(const sp<GraphicBuffer>& buffer) { 10829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (buffer == 0 || buffer->handle == 0) { 10839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->compositionType = HWC_FRAMEBUFFER; 10849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->flags |= HWC_SKIP_LAYER; 10859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->handle = 0; 10869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 10879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (getLayer()->compositionType == HWC_SIDEBAND) { 10889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // If this was a sideband layer but the stream was removed, reset 10899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // it to FRAMEBUFFER. The HWC can change it to OVERLAY in prepare. 10909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->compositionType = HWC_FRAMEBUFFER; 10919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->handle = buffer->handle; 10939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard virtual void onDisplayed() { 10969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard getLayer()->acquireFenceFd = -1; 10979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 10989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 10999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardprotected: 11009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Pointers to the vectors of Region backing-memory held in DisplayData. 11019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // Only the Region at mIndex corresponds to this Layer. 11029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Vector<Region>* mVisibleRegions; 11039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Vector<Region>* mSurfaceDamageRegions; 11049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; 11059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 11079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * returns an iterator initialized at a given index in the layer list 11089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 11099d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::LayerListIterator HWComposer::getLayerIterator(int32_t id, size_t index) { 11109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id)>31 || !mAllocatedDisplayIDs.hasBit(id)) { 11119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return LayerListIterator(); 11129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard DisplayData& disp(mDisplayData[id]); 11149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!mHwc || !disp.list || index > disp.list->numHwLayers) { 11159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return LayerListIterator(); 11169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.visibleRegions.size() < disp.list->numHwLayers) { 11189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.visibleRegions.resize(disp.list->numHwLayers); 11199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.surfaceDamageRegions.size() < disp.list->numHwLayers) { 11219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.surfaceDamageRegions.resize(disp.list->numHwLayers); 11229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return LayerListIterator(new HWCLayerVersion1(mHwc, disp.list->hwLayers, 11249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard &disp.visibleRegions, &disp.surfaceDamageRegions), index); 11259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 11269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 11289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * returns an iterator on the beginning of the layer list 11299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 11309d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::LayerListIterator HWComposer::begin(int32_t id) { 11319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return getLayerIterator(id, 0); 11329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 11339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard/* 11359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard * returns an iterator on the end of the layer list 11369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard */ 11379d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::LayerListIterator HWComposer::end(int32_t id) { 11389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard size_t numLayers = 0; 11399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (uint32_t(id) <= 31 && mAllocatedDisplayIDs.hasBit(id)) { 11409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const DisplayData& disp(mDisplayData[id]); 11419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && disp.list) { 11429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard numLayers = disp.list->numHwLayers; 11439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) { 11449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // with HWC 1.1, the last layer is always the HWC_FRAMEBUFFER_TARGET, 11459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // which we ignore when iterating through the layer list. 11469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ALOGE_IF(!numLayers, "mDisplayData[%d].list->numHwLayers is 0", id); 11479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (numLayers) { 11489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard numLayers--; 11499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return getLayerIterator(id, numLayers); 11549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 11559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// Converts a PixelFormat to a human-readable string. Max 11 chars. 11579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// (Could use a table of prefab String8 objects.) 11589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardstatic String8 getFormatStr(PixelFormat format) { 11599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard switch (format) { 11609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case PIXEL_FORMAT_RGBA_8888: return String8("RGBA_8888"); 11619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case PIXEL_FORMAT_RGBX_8888: return String8("RGBx_8888"); 1162ff415149dc5a83a4eb5960daf2cb2c310ef89847Romain Guy case PIXEL_FORMAT_RGBA_FP16: return String8("RGBA_FP16"); 1163541f22658ab1617c9d12c98684ab40248df8749bRomain Guy case PIXEL_FORMAT_RGBA_1010102: return String8("RGBA_1010102"); 11649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case PIXEL_FORMAT_RGB_888: return String8("RGB_888"); 11659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case PIXEL_FORMAT_RGB_565: return String8("RGB_565"); 11669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case PIXEL_FORMAT_BGRA_8888: return String8("BGRA_8888"); 11679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 11689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return String8("ImplDef"); 11699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard default: 11709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard String8 result; 11719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat("? %08x", format); 11729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return result; 11739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11749d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 11759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::dump(String8& result) const { 11779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mDisplayLock); 11789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc) { 11799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat("Hardware Composer state (version %08x):\n", hwcApiVersion(mHwc)); 11809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat(" mDebugForceFakeVSync=%d\n", mDebugForceFakeVSync); 11819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<mNumDisplays ; i++) { 11829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const DisplayData& disp(mDisplayData[i]); 11839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (!disp.connected) 11849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard continue; 11859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const Vector< sp<Layer> >& visibleLayersSortedByZ = 11879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mFlinger->getLayerSortedByZForHwcDisplay(i); 11889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 11909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat(" Display[%zd] configurations (* current):\n", i); 11919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t c = 0; c < disp.configs.size(); ++c) { 11929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const DisplayConfig& config(disp.configs[c]); 11939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat(" %s%zd: %ux%u, xdpi=%f, ydpi=%f" 11949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard ", refresh=%" PRId64 ", colorMode=%d\n", 11959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard c == disp.currentConfig ? "* " : "", c, 11969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.width, config.height, config.xdpi, config.ydpi, 11979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard config.refresh, config.colorMode); 11989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 11999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (disp.list) { 12019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat( 12029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard " numHwLayers=%zu, flags=%08x\n", 12039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard disp.list->numHwLayers, disp.list->flags); 12049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.append( 12069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard " type | handle | hint | flag | tr | blnd | format | source crop (l,t,r,b) | frame | name \n" 12079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "-----------+----------+------+------+----+------+-------------+--------------------------------+------------------------+------\n"); 12089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // " _________ | ________ | ____ | ____ | __ | ____ | ___________ |_____._,_____._,_____._,_____._ |_____,_____,_____,_____ | ___... 12099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard for (size_t i=0 ; i<disp.list->numHwLayers ; i++) { 12109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const hwc_layer_1_t&l = disp.list->hwLayers[i]; 12119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int32_t format = -1; 12129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard String8 name("unknown"); 12139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (i < visibleLayersSortedByZ.size()) { 12159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<Layer>& layer(visibleLayersSortedByZ[i]); 12169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const sp<GraphicBuffer>& buffer( 12179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard layer->getActiveBuffer()); 12189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (buffer != NULL) { 12199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard format = buffer->getPixelFormat(); 12209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard name = layer->getName(); 12229d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int type = l.compositionType; 12259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (type == HWC_FRAMEBUFFER_TARGET) { 12269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard name = "HWC_FRAMEBUFFER_TARGET"; 12279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard format = disp.format; 12289d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard static char const* compositionTypeName[] = { 12319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "GLES", 12329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "HWC", 12339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "BKGND", 12349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "FB TARGET", 12359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "SIDEBAND", 12369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "HWC_CURSOR", 12379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard "UNKNOWN"}; 12389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (type >= NELEM(compositionTypeName)) 12399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard type = NELEM(compositionTypeName) - 1; 12409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12419d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard String8 formatStr = getFormatStr(format); 12429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_3)) { 12439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat( 12449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard " %9s | %08" PRIxPTR " | %04x | %04x | %02x | %04x | %-11s |%7.1f,%7.1f,%7.1f,%7.1f |%5d,%5d,%5d,%5d | %s\n", 12459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionTypeName[type], 12469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, formatStr.string(), 12479d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l.sourceCropf.left, l.sourceCropf.top, l.sourceCropf.right, l.sourceCropf.bottom, 12489d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom, 12499d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard name.string()); 12509d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } else { 12519d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.appendFormat( 12529d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard " %9s | %08" PRIxPTR " | %04x | %04x | %02x | %04x | %-11s |%7d,%7d,%7d,%7d |%5d,%5d,%5d,%5d | %s\n", 12539d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard compositionTypeName[type], 12549d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, formatStr.string(), 12559d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom, 12569d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom, 12579d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard name.string()); 12589d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12599d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12609d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12619d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12629d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12639d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12649d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mHwc && mHwc->dump) { 12659d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const size_t SIZE = 4096; 12669d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard char buffer[SIZE]; 12679d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mHwc->dump(mHwc, buffer, SIZE); 12689d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard result.append(buffer); 12699d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12709d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 12719d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12729d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// --------------------------------------------------------------------------- 12739d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12749d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::VSyncThread::VSyncThread(HWComposer& hwc) 12759d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard : mHwc(hwc), mEnabled(false), 12769d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mNextFakeVSync(0), 12779d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mRefreshPeriod(hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY)) 12789d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{ 12799d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 12809d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12819d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::VSyncThread::setEnabled(bool enabled) { 12829d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mLock); 12839d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (mEnabled != enabled) { 12849d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mEnabled = enabled; 12859d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCondition.signal(); 12869d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12879d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 12889d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12899d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardvoid HWComposer::VSyncThread::onFirstRef() { 12909d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE); 12919d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 12929d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 12939d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglardbool HWComposer::VSyncThread::threadLoop() { 12949d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard { // scope for lock 12959d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard Mutex::Autolock _l(mLock); 12969d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard while (!mEnabled) { 12979d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mCondition.wait(mLock); 12989d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 12999d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 13009d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13019d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const nsecs_t period = mRefreshPeriod; 13029d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard const nsecs_t now = systemTime(CLOCK_MONOTONIC); 13039d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t next_vsync = mNextFakeVSync; 13049d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard nsecs_t sleep = next_vsync - now; 13059d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (sleep < 0) { 13069d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard // we missed, find where the next vsync should be 13079d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard sleep = (period - ((now - next_vsync) % period)); 13089d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard next_vsync = now + sleep; 13099d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 13109d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard mNextFakeVSync = next_vsync + period; 13119d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13129d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard struct timespec spec; 13139d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard spec.tv_sec = next_vsync / 1000000000; 13149d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard spec.tv_nsec = next_vsync % 1000000000; 13159d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13169d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard int err; 13179d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard do { 13189d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL); 13199d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } while (err<0 && errno == EINTR); 13209d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13219d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard if (err == 0) { 13223cfac28462910d3f976aebac54ac7301aca7e434Steven Thomas mHwc.mEventHandler.onVSyncReceived(&mHwc, 0, next_vsync); 13239d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard } 13249d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13259d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard return true; 13269d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 13279d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13289d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::DisplayData::DisplayData() 13299d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard: configs(), 13309d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard currentConfig(0), 13319d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard format(HAL_PIXEL_FORMAT_RGBA_8888), 13329d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard connected(false), 13339d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard hasFbComp(false), hasOvComp(false), 13349d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard capacity(0), list(NULL), 13359d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard framebufferTarget(NULL), fbTargetHandle(0), 13369d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard lastRetireFence(Fence::NO_FENCE), lastDisplayFence(Fence::NO_FENCE), 13379d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard outbufHandle(NULL), outbufAcquireFence(Fence::NO_FENCE), 13389d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard events(0) 13399d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard{} 13409d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13419d96de49673cb6c916bfb797aad4f4e024ea73caFabien SanglardHWComposer::DisplayData::~DisplayData() { 13429d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard free(list); 13439d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard} 13449d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard 13459d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard// --------------------------------------------------------------------------- 13469d96de49673cb6c916bfb797aad4f4e024ea73caFabien Sanglard}; // namespace android 1347