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 LOG_TAG "Surface" 18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS 19 //#define LOG_NDEBUG 0 20 21 #include <gui/Surface.h> 22 23 #include <inttypes.h> 24 25 #include <android/native_window.h> 26 27 #include <utils/Log.h> 28 #include <utils/Trace.h> 29 #include <utils/NativeHandle.h> 30 31 #include <ui/DisplayStatInfo.h> 32 #include <ui/Fence.h> 33 #include <ui/HdrCapabilities.h> 34 #include <ui/Region.h> 35 36 #include <gui/BufferItem.h> 37 #include <gui/IProducerListener.h> 38 39 #include <gui/ISurfaceComposer.h> 40 #include <private/gui/ComposerService.h> 41 42 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h> 43 #include <configstore/Utils.h> 44 45 namespace android { 46 47 Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp) 48 : mGraphicBufferProducer(bufferProducer), 49 mCrop(Rect::EMPTY_RECT), 50 mBufferAge(0), 51 mGenerationNumber(0), 52 mSharedBufferMode(false), 53 mAutoRefresh(false), 54 mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT), 55 mSharedBufferHasBeenQueued(false), 56 mQueriedSupportedTimestamps(false), 57 mFrameTimestampsSupportsPresent(false), 58 mEnableFrameTimestamps(false), 59 mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) { 60 // Initialize the ANativeWindow function pointers. 61 ANativeWindow::setSwapInterval = hook_setSwapInterval; 62 ANativeWindow::dequeueBuffer = hook_dequeueBuffer; 63 ANativeWindow::cancelBuffer = hook_cancelBuffer; 64 ANativeWindow::queueBuffer = hook_queueBuffer; 65 ANativeWindow::query = hook_query; 66 ANativeWindow::perform = hook_perform; 67 68 ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED; 69 ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED; 70 ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED; 71 ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED; 72 73 const_cast<int&>(ANativeWindow::minSwapInterval) = 0; 74 const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; 75 76 mReqWidth = 0; 77 mReqHeight = 0; 78 mReqFormat = 0; 79 mReqUsage = 0; 80 mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; 81 mDataSpace = HAL_DATASPACE_UNKNOWN; 82 mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 83 mTransform = 0; 84 mStickyTransform = 0; 85 mDefaultWidth = 0; 86 mDefaultHeight = 0; 87 mUserWidth = 0; 88 mUserHeight = 0; 89 mTransformHint = 0; 90 mConsumerRunningBehind = false; 91 mConnectedToCpu = false; 92 mProducerControlledByApp = controlledByApp; 93 mSwapIntervalZero = false; 94 } 95 96 Surface::~Surface() { 97 if (mConnectedToCpu) { 98 Surface::disconnect(NATIVE_WINDOW_API_CPU); 99 } 100 } 101 102 sp<ISurfaceComposer> Surface::composerService() const { 103 return ComposerService::getComposerService(); 104 } 105 106 nsecs_t Surface::now() const { 107 return systemTime(); 108 } 109 110 sp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const { 111 return mGraphicBufferProducer; 112 } 113 114 void Surface::setSidebandStream(const sp<NativeHandle>& stream) { 115 mGraphicBufferProducer->setSidebandStream(stream); 116 } 117 118 void Surface::allocateBuffers() { 119 uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth; 120 uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight; 121 mGraphicBufferProducer->allocateBuffers(reqWidth, reqHeight, 122 mReqFormat, mReqUsage); 123 } 124 125 status_t Surface::setGenerationNumber(uint32_t generation) { 126 status_t result = mGraphicBufferProducer->setGenerationNumber(generation); 127 if (result == NO_ERROR) { 128 mGenerationNumber = generation; 129 } 130 return result; 131 } 132 133 uint64_t Surface::getNextFrameNumber() const { 134 Mutex::Autolock lock(mMutex); 135 return mNextFrameNumber; 136 } 137 138 String8 Surface::getConsumerName() const { 139 return mGraphicBufferProducer->getConsumerName(); 140 } 141 142 status_t Surface::setDequeueTimeout(nsecs_t timeout) { 143 return mGraphicBufferProducer->setDequeueTimeout(timeout); 144 } 145 146 status_t Surface::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 147 sp<Fence>* outFence, float outTransformMatrix[16]) { 148 return mGraphicBufferProducer->getLastQueuedBuffer(outBuffer, outFence, 149 outTransformMatrix); 150 } 151 152 status_t Surface::getDisplayRefreshCycleDuration(nsecs_t* outRefreshDuration) { 153 ATRACE_CALL(); 154 155 DisplayStatInfo stats; 156 status_t err = composerService()->getDisplayStats(NULL, &stats); 157 158 *outRefreshDuration = stats.vsyncPeriod; 159 160 return NO_ERROR; 161 } 162 163 void Surface::enableFrameTimestamps(bool enable) { 164 Mutex::Autolock lock(mMutex); 165 // If going from disabled to enabled, get the initial values for 166 // compositor and display timing. 167 if (!mEnableFrameTimestamps && enable) { 168 FrameEventHistoryDelta delta; 169 mGraphicBufferProducer->getFrameTimestamps(&delta); 170 mFrameEventHistory->applyDelta(delta); 171 } 172 mEnableFrameTimestamps = enable; 173 } 174 175 status_t Surface::getCompositorTiming( 176 nsecs_t* compositeDeadline, nsecs_t* compositeInterval, 177 nsecs_t* compositeToPresentLatency) { 178 Mutex::Autolock lock(mMutex); 179 if (!mEnableFrameTimestamps) { 180 return INVALID_OPERATION; 181 } 182 183 if (compositeDeadline != nullptr) { 184 *compositeDeadline = 185 mFrameEventHistory->getNextCompositeDeadline(now()); 186 } 187 if (compositeInterval != nullptr) { 188 *compositeInterval = mFrameEventHistory->getCompositeInterval(); 189 } 190 if (compositeToPresentLatency != nullptr) { 191 *compositeToPresentLatency = 192 mFrameEventHistory->getCompositeToPresentLatency(); 193 } 194 return NO_ERROR; 195 } 196 197 static bool checkConsumerForUpdates( 198 const FrameEvents* e, const uint64_t lastFrameNumber, 199 const nsecs_t* outLatchTime, 200 const nsecs_t* outFirstRefreshStartTime, 201 const nsecs_t* outLastRefreshStartTime, 202 const nsecs_t* outGpuCompositionDoneTime, 203 const nsecs_t* outDisplayPresentTime, 204 const nsecs_t* outDequeueReadyTime, 205 const nsecs_t* outReleaseTime) { 206 bool checkForLatch = (outLatchTime != nullptr) && !e->hasLatchInfo(); 207 bool checkForFirstRefreshStart = (outFirstRefreshStartTime != nullptr) && 208 !e->hasFirstRefreshStartInfo(); 209 bool checkForGpuCompositionDone = (outGpuCompositionDoneTime != nullptr) && 210 !e->hasGpuCompositionDoneInfo(); 211 bool checkForDisplayPresent = (outDisplayPresentTime != nullptr) && 212 !e->hasDisplayPresentInfo(); 213 214 // LastRefreshStart, DequeueReady, and Release are never available for the 215 // last frame. 216 bool checkForLastRefreshStart = (outLastRefreshStartTime != nullptr) && 217 !e->hasLastRefreshStartInfo() && 218 (e->frameNumber != lastFrameNumber); 219 bool checkForDequeueReady = (outDequeueReadyTime != nullptr) && 220 !e->hasDequeueReadyInfo() && (e->frameNumber != lastFrameNumber); 221 bool checkForRelease = (outReleaseTime != nullptr) && 222 !e->hasReleaseInfo() && (e->frameNumber != lastFrameNumber); 223 224 // RequestedPresent and Acquire info are always available producer-side. 225 return checkForLatch || checkForFirstRefreshStart || 226 checkForLastRefreshStart || checkForGpuCompositionDone || 227 checkForDisplayPresent || checkForDequeueReady || checkForRelease; 228 } 229 230 static void getFrameTimestamp(nsecs_t *dst, const nsecs_t& src) { 231 if (dst != nullptr) { 232 // We always get valid timestamps for these eventually. 233 *dst = (src == FrameEvents::TIMESTAMP_PENDING) ? 234 NATIVE_WINDOW_TIMESTAMP_PENDING : src; 235 } 236 } 237 238 static void getFrameTimestampFence(nsecs_t *dst, 239 const std::shared_ptr<FenceTime>& src, bool fenceShouldBeKnown) { 240 if (dst != nullptr) { 241 if (!fenceShouldBeKnown) { 242 *dst = NATIVE_WINDOW_TIMESTAMP_PENDING; 243 return; 244 } 245 246 nsecs_t signalTime = src->getSignalTime(); 247 *dst = (signalTime == Fence::SIGNAL_TIME_PENDING) ? 248 NATIVE_WINDOW_TIMESTAMP_PENDING : 249 (signalTime == Fence::SIGNAL_TIME_INVALID) ? 250 NATIVE_WINDOW_TIMESTAMP_INVALID : 251 signalTime; 252 } 253 } 254 255 status_t Surface::getFrameTimestamps(uint64_t frameNumber, 256 nsecs_t* outRequestedPresentTime, nsecs_t* outAcquireTime, 257 nsecs_t* outLatchTime, nsecs_t* outFirstRefreshStartTime, 258 nsecs_t* outLastRefreshStartTime, nsecs_t* outGpuCompositionDoneTime, 259 nsecs_t* outDisplayPresentTime, nsecs_t* outDequeueReadyTime, 260 nsecs_t* outReleaseTime) { 261 ATRACE_CALL(); 262 263 Mutex::Autolock lock(mMutex); 264 265 if (!mEnableFrameTimestamps) { 266 return INVALID_OPERATION; 267 } 268 269 // Verify the requested timestamps are supported. 270 querySupportedTimestampsLocked(); 271 if (outDisplayPresentTime != nullptr && !mFrameTimestampsSupportsPresent) { 272 return BAD_VALUE; 273 } 274 275 FrameEvents* events = mFrameEventHistory->getFrame(frameNumber); 276 if (events == nullptr) { 277 // If the entry isn't available in the producer, it's definitely not 278 // available in the consumer. 279 return NAME_NOT_FOUND; 280 } 281 282 // Update our cache of events if the requested events are not available. 283 if (checkConsumerForUpdates(events, mLastFrameNumber, 284 outLatchTime, outFirstRefreshStartTime, outLastRefreshStartTime, 285 outGpuCompositionDoneTime, outDisplayPresentTime, 286 outDequeueReadyTime, outReleaseTime)) { 287 FrameEventHistoryDelta delta; 288 mGraphicBufferProducer->getFrameTimestamps(&delta); 289 mFrameEventHistory->applyDelta(delta); 290 events = mFrameEventHistory->getFrame(frameNumber); 291 } 292 293 if (events == nullptr) { 294 // The entry was available before the update, but was overwritten 295 // after the update. Make sure not to send the wrong frame's data. 296 return NAME_NOT_FOUND; 297 } 298 299 getFrameTimestamp(outRequestedPresentTime, events->requestedPresentTime); 300 getFrameTimestamp(outLatchTime, events->latchTime); 301 getFrameTimestamp(outFirstRefreshStartTime, events->firstRefreshStartTime); 302 getFrameTimestamp(outLastRefreshStartTime, events->lastRefreshStartTime); 303 getFrameTimestamp(outDequeueReadyTime, events->dequeueReadyTime); 304 305 getFrameTimestampFence(outAcquireTime, events->acquireFence, 306 events->hasAcquireInfo()); 307 getFrameTimestampFence(outGpuCompositionDoneTime, 308 events->gpuCompositionDoneFence, 309 events->hasGpuCompositionDoneInfo()); 310 getFrameTimestampFence(outDisplayPresentTime, events->displayPresentFence, 311 events->hasDisplayPresentInfo()); 312 getFrameTimestampFence(outReleaseTime, events->releaseFence, 313 events->hasReleaseInfo()); 314 315 return NO_ERROR; 316 } 317 318 using namespace android::hardware::configstore; 319 using namespace android::hardware::configstore::V1_0; 320 321 status_t Surface::getWideColorSupport(bool* supported) { 322 ATRACE_CALL(); 323 324 sp<IBinder> display( 325 composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); 326 Vector<android_color_mode_t> colorModes; 327 status_t err = 328 composerService()->getDisplayColorModes(display, &colorModes); 329 330 if (err) 331 return err; 332 333 bool wideColorBoardConfig = 334 getBool<ISurfaceFlingerConfigs, 335 &ISurfaceFlingerConfigs::hasWideColorDisplay>(false); 336 337 *supported = false; 338 for (android_color_mode_t colorMode : colorModes) { 339 switch (colorMode) { 340 case HAL_COLOR_MODE_DISPLAY_P3: 341 case HAL_COLOR_MODE_ADOBE_RGB: 342 case HAL_COLOR_MODE_DCI_P3: 343 if (wideColorBoardConfig) { 344 *supported = true; 345 } 346 break; 347 default: 348 break; 349 } 350 } 351 352 return NO_ERROR; 353 } 354 355 status_t Surface::getHdrSupport(bool* supported) { 356 ATRACE_CALL(); 357 358 sp<IBinder> display( 359 composerService()->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); 360 HdrCapabilities hdrCapabilities; 361 status_t err = 362 composerService()->getHdrCapabilities(display, &hdrCapabilities); 363 364 if (err) 365 return err; 366 367 *supported = !hdrCapabilities.getSupportedHdrTypes().empty(); 368 369 return NO_ERROR; 370 } 371 372 int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { 373 Surface* c = getSelf(window); 374 return c->setSwapInterval(interval); 375 } 376 377 int Surface::hook_dequeueBuffer(ANativeWindow* window, 378 ANativeWindowBuffer** buffer, int* fenceFd) { 379 Surface* c = getSelf(window); 380 return c->dequeueBuffer(buffer, fenceFd); 381 } 382 383 int Surface::hook_cancelBuffer(ANativeWindow* window, 384 ANativeWindowBuffer* buffer, int fenceFd) { 385 Surface* c = getSelf(window); 386 return c->cancelBuffer(buffer, fenceFd); 387 } 388 389 int Surface::hook_queueBuffer(ANativeWindow* window, 390 ANativeWindowBuffer* buffer, int fenceFd) { 391 Surface* c = getSelf(window); 392 return c->queueBuffer(buffer, fenceFd); 393 } 394 395 int Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, 396 ANativeWindowBuffer** buffer) { 397 Surface* c = getSelf(window); 398 ANativeWindowBuffer* buf; 399 int fenceFd = -1; 400 int result = c->dequeueBuffer(&buf, &fenceFd); 401 if (result != OK) { 402 return result; 403 } 404 sp<Fence> fence(new Fence(fenceFd)); 405 int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED"); 406 if (waitResult != OK) { 407 ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", 408 waitResult); 409 c->cancelBuffer(buf, -1); 410 return waitResult; 411 } 412 *buffer = buf; 413 return result; 414 } 415 416 int Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window, 417 ANativeWindowBuffer* buffer) { 418 Surface* c = getSelf(window); 419 return c->cancelBuffer(buffer, -1); 420 } 421 422 int Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window, 423 ANativeWindowBuffer* buffer) { 424 Surface* c = getSelf(window); 425 return c->lockBuffer_DEPRECATED(buffer); 426 } 427 428 int Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window, 429 ANativeWindowBuffer* buffer) { 430 Surface* c = getSelf(window); 431 return c->queueBuffer(buffer, -1); 432 } 433 434 int Surface::hook_query(const ANativeWindow* window, 435 int what, int* value) { 436 const Surface* c = getSelf(window); 437 return c->query(what, value); 438 } 439 440 int Surface::hook_perform(ANativeWindow* window, int operation, ...) { 441 va_list args; 442 va_start(args, operation); 443 Surface* c = getSelf(window); 444 int result = c->perform(operation, args); 445 va_end(args); 446 return result; 447 } 448 449 int Surface::setSwapInterval(int interval) { 450 ATRACE_CALL(); 451 // EGL specification states: 452 // interval is silently clamped to minimum and maximum implementation 453 // dependent values before being stored. 454 455 if (interval < minSwapInterval) 456 interval = minSwapInterval; 457 458 if (interval > maxSwapInterval) 459 interval = maxSwapInterval; 460 461 mSwapIntervalZero = (interval == 0); 462 mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero); 463 464 return NO_ERROR; 465 } 466 467 int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { 468 ATRACE_CALL(); 469 ALOGV("Surface::dequeueBuffer"); 470 471 uint32_t reqWidth; 472 uint32_t reqHeight; 473 PixelFormat reqFormat; 474 uint64_t reqUsage; 475 bool enableFrameTimestamps; 476 477 { 478 Mutex::Autolock lock(mMutex); 479 if (mReportRemovedBuffers) { 480 mRemovedBuffers.clear(); 481 } 482 483 reqWidth = mReqWidth ? mReqWidth : mUserWidth; 484 reqHeight = mReqHeight ? mReqHeight : mUserHeight; 485 486 reqFormat = mReqFormat; 487 reqUsage = mReqUsage; 488 489 enableFrameTimestamps = mEnableFrameTimestamps; 490 491 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot != 492 BufferItem::INVALID_BUFFER_SLOT) { 493 sp<GraphicBuffer>& gbuf(mSlots[mSharedBufferSlot].buffer); 494 if (gbuf != NULL) { 495 *buffer = gbuf.get(); 496 *fenceFd = -1; 497 return OK; 498 } 499 } 500 } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffer 501 502 int buf = -1; 503 sp<Fence> fence; 504 nsecs_t startTime = systemTime(); 505 506 FrameEventHistoryDelta frameTimestamps; 507 status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight, 508 reqFormat, reqUsage, &mBufferAge, 509 enableFrameTimestamps ? &frameTimestamps 510 : nullptr); 511 mLastDequeueDuration = systemTime() - startTime; 512 513 if (result < 0) { 514 ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer" 515 "(%d, %d, %d, %#" PRIx64 ") failed: %d", 516 reqWidth, reqHeight, reqFormat, reqUsage, result); 517 return result; 518 } 519 520 if (buf < 0 || buf >= NUM_BUFFER_SLOTS) { 521 ALOGE("dequeueBuffer: IGraphicBufferProducer returned invalid slot number %d", buf); 522 android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging 523 return FAILED_TRANSACTION; 524 } 525 526 Mutex::Autolock lock(mMutex); 527 528 // Write this while holding the mutex 529 mLastDequeueStartTime = startTime; 530 531 sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); 532 533 // this should never happen 534 ALOGE_IF(fence == NULL, "Surface::dequeueBuffer: received null Fence! buf=%d", buf); 535 536 if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) { 537 freeAllBuffers(); 538 } 539 540 if (enableFrameTimestamps) { 541 mFrameEventHistory->applyDelta(frameTimestamps); 542 } 543 544 if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) { 545 if (mReportRemovedBuffers && (gbuf != nullptr)) { 546 mRemovedBuffers.push_back(gbuf); 547 } 548 result = mGraphicBufferProducer->requestBuffer(buf, &gbuf); 549 if (result != NO_ERROR) { 550 ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result); 551 mGraphicBufferProducer->cancelBuffer(buf, fence); 552 return result; 553 } 554 } 555 556 if (fence->isValid()) { 557 *fenceFd = fence->dup(); 558 if (*fenceFd == -1) { 559 ALOGE("dequeueBuffer: error duping fence: %d", errno); 560 // dup() should never fail; something is badly wrong. Soldier on 561 // and hope for the best; the worst that should happen is some 562 // visible corruption that lasts until the next frame. 563 } 564 } else { 565 *fenceFd = -1; 566 } 567 568 *buffer = gbuf.get(); 569 570 if (mSharedBufferMode && mAutoRefresh) { 571 mSharedBufferSlot = buf; 572 mSharedBufferHasBeenQueued = false; 573 } else if (mSharedBufferSlot == buf) { 574 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 575 mSharedBufferHasBeenQueued = false; 576 } 577 578 return OK; 579 } 580 581 int Surface::cancelBuffer(android_native_buffer_t* buffer, 582 int fenceFd) { 583 ATRACE_CALL(); 584 ALOGV("Surface::cancelBuffer"); 585 Mutex::Autolock lock(mMutex); 586 int i = getSlotFromBufferLocked(buffer); 587 if (i < 0) { 588 if (fenceFd >= 0) { 589 close(fenceFd); 590 } 591 return i; 592 } 593 if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) { 594 if (fenceFd >= 0) { 595 close(fenceFd); 596 } 597 return OK; 598 } 599 sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 600 mGraphicBufferProducer->cancelBuffer(i, fence); 601 602 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) { 603 mSharedBufferHasBeenQueued = true; 604 } 605 606 return OK; 607 } 608 609 int Surface::getSlotFromBufferLocked( 610 android_native_buffer_t* buffer) const { 611 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 612 if (mSlots[i].buffer != NULL && 613 mSlots[i].buffer->handle == buffer->handle) { 614 return i; 615 } 616 } 617 ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); 618 return BAD_VALUE; 619 } 620 621 int Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__((unused))) { 622 ALOGV("Surface::lockBuffer"); 623 Mutex::Autolock lock(mMutex); 624 return OK; 625 } 626 627 int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { 628 ATRACE_CALL(); 629 ALOGV("Surface::queueBuffer"); 630 Mutex::Autolock lock(mMutex); 631 int64_t timestamp; 632 bool isAutoTimestamp = false; 633 634 if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 635 timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 636 isAutoTimestamp = true; 637 ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 638 timestamp / 1000000.0); 639 } else { 640 timestamp = mTimestamp; 641 } 642 int i = getSlotFromBufferLocked(buffer); 643 if (i < 0) { 644 if (fenceFd >= 0) { 645 close(fenceFd); 646 } 647 return i; 648 } 649 if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) { 650 if (fenceFd >= 0) { 651 close(fenceFd); 652 } 653 return OK; 654 } 655 656 657 // Make sure the crop rectangle is entirely inside the buffer. 658 Rect crop(Rect::EMPTY_RECT); 659 mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 660 661 sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 662 IGraphicBufferProducer::QueueBufferOutput output; 663 IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp, 664 mDataSpace, crop, mScalingMode, mTransform ^ mStickyTransform, 665 fence, mStickyTransform, mEnableFrameTimestamps); 666 667 if (mConnectedToCpu || mDirtyRegion.bounds() == Rect::INVALID_RECT) { 668 input.setSurfaceDamage(Region::INVALID_REGION); 669 } else { 670 // Here we do two things: 671 // 1) The surface damage was specified using the OpenGL ES convention of 672 // the origin being in the bottom-left corner. Here we flip to the 673 // convention that the rest of the system uses (top-left corner) by 674 // subtracting all top/bottom coordinates from the buffer height. 675 // 2) If the buffer is coming in rotated (for example, because the EGL 676 // implementation is reacting to the transform hint coming back from 677 // SurfaceFlinger), the surface damage needs to be rotated the 678 // opposite direction, since it was generated assuming an unrotated 679 // buffer (the app doesn't know that the EGL implementation is 680 // reacting to the transform hint behind its back). The 681 // transformations in the switch statement below apply those 682 // complementary rotations (e.g., if 90 degrees, rotate 270 degrees). 683 684 int width = buffer->width; 685 int height = buffer->height; 686 bool rotated90 = (mTransform ^ mStickyTransform) & 687 NATIVE_WINDOW_TRANSFORM_ROT_90; 688 if (rotated90) { 689 std::swap(width, height); 690 } 691 692 Region flippedRegion; 693 for (auto rect : mDirtyRegion) { 694 int left = rect.left; 695 int right = rect.right; 696 int top = height - rect.bottom; // Flip from OpenGL convention 697 int bottom = height - rect.top; // Flip from OpenGL convention 698 switch (mTransform ^ mStickyTransform) { 699 case NATIVE_WINDOW_TRANSFORM_ROT_90: { 700 // Rotate 270 degrees 701 Rect flippedRect{top, width - right, bottom, width - left}; 702 flippedRegion.orSelf(flippedRect); 703 break; 704 } 705 case NATIVE_WINDOW_TRANSFORM_ROT_180: { 706 // Rotate 180 degrees 707 Rect flippedRect{width - right, height - bottom, 708 width - left, height - top}; 709 flippedRegion.orSelf(flippedRect); 710 break; 711 } 712 case NATIVE_WINDOW_TRANSFORM_ROT_270: { 713 // Rotate 90 degrees 714 Rect flippedRect{height - bottom, left, 715 height - top, right}; 716 flippedRegion.orSelf(flippedRect); 717 break; 718 } 719 default: { 720 Rect flippedRect{left, top, right, bottom}; 721 flippedRegion.orSelf(flippedRect); 722 break; 723 } 724 } 725 } 726 727 input.setSurfaceDamage(flippedRegion); 728 } 729 730 nsecs_t now = systemTime(); 731 status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 732 mLastQueueDuration = systemTime() - now; 733 if (err != OK) { 734 ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 735 } 736 737 if (mEnableFrameTimestamps) { 738 mFrameEventHistory->applyDelta(output.frameTimestamps); 739 // Update timestamps with the local acquire fence. 740 // The consumer doesn't send it back to prevent us from having two 741 // file descriptors of the same fence. 742 mFrameEventHistory->updateAcquireFence(mNextFrameNumber, 743 std::make_shared<FenceTime>(std::move(fence))); 744 745 // Cache timestamps of signaled fences so we can close their file 746 // descriptors. 747 mFrameEventHistory->updateSignalTimes(); 748 } 749 750 mLastFrameNumber = mNextFrameNumber; 751 752 mDefaultWidth = output.width; 753 mDefaultHeight = output.height; 754 mNextFrameNumber = output.nextFrameNumber; 755 756 // Disable transform hint if sticky transform is set. 757 if (mStickyTransform == 0) { 758 mTransformHint = output.transformHint; 759 } 760 761 mConsumerRunningBehind = (output.numPendingBuffers >= 2); 762 763 if (!mConnectedToCpu) { 764 // Clear surface damage back to full-buffer 765 mDirtyRegion = Region::INVALID_REGION; 766 } 767 768 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) { 769 mSharedBufferHasBeenQueued = true; 770 } 771 772 mQueueBufferCondition.broadcast(); 773 774 return err; 775 } 776 777 void Surface::querySupportedTimestampsLocked() const { 778 // mMutex must be locked when calling this method. 779 780 if (mQueriedSupportedTimestamps) { 781 return; 782 } 783 mQueriedSupportedTimestamps = true; 784 785 std::vector<FrameEvent> supportedFrameTimestamps; 786 status_t err = composerService()->getSupportedFrameTimestamps( 787 &supportedFrameTimestamps); 788 789 if (err != NO_ERROR) { 790 return; 791 } 792 793 for (auto sft : supportedFrameTimestamps) { 794 if (sft == FrameEvent::DISPLAY_PRESENT) { 795 mFrameTimestampsSupportsPresent = true; 796 } 797 } 798 } 799 800 int Surface::query(int what, int* value) const { 801 ATRACE_CALL(); 802 ALOGV("Surface::query"); 803 { // scope for the lock 804 Mutex::Autolock lock(mMutex); 805 switch (what) { 806 case NATIVE_WINDOW_FORMAT: 807 if (mReqFormat) { 808 *value = static_cast<int>(mReqFormat); 809 return NO_ERROR; 810 } 811 break; 812 case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 813 if (composerService()->authenticateSurfaceTexture( 814 mGraphicBufferProducer)) { 815 *value = 1; 816 } else { 817 *value = 0; 818 } 819 return NO_ERROR; 820 } 821 case NATIVE_WINDOW_CONCRETE_TYPE: 822 *value = NATIVE_WINDOW_SURFACE; 823 return NO_ERROR; 824 case NATIVE_WINDOW_DEFAULT_WIDTH: 825 *value = static_cast<int>( 826 mUserWidth ? mUserWidth : mDefaultWidth); 827 return NO_ERROR; 828 case NATIVE_WINDOW_DEFAULT_HEIGHT: 829 *value = static_cast<int>( 830 mUserHeight ? mUserHeight : mDefaultHeight); 831 return NO_ERROR; 832 case NATIVE_WINDOW_TRANSFORM_HINT: 833 *value = static_cast<int>(mTransformHint); 834 return NO_ERROR; 835 case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 836 status_t err = NO_ERROR; 837 if (!mConsumerRunningBehind) { 838 *value = 0; 839 } else { 840 err = mGraphicBufferProducer->query(what, value); 841 if (err == NO_ERROR) { 842 mConsumerRunningBehind = *value; 843 } 844 } 845 return err; 846 } 847 case NATIVE_WINDOW_BUFFER_AGE: { 848 if (mBufferAge > INT32_MAX) { 849 *value = 0; 850 } else { 851 *value = static_cast<int32_t>(mBufferAge); 852 } 853 return NO_ERROR; 854 } 855 case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: { 856 int64_t durationUs = mLastDequeueDuration / 1000; 857 *value = durationUs > std::numeric_limits<int>::max() ? 858 std::numeric_limits<int>::max() : 859 static_cast<int>(durationUs); 860 return NO_ERROR; 861 } 862 case NATIVE_WINDOW_LAST_QUEUE_DURATION: { 863 int64_t durationUs = mLastQueueDuration / 1000; 864 *value = durationUs > std::numeric_limits<int>::max() ? 865 std::numeric_limits<int>::max() : 866 static_cast<int>(durationUs); 867 return NO_ERROR; 868 } 869 case NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT: { 870 querySupportedTimestampsLocked(); 871 *value = mFrameTimestampsSupportsPresent ? 1 : 0; 872 return NO_ERROR; 873 } 874 case NATIVE_WINDOW_IS_VALID: { 875 *value = mGraphicBufferProducer != nullptr ? 1 : 0; 876 return NO_ERROR; 877 } 878 } 879 } 880 return mGraphicBufferProducer->query(what, value); 881 } 882 883 int Surface::perform(int operation, va_list args) 884 { 885 int res = NO_ERROR; 886 switch (operation) { 887 case NATIVE_WINDOW_CONNECT: 888 // deprecated. must return NO_ERROR. 889 break; 890 case NATIVE_WINDOW_DISCONNECT: 891 // deprecated. must return NO_ERROR. 892 break; 893 case NATIVE_WINDOW_SET_USAGE: 894 res = dispatchSetUsage(args); 895 break; 896 case NATIVE_WINDOW_SET_CROP: 897 res = dispatchSetCrop(args); 898 break; 899 case NATIVE_WINDOW_SET_BUFFER_COUNT: 900 res = dispatchSetBufferCount(args); 901 break; 902 case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 903 res = dispatchSetBuffersGeometry(args); 904 break; 905 case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 906 res = dispatchSetBuffersTransform(args); 907 break; 908 case NATIVE_WINDOW_SET_BUFFERS_STICKY_TRANSFORM: 909 res = dispatchSetBuffersStickyTransform(args); 910 break; 911 case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 912 res = dispatchSetBuffersTimestamp(args); 913 break; 914 case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 915 res = dispatchSetBuffersDimensions(args); 916 break; 917 case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 918 res = dispatchSetBuffersUserDimensions(args); 919 break; 920 case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 921 res = dispatchSetBuffersFormat(args); 922 break; 923 case NATIVE_WINDOW_LOCK: 924 res = dispatchLock(args); 925 break; 926 case NATIVE_WINDOW_UNLOCK_AND_POST: 927 res = dispatchUnlockAndPost(args); 928 break; 929 case NATIVE_WINDOW_SET_SCALING_MODE: 930 res = dispatchSetScalingMode(args); 931 break; 932 case NATIVE_WINDOW_API_CONNECT: 933 res = dispatchConnect(args); 934 break; 935 case NATIVE_WINDOW_API_DISCONNECT: 936 res = dispatchDisconnect(args); 937 break; 938 case NATIVE_WINDOW_SET_SIDEBAND_STREAM: 939 res = dispatchSetSidebandStream(args); 940 break; 941 case NATIVE_WINDOW_SET_BUFFERS_DATASPACE: 942 res = dispatchSetBuffersDataSpace(args); 943 break; 944 case NATIVE_WINDOW_SET_SURFACE_DAMAGE: 945 res = dispatchSetSurfaceDamage(args); 946 break; 947 case NATIVE_WINDOW_SET_SHARED_BUFFER_MODE: 948 res = dispatchSetSharedBufferMode(args); 949 break; 950 case NATIVE_WINDOW_SET_AUTO_REFRESH: 951 res = dispatchSetAutoRefresh(args); 952 break; 953 case NATIVE_WINDOW_GET_REFRESH_CYCLE_DURATION: 954 res = dispatchGetDisplayRefreshCycleDuration(args); 955 break; 956 case NATIVE_WINDOW_GET_NEXT_FRAME_ID: 957 res = dispatchGetNextFrameId(args); 958 break; 959 case NATIVE_WINDOW_ENABLE_FRAME_TIMESTAMPS: 960 res = dispatchEnableFrameTimestamps(args); 961 break; 962 case NATIVE_WINDOW_GET_COMPOSITOR_TIMING: 963 res = dispatchGetCompositorTiming(args); 964 break; 965 case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS: 966 res = dispatchGetFrameTimestamps(args); 967 break; 968 case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT: 969 res = dispatchGetWideColorSupport(args); 970 break; 971 case NATIVE_WINDOW_GET_HDR_SUPPORT: 972 res = dispatchGetHdrSupport(args); 973 break; 974 case NATIVE_WINDOW_SET_USAGE64: 975 res = dispatchSetUsage64(args); 976 break; 977 case NATIVE_WINDOW_GET_CONSUMER_USAGE64: 978 res = dispatchGetConsumerUsage64(args); 979 break; 980 default: 981 res = NAME_NOT_FOUND; 982 break; 983 } 984 return res; 985 } 986 987 int Surface::dispatchConnect(va_list args) { 988 int api = va_arg(args, int); 989 return connect(api); 990 } 991 992 int Surface::dispatchDisconnect(va_list args) { 993 int api = va_arg(args, int); 994 return disconnect(api); 995 } 996 997 int Surface::dispatchSetUsage(va_list args) { 998 uint64_t usage = va_arg(args, uint32_t); 999 return setUsage(usage); 1000 } 1001 1002 int Surface::dispatchSetUsage64(va_list args) { 1003 uint64_t usage = va_arg(args, uint64_t); 1004 return setUsage(usage); 1005 } 1006 1007 int Surface::dispatchSetCrop(va_list args) { 1008 android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 1009 return setCrop(reinterpret_cast<Rect const*>(rect)); 1010 } 1011 1012 int Surface::dispatchSetBufferCount(va_list args) { 1013 size_t bufferCount = va_arg(args, size_t); 1014 return setBufferCount(static_cast<int32_t>(bufferCount)); 1015 } 1016 1017 int Surface::dispatchSetBuffersGeometry(va_list args) { 1018 uint32_t width = va_arg(args, uint32_t); 1019 uint32_t height = va_arg(args, uint32_t); 1020 PixelFormat format = va_arg(args, PixelFormat); 1021 int err = setBuffersDimensions(width, height); 1022 if (err != 0) { 1023 return err; 1024 } 1025 return setBuffersFormat(format); 1026 } 1027 1028 int Surface::dispatchSetBuffersDimensions(va_list args) { 1029 uint32_t width = va_arg(args, uint32_t); 1030 uint32_t height = va_arg(args, uint32_t); 1031 return setBuffersDimensions(width, height); 1032 } 1033 1034 int Surface::dispatchSetBuffersUserDimensions(va_list args) { 1035 uint32_t width = va_arg(args, uint32_t); 1036 uint32_t height = va_arg(args, uint32_t); 1037 return setBuffersUserDimensions(width, height); 1038 } 1039 1040 int Surface::dispatchSetBuffersFormat(va_list args) { 1041 PixelFormat format = va_arg(args, PixelFormat); 1042 return setBuffersFormat(format); 1043 } 1044 1045 int Surface::dispatchSetScalingMode(va_list args) { 1046 int mode = va_arg(args, int); 1047 return setScalingMode(mode); 1048 } 1049 1050 int Surface::dispatchSetBuffersTransform(va_list args) { 1051 uint32_t transform = va_arg(args, uint32_t); 1052 return setBuffersTransform(transform); 1053 } 1054 1055 int Surface::dispatchSetBuffersStickyTransform(va_list args) { 1056 uint32_t transform = va_arg(args, uint32_t); 1057 return setBuffersStickyTransform(transform); 1058 } 1059 1060 int Surface::dispatchSetBuffersTimestamp(va_list args) { 1061 int64_t timestamp = va_arg(args, int64_t); 1062 return setBuffersTimestamp(timestamp); 1063 } 1064 1065 int Surface::dispatchLock(va_list args) { 1066 ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 1067 ARect* inOutDirtyBounds = va_arg(args, ARect*); 1068 return lock(outBuffer, inOutDirtyBounds); 1069 } 1070 1071 int Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) { 1072 return unlockAndPost(); 1073 } 1074 1075 int Surface::dispatchSetSidebandStream(va_list args) { 1076 native_handle_t* sH = va_arg(args, native_handle_t*); 1077 sp<NativeHandle> sidebandHandle = NativeHandle::create(sH, false); 1078 setSidebandStream(sidebandHandle); 1079 return OK; 1080 } 1081 1082 int Surface::dispatchSetBuffersDataSpace(va_list args) { 1083 android_dataspace dataspace = 1084 static_cast<android_dataspace>(va_arg(args, int)); 1085 return setBuffersDataSpace(dataspace); 1086 } 1087 1088 int Surface::dispatchSetSurfaceDamage(va_list args) { 1089 android_native_rect_t* rects = va_arg(args, android_native_rect_t*); 1090 size_t numRects = va_arg(args, size_t); 1091 setSurfaceDamage(rects, numRects); 1092 return NO_ERROR; 1093 } 1094 1095 int Surface::dispatchSetSharedBufferMode(va_list args) { 1096 bool sharedBufferMode = va_arg(args, int); 1097 return setSharedBufferMode(sharedBufferMode); 1098 } 1099 1100 int Surface::dispatchSetAutoRefresh(va_list args) { 1101 bool autoRefresh = va_arg(args, int); 1102 return setAutoRefresh(autoRefresh); 1103 } 1104 1105 int Surface::dispatchGetDisplayRefreshCycleDuration(va_list args) { 1106 nsecs_t* outRefreshDuration = va_arg(args, int64_t*); 1107 return getDisplayRefreshCycleDuration(outRefreshDuration); 1108 } 1109 1110 int Surface::dispatchGetNextFrameId(va_list args) { 1111 uint64_t* nextFrameId = va_arg(args, uint64_t*); 1112 *nextFrameId = getNextFrameNumber(); 1113 return NO_ERROR; 1114 } 1115 1116 int Surface::dispatchEnableFrameTimestamps(va_list args) { 1117 bool enable = va_arg(args, int); 1118 enableFrameTimestamps(enable); 1119 return NO_ERROR; 1120 } 1121 1122 int Surface::dispatchGetCompositorTiming(va_list args) { 1123 nsecs_t* compositeDeadline = va_arg(args, int64_t*); 1124 nsecs_t* compositeInterval = va_arg(args, int64_t*); 1125 nsecs_t* compositeToPresentLatency = va_arg(args, int64_t*); 1126 return getCompositorTiming(compositeDeadline, compositeInterval, 1127 compositeToPresentLatency); 1128 } 1129 1130 int Surface::dispatchGetFrameTimestamps(va_list args) { 1131 uint64_t frameId = va_arg(args, uint64_t); 1132 nsecs_t* outRequestedPresentTime = va_arg(args, int64_t*); 1133 nsecs_t* outAcquireTime = va_arg(args, int64_t*); 1134 nsecs_t* outLatchTime = va_arg(args, int64_t*); 1135 nsecs_t* outFirstRefreshStartTime = va_arg(args, int64_t*); 1136 nsecs_t* outLastRefreshStartTime = va_arg(args, int64_t*); 1137 nsecs_t* outGpuCompositionDoneTime = va_arg(args, int64_t*); 1138 nsecs_t* outDisplayPresentTime = va_arg(args, int64_t*); 1139 nsecs_t* outDequeueReadyTime = va_arg(args, int64_t*); 1140 nsecs_t* outReleaseTime = va_arg(args, int64_t*); 1141 return getFrameTimestamps(frameId, 1142 outRequestedPresentTime, outAcquireTime, outLatchTime, 1143 outFirstRefreshStartTime, outLastRefreshStartTime, 1144 outGpuCompositionDoneTime, outDisplayPresentTime, 1145 outDequeueReadyTime, outReleaseTime); 1146 } 1147 1148 int Surface::dispatchGetWideColorSupport(va_list args) { 1149 bool* outSupport = va_arg(args, bool*); 1150 return getWideColorSupport(outSupport); 1151 } 1152 1153 int Surface::dispatchGetHdrSupport(va_list args) { 1154 bool* outSupport = va_arg(args, bool*); 1155 return getHdrSupport(outSupport); 1156 } 1157 1158 int Surface::dispatchGetConsumerUsage64(va_list args) { 1159 uint64_t* usage = va_arg(args, uint64_t*); 1160 return getConsumerUsage(usage); 1161 } 1162 1163 int Surface::connect(int api) { 1164 static sp<IProducerListener> listener = new DummyProducerListener(); 1165 return connect(api, listener); 1166 } 1167 1168 int Surface::connect(int api, const sp<IProducerListener>& listener) { 1169 return connect(api, listener, false); 1170 } 1171 1172 int Surface::connect( 1173 int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) { 1174 ATRACE_CALL(); 1175 ALOGV("Surface::connect"); 1176 Mutex::Autolock lock(mMutex); 1177 IGraphicBufferProducer::QueueBufferOutput output; 1178 mReportRemovedBuffers = reportBufferRemoval; 1179 int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output); 1180 if (err == NO_ERROR) { 1181 mDefaultWidth = output.width; 1182 mDefaultHeight = output.height; 1183 mNextFrameNumber = output.nextFrameNumber; 1184 1185 // Disable transform hint if sticky transform is set. 1186 if (mStickyTransform == 0) { 1187 mTransformHint = output.transformHint; 1188 } 1189 1190 mConsumerRunningBehind = (output.numPendingBuffers >= 2); 1191 } 1192 if (!err && api == NATIVE_WINDOW_API_CPU) { 1193 mConnectedToCpu = true; 1194 // Clear the dirty region in case we're switching from a non-CPU API 1195 mDirtyRegion.clear(); 1196 } else if (!err) { 1197 // Initialize the dirty region for tracking surface damage 1198 mDirtyRegion = Region::INVALID_REGION; 1199 } 1200 1201 return err; 1202 } 1203 1204 1205 int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) { 1206 ATRACE_CALL(); 1207 ALOGV("Surface::disconnect"); 1208 Mutex::Autolock lock(mMutex); 1209 mRemovedBuffers.clear(); 1210 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1211 mSharedBufferHasBeenQueued = false; 1212 freeAllBuffers(); 1213 int err = mGraphicBufferProducer->disconnect(api, mode); 1214 if (!err) { 1215 mReqFormat = 0; 1216 mReqWidth = 0; 1217 mReqHeight = 0; 1218 mReqUsage = 0; 1219 mCrop.clear(); 1220 mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 1221 mTransform = 0; 1222 mStickyTransform = 0; 1223 1224 if (api == NATIVE_WINDOW_API_CPU) { 1225 mConnectedToCpu = false; 1226 } 1227 } 1228 return err; 1229 } 1230 1231 int Surface::detachNextBuffer(sp<GraphicBuffer>* outBuffer, 1232 sp<Fence>* outFence) { 1233 ATRACE_CALL(); 1234 ALOGV("Surface::detachNextBuffer"); 1235 1236 if (outBuffer == NULL || outFence == NULL) { 1237 return BAD_VALUE; 1238 } 1239 1240 Mutex::Autolock lock(mMutex); 1241 if (mReportRemovedBuffers) { 1242 mRemovedBuffers.clear(); 1243 } 1244 1245 sp<GraphicBuffer> buffer(NULL); 1246 sp<Fence> fence(NULL); 1247 status_t result = mGraphicBufferProducer->detachNextBuffer( 1248 &buffer, &fence); 1249 if (result != NO_ERROR) { 1250 return result; 1251 } 1252 1253 *outBuffer = buffer; 1254 if (fence != NULL && fence->isValid()) { 1255 *outFence = fence; 1256 } else { 1257 *outFence = Fence::NO_FENCE; 1258 } 1259 1260 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 1261 if (mSlots[i].buffer != NULL && 1262 mSlots[i].buffer->getId() == buffer->getId()) { 1263 if (mReportRemovedBuffers) { 1264 mRemovedBuffers.push_back(mSlots[i].buffer); 1265 } 1266 mSlots[i].buffer = NULL; 1267 } 1268 } 1269 1270 return NO_ERROR; 1271 } 1272 1273 int Surface::attachBuffer(ANativeWindowBuffer* buffer) 1274 { 1275 ATRACE_CALL(); 1276 ALOGV("Surface::attachBuffer"); 1277 1278 Mutex::Autolock lock(mMutex); 1279 if (mReportRemovedBuffers) { 1280 mRemovedBuffers.clear(); 1281 } 1282 1283 sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer)); 1284 uint32_t priorGeneration = graphicBuffer->mGenerationNumber; 1285 graphicBuffer->mGenerationNumber = mGenerationNumber; 1286 int32_t attachedSlot = -1; 1287 status_t result = mGraphicBufferProducer->attachBuffer(&attachedSlot, graphicBuffer); 1288 if (result != NO_ERROR) { 1289 ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result); 1290 graphicBuffer->mGenerationNumber = priorGeneration; 1291 return result; 1292 } 1293 if (mReportRemovedBuffers && (mSlots[attachedSlot].buffer != nullptr)) { 1294 mRemovedBuffers.push_back(mSlots[attachedSlot].buffer); 1295 } 1296 mSlots[attachedSlot].buffer = graphicBuffer; 1297 1298 return NO_ERROR; 1299 } 1300 1301 int Surface::setUsage(uint64_t reqUsage) 1302 { 1303 ALOGV("Surface::setUsage"); 1304 Mutex::Autolock lock(mMutex); 1305 if (reqUsage != mReqUsage) { 1306 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1307 } 1308 mReqUsage = reqUsage; 1309 return OK; 1310 } 1311 1312 int Surface::setCrop(Rect const* rect) 1313 { 1314 ATRACE_CALL(); 1315 1316 Rect realRect(Rect::EMPTY_RECT); 1317 if (rect == NULL || rect->isEmpty()) { 1318 realRect.clear(); 1319 } else { 1320 realRect = *rect; 1321 } 1322 1323 ALOGV("Surface::setCrop rect=[%d %d %d %d]", 1324 realRect.left, realRect.top, realRect.right, realRect.bottom); 1325 1326 Mutex::Autolock lock(mMutex); 1327 mCrop = realRect; 1328 return NO_ERROR; 1329 } 1330 1331 int Surface::setBufferCount(int bufferCount) 1332 { 1333 ATRACE_CALL(); 1334 ALOGV("Surface::setBufferCount"); 1335 Mutex::Autolock lock(mMutex); 1336 1337 status_t err = NO_ERROR; 1338 if (bufferCount == 0) { 1339 err = mGraphicBufferProducer->setMaxDequeuedBufferCount(1); 1340 } else { 1341 int minUndequeuedBuffers = 0; 1342 err = mGraphicBufferProducer->query( 1343 NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers); 1344 if (err == NO_ERROR) { 1345 err = mGraphicBufferProducer->setMaxDequeuedBufferCount( 1346 bufferCount - minUndequeuedBuffers); 1347 } 1348 } 1349 1350 ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 1351 bufferCount, strerror(-err)); 1352 1353 return err; 1354 } 1355 1356 int Surface::setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 1357 ATRACE_CALL(); 1358 ALOGV("Surface::setMaxDequeuedBufferCount"); 1359 Mutex::Autolock lock(mMutex); 1360 1361 status_t err = mGraphicBufferProducer->setMaxDequeuedBufferCount( 1362 maxDequeuedBuffers); 1363 ALOGE_IF(err, "IGraphicBufferProducer::setMaxDequeuedBufferCount(%d) " 1364 "returned %s", maxDequeuedBuffers, strerror(-err)); 1365 1366 return err; 1367 } 1368 1369 int Surface::setAsyncMode(bool async) { 1370 ATRACE_CALL(); 1371 ALOGV("Surface::setAsyncMode"); 1372 Mutex::Autolock lock(mMutex); 1373 1374 status_t err = mGraphicBufferProducer->setAsyncMode(async); 1375 ALOGE_IF(err, "IGraphicBufferProducer::setAsyncMode(%d) returned %s", 1376 async, strerror(-err)); 1377 1378 return err; 1379 } 1380 1381 int Surface::setSharedBufferMode(bool sharedBufferMode) { 1382 ATRACE_CALL(); 1383 ALOGV("Surface::setSharedBufferMode (%d)", sharedBufferMode); 1384 Mutex::Autolock lock(mMutex); 1385 1386 status_t err = mGraphicBufferProducer->setSharedBufferMode( 1387 sharedBufferMode); 1388 if (err == NO_ERROR) { 1389 mSharedBufferMode = sharedBufferMode; 1390 } 1391 ALOGE_IF(err, "IGraphicBufferProducer::setSharedBufferMode(%d) returned" 1392 "%s", sharedBufferMode, strerror(-err)); 1393 1394 return err; 1395 } 1396 1397 int Surface::setAutoRefresh(bool autoRefresh) { 1398 ATRACE_CALL(); 1399 ALOGV("Surface::setAutoRefresh (%d)", autoRefresh); 1400 Mutex::Autolock lock(mMutex); 1401 1402 status_t err = mGraphicBufferProducer->setAutoRefresh(autoRefresh); 1403 if (err == NO_ERROR) { 1404 mAutoRefresh = autoRefresh; 1405 } 1406 ALOGE_IF(err, "IGraphicBufferProducer::setAutoRefresh(%d) returned %s", 1407 autoRefresh, strerror(-err)); 1408 return err; 1409 } 1410 1411 int Surface::setBuffersDimensions(uint32_t width, uint32_t height) 1412 { 1413 ATRACE_CALL(); 1414 ALOGV("Surface::setBuffersDimensions"); 1415 1416 if ((width && !height) || (!width && height)) 1417 return BAD_VALUE; 1418 1419 Mutex::Autolock lock(mMutex); 1420 if (width != mReqWidth || height != mReqHeight) { 1421 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1422 } 1423 mReqWidth = width; 1424 mReqHeight = height; 1425 return NO_ERROR; 1426 } 1427 1428 int Surface::setBuffersUserDimensions(uint32_t width, uint32_t height) 1429 { 1430 ATRACE_CALL(); 1431 ALOGV("Surface::setBuffersUserDimensions"); 1432 1433 if ((width && !height) || (!width && height)) 1434 return BAD_VALUE; 1435 1436 Mutex::Autolock lock(mMutex); 1437 if (width != mUserWidth || height != mUserHeight) { 1438 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1439 } 1440 mUserWidth = width; 1441 mUserHeight = height; 1442 return NO_ERROR; 1443 } 1444 1445 int Surface::setBuffersFormat(PixelFormat format) 1446 { 1447 ALOGV("Surface::setBuffersFormat"); 1448 1449 Mutex::Autolock lock(mMutex); 1450 if (format != mReqFormat) { 1451 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1452 } 1453 mReqFormat = format; 1454 return NO_ERROR; 1455 } 1456 1457 int Surface::setScalingMode(int mode) 1458 { 1459 ATRACE_CALL(); 1460 ALOGV("Surface::setScalingMode(%d)", mode); 1461 1462 switch (mode) { 1463 case NATIVE_WINDOW_SCALING_MODE_FREEZE: 1464 case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 1465 case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 1466 case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP: 1467 break; 1468 default: 1469 ALOGE("unknown scaling mode: %d", mode); 1470 return BAD_VALUE; 1471 } 1472 1473 Mutex::Autolock lock(mMutex); 1474 mScalingMode = mode; 1475 return NO_ERROR; 1476 } 1477 1478 int Surface::setBuffersTransform(uint32_t transform) 1479 { 1480 ATRACE_CALL(); 1481 ALOGV("Surface::setBuffersTransform"); 1482 Mutex::Autolock lock(mMutex); 1483 mTransform = transform; 1484 return NO_ERROR; 1485 } 1486 1487 int Surface::setBuffersStickyTransform(uint32_t transform) 1488 { 1489 ATRACE_CALL(); 1490 ALOGV("Surface::setBuffersStickyTransform"); 1491 Mutex::Autolock lock(mMutex); 1492 mStickyTransform = transform; 1493 return NO_ERROR; 1494 } 1495 1496 int Surface::setBuffersTimestamp(int64_t timestamp) 1497 { 1498 ALOGV("Surface::setBuffersTimestamp"); 1499 Mutex::Autolock lock(mMutex); 1500 mTimestamp = timestamp; 1501 return NO_ERROR; 1502 } 1503 1504 int Surface::setBuffersDataSpace(android_dataspace dataSpace) 1505 { 1506 ALOGV("Surface::setBuffersDataSpace"); 1507 Mutex::Autolock lock(mMutex); 1508 mDataSpace = dataSpace; 1509 return NO_ERROR; 1510 } 1511 1512 void Surface::freeAllBuffers() { 1513 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 1514 mSlots[i].buffer = 0; 1515 } 1516 } 1517 1518 void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) { 1519 ATRACE_CALL(); 1520 ALOGV("Surface::setSurfaceDamage"); 1521 Mutex::Autolock lock(mMutex); 1522 1523 if (mConnectedToCpu || numRects == 0) { 1524 mDirtyRegion = Region::INVALID_REGION; 1525 return; 1526 } 1527 1528 mDirtyRegion.clear(); 1529 for (size_t r = 0; r < numRects; ++r) { 1530 // We intentionally flip top and bottom here, since because they're 1531 // specified with a bottom-left origin, top > bottom, which fails 1532 // validation in the Region class. We will fix this up when we flip to a 1533 // top-left origin in queueBuffer. 1534 Rect rect(rects[r].left, rects[r].bottom, rects[r].right, rects[r].top); 1535 mDirtyRegion.orSelf(rect); 1536 } 1537 } 1538 1539 // ---------------------------------------------------------------------- 1540 // the lock/unlock APIs must be used from the same thread 1541 1542 static status_t copyBlt( 1543 const sp<GraphicBuffer>& dst, 1544 const sp<GraphicBuffer>& src, 1545 const Region& reg, 1546 int *dstFenceFd) 1547 { 1548 if (dst->getId() == src->getId()) 1549 return OK; 1550 1551 // src and dst with, height and format must be identical. no verification 1552 // is done here. 1553 status_t err; 1554 uint8_t* src_bits = NULL; 1555 err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), 1556 reinterpret_cast<void**>(&src_bits)); 1557 ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 1558 1559 uint8_t* dst_bits = NULL; 1560 err = dst->lockAsync(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), 1561 reinterpret_cast<void**>(&dst_bits), *dstFenceFd); 1562 ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 1563 *dstFenceFd = -1; 1564 1565 Region::const_iterator head(reg.begin()); 1566 Region::const_iterator tail(reg.end()); 1567 if (head != tail && src_bits && dst_bits) { 1568 const size_t bpp = bytesPerPixel(src->format); 1569 const size_t dbpr = static_cast<uint32_t>(dst->stride) * bpp; 1570 const size_t sbpr = static_cast<uint32_t>(src->stride) * bpp; 1571 1572 while (head != tail) { 1573 const Rect& r(*head++); 1574 int32_t h = r.height(); 1575 if (h <= 0) continue; 1576 size_t size = static_cast<uint32_t>(r.width()) * bpp; 1577 uint8_t const * s = src_bits + 1578 static_cast<uint32_t>(r.left + src->stride * r.top) * bpp; 1579 uint8_t * d = dst_bits + 1580 static_cast<uint32_t>(r.left + dst->stride * r.top) * bpp; 1581 if (dbpr==sbpr && size==sbpr) { 1582 size *= static_cast<size_t>(h); 1583 h = 1; 1584 } 1585 do { 1586 memcpy(d, s, size); 1587 d += dbpr; 1588 s += sbpr; 1589 } while (--h > 0); 1590 } 1591 } 1592 1593 if (src_bits) 1594 src->unlock(); 1595 1596 if (dst_bits) 1597 dst->unlockAsync(dstFenceFd); 1598 1599 return err; 1600 } 1601 1602 // ---------------------------------------------------------------------------- 1603 1604 status_t Surface::lock( 1605 ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 1606 { 1607 if (mLockedBuffer != 0) { 1608 ALOGE("Surface::lock failed, already locked"); 1609 return INVALID_OPERATION; 1610 } 1611 1612 if (!mConnectedToCpu) { 1613 int err = Surface::connect(NATIVE_WINDOW_API_CPU); 1614 if (err) { 1615 return err; 1616 } 1617 // we're intending to do software rendering from this point 1618 setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 1619 } 1620 1621 ANativeWindowBuffer* out; 1622 int fenceFd = -1; 1623 status_t err = dequeueBuffer(&out, &fenceFd); 1624 ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 1625 if (err == NO_ERROR) { 1626 sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 1627 const Rect bounds(backBuffer->width, backBuffer->height); 1628 1629 Region newDirtyRegion; 1630 if (inOutDirtyBounds) { 1631 newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 1632 newDirtyRegion.andSelf(bounds); 1633 } else { 1634 newDirtyRegion.set(bounds); 1635 } 1636 1637 // figure out if we can copy the frontbuffer back 1638 const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 1639 const bool canCopyBack = (frontBuffer != 0 && 1640 backBuffer->width == frontBuffer->width && 1641 backBuffer->height == frontBuffer->height && 1642 backBuffer->format == frontBuffer->format); 1643 1644 if (canCopyBack) { 1645 // copy the area that is invalid and not repainted this round 1646 const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 1647 if (!copyback.isEmpty()) { 1648 copyBlt(backBuffer, frontBuffer, copyback, &fenceFd); 1649 } 1650 } else { 1651 // if we can't copy-back anything, modify the user's dirty 1652 // region to make sure they redraw the whole buffer 1653 newDirtyRegion.set(bounds); 1654 mDirtyRegion.clear(); 1655 Mutex::Autolock lock(mMutex); 1656 for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 1657 mSlots[i].dirtyRegion.clear(); 1658 } 1659 } 1660 1661 1662 { // scope for the lock 1663 Mutex::Autolock lock(mMutex); 1664 int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 1665 if (backBufferSlot >= 0) { 1666 Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 1667 mDirtyRegion.subtract(dirtyRegion); 1668 dirtyRegion = newDirtyRegion; 1669 } 1670 } 1671 1672 mDirtyRegion.orSelf(newDirtyRegion); 1673 if (inOutDirtyBounds) { 1674 *inOutDirtyBounds = newDirtyRegion.getBounds(); 1675 } 1676 1677 void* vaddr; 1678 status_t res = backBuffer->lockAsync( 1679 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 1680 newDirtyRegion.bounds(), &vaddr, fenceFd); 1681 1682 ALOGW_IF(res, "failed locking buffer (handle = %p)", 1683 backBuffer->handle); 1684 1685 if (res != 0) { 1686 err = INVALID_OPERATION; 1687 } else { 1688 mLockedBuffer = backBuffer; 1689 outBuffer->width = backBuffer->width; 1690 outBuffer->height = backBuffer->height; 1691 outBuffer->stride = backBuffer->stride; 1692 outBuffer->format = backBuffer->format; 1693 outBuffer->bits = vaddr; 1694 } 1695 } 1696 return err; 1697 } 1698 1699 status_t Surface::unlockAndPost() 1700 { 1701 if (mLockedBuffer == 0) { 1702 ALOGE("Surface::unlockAndPost failed, no locked buffer"); 1703 return INVALID_OPERATION; 1704 } 1705 1706 int fd = -1; 1707 status_t err = mLockedBuffer->unlockAsync(&fd); 1708 ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 1709 1710 err = queueBuffer(mLockedBuffer.get(), fd); 1711 ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)", 1712 mLockedBuffer->handle, strerror(-err)); 1713 1714 mPostedBuffer = mLockedBuffer; 1715 mLockedBuffer = 0; 1716 return err; 1717 } 1718 1719 bool Surface::waitForNextFrame(uint64_t lastFrame, nsecs_t timeout) { 1720 Mutex::Autolock lock(mMutex); 1721 if (mNextFrameNumber > lastFrame) { 1722 return true; 1723 } 1724 return mQueueBufferCondition.waitRelative(mMutex, timeout) == OK; 1725 } 1726 1727 status_t Surface::getUniqueId(uint64_t* outId) const { 1728 Mutex::Autolock lock(mMutex); 1729 return mGraphicBufferProducer->getUniqueId(outId); 1730 } 1731 1732 int Surface::getConsumerUsage(uint64_t* outUsage) const { 1733 Mutex::Autolock lock(mMutex); 1734 return mGraphicBufferProducer->getConsumerUsage(outUsage); 1735 } 1736 1737 nsecs_t Surface::getLastDequeueStartTime() const { 1738 Mutex::Autolock lock(mMutex); 1739 return mLastDequeueStartTime; 1740 } 1741 1742 status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) { 1743 if (out == nullptr) { 1744 ALOGE("%s: out must not be null!", __FUNCTION__); 1745 return BAD_VALUE; 1746 } 1747 1748 Mutex::Autolock lock(mMutex); 1749 *out = mRemovedBuffers; 1750 mRemovedBuffers.clear(); 1751 return OK; 1752 } 1753 1754 }; // namespace android 1755