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