HWComposer.cpp revision dc5b485f74edf2d2f31c62054eb6c180421a3ade
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define ATRACE_TAG ATRACE_TAG_GRAPHICS 18 19// Uncomment this to remove support for HWC_DEVICE_API_VERSION_0_3 and older 20// #define HWC_REMOVE_DEPRECATED_VERSIONS 1 21 22#include <stdint.h> 23#include <stdio.h> 24#include <stdlib.h> 25#include <string.h> 26#include <sys/types.h> 27 28#include <utils/Errors.h> 29#include <utils/String8.h> 30#include <utils/Thread.h> 31#include <utils/Trace.h> 32#include <utils/Vector.h> 33 34#include <hardware/hardware.h> 35#include <hardware/hwcomposer.h> 36 37#include <cutils/log.h> 38#include <cutils/properties.h> 39 40#include <EGL/egl.h> 41 42#include "LayerBase.h" 43#include "HWComposer.h" 44#include "SurfaceFlinger.h" 45 46namespace android { 47 48// --------------------------------------------------------------------------- 49// Support for HWC_DEVICE_API_VERSION_0_3 and older: 50// Since v0.3 is deprecated and support will be dropped soon, as much as 51// possible the code is written to target v1.0. When using a v0.3 HWC, we 52// allocate v0.3 structures, but assign them to v1.0 pointers. Fields that 53// exist in both versions are located at the same offset, so in most cases we 54// can just use the v1.0 pointer without branches or casts. 55 56#if HWC_REMOVE_DEPRECATED_VERSIONS 57// We need complete types with to satisfy semantic checks, even though the 58// code paths that use these won't get executed at runtime (and will likely be 59// dead-code-eliminated). When we remove the code to support v0.3 we can remove 60// these as well. 61typedef hwc_layer_1_t hwc_layer_t; 62typedef hwc_layer_list_1_t hwc_layer_list_t; 63typedef hwc_composer_device_1_t hwc_composer_device_t; 64#endif 65 66// This function assumes we've already rejected HWC's with lower-than-required 67// versions. Don't use it for the initial "does HWC meet requirements" check! 68static bool hwcHasVersion(const hwc_composer_device_1_t* hwc, uint32_t version) { 69 if (HWC_REMOVE_DEPRECATED_VERSIONS && 70 version <= HWC_DEVICE_API_VERSION_1_0) { 71 return true; 72 } else { 73 return hwc->common.version >= version; 74 } 75} 76 77static size_t sizeofHwcLayerList(const hwc_composer_device_1_t* hwc, 78 size_t numLayers) { 79 if (hwcHasVersion(hwc, HWC_DEVICE_API_VERSION_1_0)) { 80 return sizeof(hwc_layer_list_1_t) + numLayers*sizeof(hwc_layer_1_t); 81 } else { 82 return sizeof(hwc_layer_list_t) + numLayers*sizeof(hwc_layer_t); 83 } 84} 85 86// --------------------------------------------------------------------------- 87 88struct HWComposer::cb_context { 89 struct callbacks : public hwc_procs_t { 90 // these are here to facilitate the transition when adding 91 // new callbacks (an implementation can check for NULL before 92 // calling a new callback). 93 void (*zero[4])(void); 94 }; 95 callbacks procs; 96 HWComposer* hwc; 97}; 98 99// --------------------------------------------------------------------------- 100 101HWComposer::HWComposer( 102 const sp<SurfaceFlinger>& flinger, 103 EventHandler& handler, 104 nsecs_t refreshPeriod) 105 : mFlinger(flinger), 106 mModule(0), mHwc(0), mList(0), mCapacity(0), 107 mNumOVLayers(0), mNumFBLayers(0), 108 mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE), 109 mCBContext(new cb_context), 110 mEventHandler(handler), 111 mRefreshPeriod(refreshPeriod), 112 mVSyncCount(0), mDebugForceFakeVSync(false) 113{ 114 char value[PROPERTY_VALUE_MAX]; 115 property_get("debug.sf.no_hw_vsync", value, "0"); 116 mDebugForceFakeVSync = atoi(value); 117 118 bool needVSyncThread = false; 119 int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule); 120 ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID); 121 if (err == 0) { 122 err = hwc_open_1(mModule, &mHwc); 123 ALOGE_IF(err, "%s device failed to initialize (%s)", 124 HWC_HARDWARE_COMPOSER, strerror(-err)); 125 if (err == 0) { 126 if (HWC_REMOVE_DEPRECATED_VERSIONS && 127 mHwc->common.version < HWC_DEVICE_API_VERSION_1_0) { 128 ALOGE("%s device version %#x too old, will not be used", 129 HWC_HARDWARE_COMPOSER, mHwc->common.version); 130 hwc_close_1(mHwc); 131 mHwc = NULL; 132 } 133 } 134 135 if (mHwc) { 136 if (mHwc->registerProcs) { 137 mCBContext->hwc = this; 138 mCBContext->procs.invalidate = &hook_invalidate; 139 mCBContext->procs.vsync = &hook_vsync; 140 mHwc->registerProcs(mHwc, &mCBContext->procs); 141 memset(mCBContext->procs.zero, 0, sizeof(mCBContext->procs.zero)); 142 } 143 if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) { 144 if (mDebugForceFakeVSync) { 145 // make sure to turn h/w vsync off in "fake vsync" mode 146 mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0); 147 } 148 } else { 149 needVSyncThread = true; 150 } 151 } 152 } else { 153 needVSyncThread = true; 154 } 155 156 if (needVSyncThread) { 157 // we don't have VSYNC support, we need to fake it 158 mVSyncThread = new VSyncThread(*this); 159 } 160} 161 162HWComposer::~HWComposer() { 163 eventControl(EVENT_VSYNC, 0); 164 free(mList); 165 if (mVSyncThread != NULL) { 166 mVSyncThread->requestExitAndWait(); 167 } 168 if (mHwc) { 169 hwc_close_1(mHwc); 170 } 171 delete mCBContext; 172} 173 174status_t HWComposer::initCheck() const { 175 return mHwc ? NO_ERROR : NO_INIT; 176} 177 178void HWComposer::hook_invalidate(struct hwc_procs* procs) { 179 reinterpret_cast<cb_context *>(procs)->hwc->invalidate(); 180} 181 182void HWComposer::hook_vsync(struct hwc_procs* procs, int dpy, int64_t timestamp) { 183 reinterpret_cast<cb_context *>(procs)->hwc->vsync(dpy, timestamp); 184} 185 186void HWComposer::invalidate() { 187 mFlinger->repaintEverything(); 188} 189 190void HWComposer::vsync(int dpy, int64_t timestamp) { 191 ATRACE_INT("VSYNC", ++mVSyncCount&1); 192 mEventHandler.onVSyncReceived(dpy, timestamp); 193} 194 195void HWComposer::eventControl(int event, int enabled) { 196 status_t err = NO_ERROR; 197 if (mHwc && mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) { 198 if (!mDebugForceFakeVSync) { 199 err = mHwc->methods->eventControl(mHwc, event, enabled); 200 // error here should not happen -- not sure what we should 201 // do if it does. 202 ALOGE_IF(err, "eventControl(%d, %d) failed %s", 203 event, enabled, strerror(-err)); 204 } 205 } 206 207 if (err == NO_ERROR && mVSyncThread != NULL) { 208 mVSyncThread->setEnabled(enabled); 209 } 210} 211 212void HWComposer::setFrameBuffer(EGLDisplay dpy, EGLSurface sur) { 213 mDpy = (hwc_display_t)dpy; 214 mSur = (hwc_surface_t)sur; 215} 216 217status_t HWComposer::createWorkList(size_t numLayers) { 218 if (mHwc) { 219 if (!mList || mCapacity < numLayers) { 220 free(mList); 221 size_t size = sizeofHwcLayerList(mHwc, numLayers); 222 mList = (hwc_layer_list_1_t*)malloc(size); 223 mCapacity = numLayers; 224 } 225 mList->flags = HWC_GEOMETRY_CHANGED; 226 mList->numHwLayers = numLayers; 227 } 228 return NO_ERROR; 229} 230 231status_t HWComposer::prepare() const { 232 int err = mHwc->prepare(mHwc, mList); 233 if (err == NO_ERROR) { 234 size_t numOVLayers = 0; 235 size_t numFBLayers = 0; 236 size_t count = mList->numHwLayers; 237 for (size_t i=0 ; i<count ; i++) { 238 hwc_layer_1_t* l = NULL; 239 if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) { 240 l = &mList->hwLayers[i]; 241 } else { 242 // mList really has hwc_layer_list_t memory layout 243 hwc_layer_list_t* list = (hwc_layer_list_t*)mList; 244 hwc_layer_t* layer = &list->hwLayers[i]; 245 l = (hwc_layer_1_t*)layer; 246 } 247 if (l->flags & HWC_SKIP_LAYER) { 248 l->compositionType = HWC_FRAMEBUFFER; 249 } 250 switch (l->compositionType) { 251 case HWC_OVERLAY: 252 numOVLayers++; 253 break; 254 case HWC_FRAMEBUFFER: 255 numFBLayers++; 256 break; 257 } 258 } 259 mNumOVLayers = numOVLayers; 260 mNumFBLayers = numFBLayers; 261 } 262 return (status_t)err; 263} 264 265size_t HWComposer::getLayerCount(int type) const { 266 switch (type) { 267 case HWC_OVERLAY: 268 return mNumOVLayers; 269 case HWC_FRAMEBUFFER: 270 return mNumFBLayers; 271 } 272 return 0; 273} 274 275status_t HWComposer::commit() const { 276 int err = mHwc->set(mHwc, mDpy, mSur, mList); 277 if (mList) { 278 mList->flags &= ~HWC_GEOMETRY_CHANGED; 279 } 280 return (status_t)err; 281} 282 283status_t HWComposer::release() const { 284 if (mHwc) { 285 if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_3)) { 286 mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0); 287 } 288 int err = mHwc->set(mHwc, NULL, NULL, NULL); 289 return (status_t)err; 290 } 291 return NO_ERROR; 292} 293 294status_t HWComposer::disable() { 295 if (mHwc) { 296 free(mList); 297 mList = NULL; 298 int err = mHwc->prepare(mHwc, NULL); 299 return (status_t)err; 300 } 301 return NO_ERROR; 302} 303 304size_t HWComposer::getNumLayers() const { 305 return mList ? mList->numHwLayers : 0; 306} 307 308/* 309 * Helper template to implement a concrete HWCLayer 310 * This holds the pointer to the concrete hwc layer type 311 * and implements the "iterable" side of HWCLayer. 312 */ 313template<typename CONCRETE, typename HWCTYPE> 314class Iterable : public HWComposer::HWCLayer { 315protected: 316 HWCTYPE* const mLayerList; 317 HWCTYPE* mCurrentLayer; 318 Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer) { } 319 inline HWCTYPE const * getLayer() const { return mCurrentLayer; } 320 inline HWCTYPE* getLayer() { return mCurrentLayer; } 321 virtual ~Iterable() { } 322private: 323 // returns a copy of ourselves 324 virtual HWComposer::HWCLayer* dup() { 325 return new CONCRETE( static_cast<const CONCRETE&>(*this) ); 326 } 327 virtual status_t setLayer(size_t index) { 328 mCurrentLayer = &mLayerList[index]; 329 return NO_ERROR; 330 } 331}; 332 333// #if !HWC_REMOVE_DEPRECATED_VERSIONS 334/* 335 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_0_3 336 * This implements the HWCLayer side of HWCIterableLayer. 337 */ 338class HWCLayerVersion0 : public Iterable<HWCLayerVersion0, hwc_layer_t> { 339public: 340 HWCLayerVersion0(hwc_layer_t* layer) 341 : Iterable<HWCLayerVersion0, hwc_layer_t>(layer) { } 342 343 virtual int32_t getCompositionType() const { 344 return getLayer()->compositionType; 345 } 346 virtual uint32_t getHints() const { 347 return getLayer()->hints; 348 } 349 virtual int getAndResetReleaseFenceFd() { 350 // not supported on VERSION_03 351 return -1; 352 } 353 virtual void setAcquireFenceFd(int fenceFd) { 354 if (fenceFd != -1) { 355 ALOGE("HWC 0.x can't handle acquire fences"); 356 close(fenceFd); 357 } 358 } 359 360 virtual void setDefaultState() { 361 getLayer()->compositionType = HWC_FRAMEBUFFER; 362 getLayer()->hints = 0; 363 getLayer()->flags = HWC_SKIP_LAYER; 364 getLayer()->transform = 0; 365 getLayer()->blending = HWC_BLENDING_NONE; 366 getLayer()->visibleRegionScreen.numRects = 0; 367 getLayer()->visibleRegionScreen.rects = NULL; 368 } 369 virtual void setSkip(bool skip) { 370 if (skip) { 371 getLayer()->flags |= HWC_SKIP_LAYER; 372 } else { 373 getLayer()->flags &= ~HWC_SKIP_LAYER; 374 } 375 } 376 virtual void setBlending(uint32_t blending) { 377 getLayer()->blending = blending; 378 } 379 virtual void setTransform(uint32_t transform) { 380 getLayer()->transform = transform; 381 } 382 virtual void setFrame(const Rect& frame) { 383 reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame; 384 } 385 virtual void setCrop(const Rect& crop) { 386 reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop; 387 } 388 virtual void setVisibleRegionScreen(const Region& reg) { 389 getLayer()->visibleRegionScreen.rects = 390 reinterpret_cast<hwc_rect_t const *>( 391 reg.getArray(&getLayer()->visibleRegionScreen.numRects)); 392 } 393 virtual void setBuffer(const sp<GraphicBuffer>& buffer) { 394 if (buffer == 0 || buffer->handle == 0) { 395 getLayer()->compositionType = HWC_FRAMEBUFFER; 396 getLayer()->flags |= HWC_SKIP_LAYER; 397 getLayer()->handle = 0; 398 } else { 399 getLayer()->handle = buffer->handle; 400 } 401 } 402}; 403// #endif // !HWC_REMOVE_DEPRECATED_VERSIONS 404 405/* 406 * Concrete implementation of HWCLayer for HWC_DEVICE_API_VERSION_1_0. 407 * This implements the HWCLayer side of HWCIterableLayer. 408 */ 409class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> { 410public: 411 HWCLayerVersion1(hwc_layer_1_t* layer) 412 : Iterable<HWCLayerVersion1, hwc_layer_1_t>(layer) { } 413 414 virtual int32_t getCompositionType() const { 415 return getLayer()->compositionType; 416 } 417 virtual uint32_t getHints() const { 418 return getLayer()->hints; 419 } 420 virtual int getAndResetReleaseFenceFd() { 421 int fd = getLayer()->releaseFenceFd; 422 getLayer()->releaseFenceFd = -1; 423 return fd; 424 } 425 virtual void setAcquireFenceFd(int fenceFd) { 426 getLayer()->acquireFenceFd = fenceFd; 427 } 428 429 virtual void setDefaultState() { 430 getLayer()->compositionType = HWC_FRAMEBUFFER; 431 getLayer()->hints = 0; 432 getLayer()->flags = HWC_SKIP_LAYER; 433 getLayer()->transform = 0; 434 getLayer()->blending = HWC_BLENDING_NONE; 435 getLayer()->visibleRegionScreen.numRects = 0; 436 getLayer()->visibleRegionScreen.rects = NULL; 437 getLayer()->acquireFenceFd = -1; 438 getLayer()->releaseFenceFd = -1; 439 } 440 virtual void setSkip(bool skip) { 441 if (skip) { 442 getLayer()->flags |= HWC_SKIP_LAYER; 443 } else { 444 getLayer()->flags &= ~HWC_SKIP_LAYER; 445 } 446 } 447 virtual void setBlending(uint32_t blending) { 448 getLayer()->blending = blending; 449 } 450 virtual void setTransform(uint32_t transform) { 451 getLayer()->transform = transform; 452 } 453 virtual void setFrame(const Rect& frame) { 454 reinterpret_cast<Rect&>(getLayer()->displayFrame) = frame; 455 } 456 virtual void setCrop(const Rect& crop) { 457 reinterpret_cast<Rect&>(getLayer()->sourceCrop) = crop; 458 } 459 virtual void setVisibleRegionScreen(const Region& reg) { 460 getLayer()->visibleRegionScreen.rects = 461 reinterpret_cast<hwc_rect_t const *>( 462 reg.getArray(&getLayer()->visibleRegionScreen.numRects)); 463 } 464 virtual void setBuffer(const sp<GraphicBuffer>& buffer) { 465 if (buffer == 0 || buffer->handle == 0) { 466 getLayer()->compositionType = HWC_FRAMEBUFFER; 467 getLayer()->flags |= HWC_SKIP_LAYER; 468 getLayer()->handle = 0; 469 } else { 470 getLayer()->handle = buffer->handle; 471 } 472 } 473}; 474 475/* 476 * returns an iterator initialized at a given index in the layer list 477 */ 478HWComposer::LayerListIterator HWComposer::getLayerIterator(size_t index) { 479 if (!mList || index > mList->numHwLayers) { 480 return LayerListIterator(); 481 } 482 if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) { 483 return LayerListIterator(new HWCLayerVersion1(mList->hwLayers), index); 484 } else { 485 hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList; 486 return LayerListIterator(new HWCLayerVersion0(list0->hwLayers), index); 487 } 488} 489 490/* 491 * returns an iterator on the beginning of the layer list 492 */ 493HWComposer::LayerListIterator HWComposer::begin() { 494 return getLayerIterator(0); 495} 496 497/* 498 * returns an iterator on the end of the layer list 499 */ 500HWComposer::LayerListIterator HWComposer::end() { 501 return getLayerIterator(getNumLayers()); 502} 503 504 505 506void HWComposer::dump(String8& result, char* buffer, size_t SIZE, 507 const Vector< sp<LayerBase> >& visibleLayersSortedByZ) const { 508 if (mHwc && mList) { 509 result.append("Hardware Composer state:\n"); 510 result.appendFormat(" mDebugForceFakeVSync=%d\n", 511 mDebugForceFakeVSync); 512 result.appendFormat(" numHwLayers=%u, flags=%08x\n", 513 mList->numHwLayers, mList->flags); 514 result.append( 515 " type | handle | hints | flags | tr | blend | format | source crop | frame name \n" 516 "----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------\n"); 517 // " ________ | ________ | ________ | ________ | __ | _____ | ________ | [_____,_____,_____,_____] | [_____,_____,_____,_____] 518 for (size_t i=0 ; i<mList->numHwLayers ; i++) { 519 hwc_layer_1_t l; 520 if (hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_1_0)) { 521 l = mList->hwLayers[i]; 522 } else { 523 hwc_layer_list_t* list0 = (hwc_layer_list_t*)mList; 524 *(hwc_layer_t*)&l = list0->hwLayers[i]; 525 l.acquireFenceFd = l.releaseFenceFd = -1; 526 } 527 const sp<LayerBase> layer(visibleLayersSortedByZ[i]); 528 int32_t format = -1; 529 if (layer->getLayer() != NULL) { 530 const sp<GraphicBuffer>& buffer(layer->getLayer()->getActiveBuffer()); 531 if (buffer != NULL) { 532 format = buffer->getPixelFormat(); 533 } 534 } 535 result.appendFormat( 536 " %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s\n", 537 l.compositionType ? "OVERLAY" : "FB", 538 intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format, 539 l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom, 540 l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom, 541 layer->getName().string()); 542 } 543 } 544 if (mHwc && hwcHasVersion(mHwc, HWC_DEVICE_API_VERSION_0_1) && mHwc->dump) { 545 mHwc->dump(mHwc, buffer, SIZE); 546 result.append(buffer); 547 } 548} 549 550// --------------------------------------------------------------------------- 551 552HWComposer::VSyncThread::VSyncThread(HWComposer& hwc) 553 : mHwc(hwc), mEnabled(false), 554 mNextFakeVSync(0), 555 mRefreshPeriod(hwc.mRefreshPeriod) 556{ 557} 558 559void HWComposer::VSyncThread::setEnabled(bool enabled) { 560 Mutex::Autolock _l(mLock); 561 mEnabled = enabled; 562 mCondition.signal(); 563} 564 565void HWComposer::VSyncThread::onFirstRef() { 566 run("VSyncThread", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE); 567} 568 569bool HWComposer::VSyncThread::threadLoop() { 570 { // scope for lock 571 Mutex::Autolock _l(mLock); 572 while (!mEnabled) { 573 mCondition.wait(mLock); 574 } 575 } 576 577 const nsecs_t period = mRefreshPeriod; 578 const nsecs_t now = systemTime(CLOCK_MONOTONIC); 579 nsecs_t next_vsync = mNextFakeVSync; 580 nsecs_t sleep = next_vsync - now; 581 if (sleep < 0) { 582 // we missed, find where the next vsync should be 583 sleep = (period - ((now - next_vsync) % period)); 584 next_vsync = now + sleep; 585 } 586 mNextFakeVSync = next_vsync + period; 587 588 struct timespec spec; 589 spec.tv_sec = next_vsync / 1000000000; 590 spec.tv_nsec = next_vsync % 1000000000; 591 592 int err; 593 do { 594 err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &spec, NULL); 595 } while (err<0 && errno == EINTR); 596 597 if (err == 0) { 598 mHwc.mEventHandler.onVSyncReceived(0, next_vsync); 599 } 600 601 return true; 602} 603 604// --------------------------------------------------------------------------- 605}; // namespace android 606