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 <condition_variable> 24 #include <deque> 25 #include <mutex> 26 #include <thread> 27 28 #include <inttypes.h> 29 30 #include <android/native_window.h> 31 32 #include <utils/Log.h> 33 #include <utils/Trace.h> 34 #include <utils/NativeHandle.h> 35 36 #include <ui/DisplayStatInfo.h> 37 #include <ui/Fence.h> 38 #include <ui/GraphicBuffer.h> 39 #include <ui/HdrCapabilities.h> 40 #include <ui/Region.h> 41 42 #include <gui/BufferItem.h> 43 #include <gui/IProducerListener.h> 44 45 #include <gui/ISurfaceComposer.h> 46 #include <gui/LayerState.h> 47 #include <private/gui/ComposerService.h> 48 49 namespace android { 50 51 using ui::ColorMode; 52 using ui::Dataspace; 53 54 namespace { 55 isInterceptorRegistrationOp(int op)56 bool isInterceptorRegistrationOp(int op) { 57 return op == NATIVE_WINDOW_SET_CANCEL_INTERCEPTOR || 58 op == NATIVE_WINDOW_SET_DEQUEUE_INTERCEPTOR || 59 op == NATIVE_WINDOW_SET_PERFORM_INTERCEPTOR || 60 op == NATIVE_WINDOW_SET_QUEUE_INTERCEPTOR || 61 op == NATIVE_WINDOW_SET_QUERY_INTERCEPTOR; 62 } 63 64 } // namespace 65 Surface(const sp<IGraphicBufferProducer> & bufferProducer,bool controlledByApp)66 Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp) 67 : mGraphicBufferProducer(bufferProducer), 68 mCrop(Rect::EMPTY_RECT), 69 mBufferAge(0), 70 mGenerationNumber(0), 71 mSharedBufferMode(false), 72 mAutoRefresh(false), 73 mSharedBufferSlot(BufferItem::INVALID_BUFFER_SLOT), 74 mSharedBufferHasBeenQueued(false), 75 mQueriedSupportedTimestamps(false), 76 mFrameTimestampsSupportsPresent(false), 77 mEnableFrameTimestamps(false), 78 mFrameEventHistory(std::make_unique<ProducerFrameEventHistory>()) { 79 // Initialize the ANativeWindow function pointers. 80 ANativeWindow::setSwapInterval = hook_setSwapInterval; 81 ANativeWindow::dequeueBuffer = hook_dequeueBuffer; 82 ANativeWindow::cancelBuffer = hook_cancelBuffer; 83 ANativeWindow::queueBuffer = hook_queueBuffer; 84 ANativeWindow::query = hook_query; 85 ANativeWindow::perform = hook_perform; 86 87 ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED; 88 ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED; 89 ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED; 90 ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED; 91 92 const_cast<int&>(ANativeWindow::minSwapInterval) = 0; 93 const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; 94 95 mReqWidth = 0; 96 mReqHeight = 0; 97 mReqFormat = 0; 98 mReqUsage = 0; 99 mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; 100 mDataSpace = Dataspace::UNKNOWN; 101 mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 102 mTransform = 0; 103 mStickyTransform = 0; 104 mDefaultWidth = 0; 105 mDefaultHeight = 0; 106 mUserWidth = 0; 107 mUserHeight = 0; 108 mTransformHint = 0; 109 mConsumerRunningBehind = false; 110 mConnectedToCpu = false; 111 mProducerControlledByApp = controlledByApp; 112 mSwapIntervalZero = false; 113 mMaxBufferCount = NUM_BUFFER_SLOTS; 114 } 115 ~Surface()116 Surface::~Surface() { 117 if (mConnectedToCpu) { 118 Surface::disconnect(NATIVE_WINDOW_API_CPU); 119 } 120 } 121 composerService() const122 sp<ISurfaceComposer> Surface::composerService() const { 123 return ComposerService::getComposerService(); 124 } 125 now() const126 nsecs_t Surface::now() const { 127 return systemTime(); 128 } 129 getIGraphicBufferProducer() const130 sp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const { 131 return mGraphicBufferProducer; 132 } 133 setSidebandStream(const sp<NativeHandle> & stream)134 void Surface::setSidebandStream(const sp<NativeHandle>& stream) { 135 mGraphicBufferProducer->setSidebandStream(stream); 136 } 137 allocateBuffers()138 void Surface::allocateBuffers() { 139 uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth; 140 uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight; 141 mGraphicBufferProducer->allocateBuffers(reqWidth, reqHeight, 142 mReqFormat, mReqUsage); 143 } 144 setGenerationNumber(uint32_t generation)145 status_t Surface::setGenerationNumber(uint32_t generation) { 146 status_t result = mGraphicBufferProducer->setGenerationNumber(generation); 147 if (result == NO_ERROR) { 148 mGenerationNumber = generation; 149 } 150 return result; 151 } 152 getNextFrameNumber() const153 uint64_t Surface::getNextFrameNumber() const { 154 Mutex::Autolock lock(mMutex); 155 return mNextFrameNumber; 156 } 157 getConsumerName() const158 String8 Surface::getConsumerName() const { 159 return mGraphicBufferProducer->getConsumerName(); 160 } 161 setDequeueTimeout(nsecs_t timeout)162 status_t Surface::setDequeueTimeout(nsecs_t timeout) { 163 return mGraphicBufferProducer->setDequeueTimeout(timeout); 164 } 165 getLastQueuedBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence,float outTransformMatrix[16])166 status_t Surface::getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer, 167 sp<Fence>* outFence, float outTransformMatrix[16]) { 168 return mGraphicBufferProducer->getLastQueuedBuffer(outBuffer, outFence, 169 outTransformMatrix); 170 } 171 getDisplayRefreshCycleDuration(nsecs_t * outRefreshDuration)172 status_t Surface::getDisplayRefreshCycleDuration(nsecs_t* outRefreshDuration) { 173 ATRACE_CALL(); 174 175 DisplayStatInfo stats; 176 status_t result = composerService()->getDisplayStats(nullptr, &stats); 177 if (result != NO_ERROR) { 178 return result; 179 } 180 181 *outRefreshDuration = stats.vsyncPeriod; 182 183 return NO_ERROR; 184 } 185 enableFrameTimestamps(bool enable)186 void Surface::enableFrameTimestamps(bool enable) { 187 Mutex::Autolock lock(mMutex); 188 // If going from disabled to enabled, get the initial values for 189 // compositor and display timing. 190 if (!mEnableFrameTimestamps && enable) { 191 FrameEventHistoryDelta delta; 192 mGraphicBufferProducer->getFrameTimestamps(&delta); 193 mFrameEventHistory->applyDelta(delta); 194 } 195 mEnableFrameTimestamps = enable; 196 } 197 getCompositorTiming(nsecs_t * compositeDeadline,nsecs_t * compositeInterval,nsecs_t * compositeToPresentLatency)198 status_t Surface::getCompositorTiming( 199 nsecs_t* compositeDeadline, nsecs_t* compositeInterval, 200 nsecs_t* compositeToPresentLatency) { 201 Mutex::Autolock lock(mMutex); 202 if (!mEnableFrameTimestamps) { 203 return INVALID_OPERATION; 204 } 205 206 if (compositeDeadline != nullptr) { 207 *compositeDeadline = 208 mFrameEventHistory->getNextCompositeDeadline(now()); 209 } 210 if (compositeInterval != nullptr) { 211 *compositeInterval = mFrameEventHistory->getCompositeInterval(); 212 } 213 if (compositeToPresentLatency != nullptr) { 214 *compositeToPresentLatency = 215 mFrameEventHistory->getCompositeToPresentLatency(); 216 } 217 return NO_ERROR; 218 } 219 checkConsumerForUpdates(const FrameEvents * e,const uint64_t lastFrameNumber,const nsecs_t * outLatchTime,const nsecs_t * outFirstRefreshStartTime,const nsecs_t * outLastRefreshStartTime,const nsecs_t * outGpuCompositionDoneTime,const nsecs_t * outDisplayPresentTime,const nsecs_t * outDequeueReadyTime,const nsecs_t * outReleaseTime)220 static bool checkConsumerForUpdates( 221 const FrameEvents* e, const uint64_t lastFrameNumber, 222 const nsecs_t* outLatchTime, 223 const nsecs_t* outFirstRefreshStartTime, 224 const nsecs_t* outLastRefreshStartTime, 225 const nsecs_t* outGpuCompositionDoneTime, 226 const nsecs_t* outDisplayPresentTime, 227 const nsecs_t* outDequeueReadyTime, 228 const nsecs_t* outReleaseTime) { 229 bool checkForLatch = (outLatchTime != nullptr) && !e->hasLatchInfo(); 230 bool checkForFirstRefreshStart = (outFirstRefreshStartTime != nullptr) && 231 !e->hasFirstRefreshStartInfo(); 232 bool checkForGpuCompositionDone = (outGpuCompositionDoneTime != nullptr) && 233 !e->hasGpuCompositionDoneInfo(); 234 bool checkForDisplayPresent = (outDisplayPresentTime != nullptr) && 235 !e->hasDisplayPresentInfo(); 236 237 // LastRefreshStart, DequeueReady, and Release are never available for the 238 // last frame. 239 bool checkForLastRefreshStart = (outLastRefreshStartTime != nullptr) && 240 !e->hasLastRefreshStartInfo() && 241 (e->frameNumber != lastFrameNumber); 242 bool checkForDequeueReady = (outDequeueReadyTime != nullptr) && 243 !e->hasDequeueReadyInfo() && (e->frameNumber != lastFrameNumber); 244 bool checkForRelease = (outReleaseTime != nullptr) && 245 !e->hasReleaseInfo() && (e->frameNumber != lastFrameNumber); 246 247 // RequestedPresent and Acquire info are always available producer-side. 248 return checkForLatch || checkForFirstRefreshStart || 249 checkForLastRefreshStart || checkForGpuCompositionDone || 250 checkForDisplayPresent || checkForDequeueReady || checkForRelease; 251 } 252 getFrameTimestamp(nsecs_t * dst,const nsecs_t & src)253 static void getFrameTimestamp(nsecs_t *dst, const nsecs_t& src) { 254 if (dst != nullptr) { 255 // We always get valid timestamps for these eventually. 256 *dst = (src == FrameEvents::TIMESTAMP_PENDING) ? 257 NATIVE_WINDOW_TIMESTAMP_PENDING : src; 258 } 259 } 260 getFrameTimestampFence(nsecs_t * dst,const std::shared_ptr<FenceTime> & src,bool fenceShouldBeKnown)261 static void getFrameTimestampFence(nsecs_t *dst, 262 const std::shared_ptr<FenceTime>& src, bool fenceShouldBeKnown) { 263 if (dst != nullptr) { 264 if (!fenceShouldBeKnown) { 265 *dst = NATIVE_WINDOW_TIMESTAMP_PENDING; 266 return; 267 } 268 269 nsecs_t signalTime = src->getSignalTime(); 270 *dst = (signalTime == Fence::SIGNAL_TIME_PENDING) ? 271 NATIVE_WINDOW_TIMESTAMP_PENDING : 272 (signalTime == Fence::SIGNAL_TIME_INVALID) ? 273 NATIVE_WINDOW_TIMESTAMP_INVALID : 274 signalTime; 275 } 276 } 277 getFrameTimestamps(uint64_t frameNumber,nsecs_t * outRequestedPresentTime,nsecs_t * outAcquireTime,nsecs_t * outLatchTime,nsecs_t * outFirstRefreshStartTime,nsecs_t * outLastRefreshStartTime,nsecs_t * outGpuCompositionDoneTime,nsecs_t * outDisplayPresentTime,nsecs_t * outDequeueReadyTime,nsecs_t * outReleaseTime)278 status_t Surface::getFrameTimestamps(uint64_t frameNumber, 279 nsecs_t* outRequestedPresentTime, nsecs_t* outAcquireTime, 280 nsecs_t* outLatchTime, nsecs_t* outFirstRefreshStartTime, 281 nsecs_t* outLastRefreshStartTime, nsecs_t* outGpuCompositionDoneTime, 282 nsecs_t* outDisplayPresentTime, nsecs_t* outDequeueReadyTime, 283 nsecs_t* outReleaseTime) { 284 ATRACE_CALL(); 285 286 Mutex::Autolock lock(mMutex); 287 288 if (!mEnableFrameTimestamps) { 289 return INVALID_OPERATION; 290 } 291 292 // Verify the requested timestamps are supported. 293 querySupportedTimestampsLocked(); 294 if (outDisplayPresentTime != nullptr && !mFrameTimestampsSupportsPresent) { 295 return BAD_VALUE; 296 } 297 298 FrameEvents* events = mFrameEventHistory->getFrame(frameNumber); 299 if (events == nullptr) { 300 // If the entry isn't available in the producer, it's definitely not 301 // available in the consumer. 302 return NAME_NOT_FOUND; 303 } 304 305 // Update our cache of events if the requested events are not available. 306 if (checkConsumerForUpdates(events, mLastFrameNumber, 307 outLatchTime, outFirstRefreshStartTime, outLastRefreshStartTime, 308 outGpuCompositionDoneTime, outDisplayPresentTime, 309 outDequeueReadyTime, outReleaseTime)) { 310 FrameEventHistoryDelta delta; 311 mGraphicBufferProducer->getFrameTimestamps(&delta); 312 mFrameEventHistory->applyDelta(delta); 313 events = mFrameEventHistory->getFrame(frameNumber); 314 } 315 316 if (events == nullptr) { 317 // The entry was available before the update, but was overwritten 318 // after the update. Make sure not to send the wrong frame's data. 319 return NAME_NOT_FOUND; 320 } 321 322 getFrameTimestamp(outRequestedPresentTime, events->requestedPresentTime); 323 getFrameTimestamp(outLatchTime, events->latchTime); 324 getFrameTimestamp(outFirstRefreshStartTime, events->firstRefreshStartTime); 325 getFrameTimestamp(outLastRefreshStartTime, events->lastRefreshStartTime); 326 getFrameTimestamp(outDequeueReadyTime, events->dequeueReadyTime); 327 328 getFrameTimestampFence(outAcquireTime, events->acquireFence, 329 events->hasAcquireInfo()); 330 getFrameTimestampFence(outGpuCompositionDoneTime, 331 events->gpuCompositionDoneFence, 332 events->hasGpuCompositionDoneInfo()); 333 getFrameTimestampFence(outDisplayPresentTime, events->displayPresentFence, 334 events->hasDisplayPresentInfo()); 335 getFrameTimestampFence(outReleaseTime, events->releaseFence, 336 events->hasReleaseInfo()); 337 338 return NO_ERROR; 339 } 340 getWideColorSupport(bool * supported)341 status_t Surface::getWideColorSupport(bool* supported) { 342 ATRACE_CALL(); 343 344 const sp<IBinder> display = composerService()->getInternalDisplayToken(); 345 if (display == nullptr) { 346 return NAME_NOT_FOUND; 347 } 348 349 *supported = false; 350 status_t error = composerService()->isWideColorDisplay(display, supported); 351 return error; 352 } 353 getHdrSupport(bool * supported)354 status_t Surface::getHdrSupport(bool* supported) { 355 ATRACE_CALL(); 356 357 const sp<IBinder> display = composerService()->getInternalDisplayToken(); 358 if (display == nullptr) { 359 return NAME_NOT_FOUND; 360 } 361 362 HdrCapabilities hdrCapabilities; 363 status_t err = 364 composerService()->getHdrCapabilities(display, &hdrCapabilities); 365 366 if (err) 367 return err; 368 369 *supported = !hdrCapabilities.getSupportedHdrTypes().empty(); 370 371 return NO_ERROR; 372 } 373 hook_setSwapInterval(ANativeWindow * window,int interval)374 int Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { 375 Surface* c = getSelf(window); 376 return c->setSwapInterval(interval); 377 } 378 hook_dequeueBuffer(ANativeWindow * window,ANativeWindowBuffer ** buffer,int * fenceFd)379 int Surface::hook_dequeueBuffer(ANativeWindow* window, 380 ANativeWindowBuffer** buffer, int* fenceFd) { 381 Surface* c = getSelf(window); 382 { 383 std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex); 384 if (c->mDequeueInterceptor != nullptr) { 385 auto interceptor = c->mDequeueInterceptor; 386 auto data = c->mDequeueInterceptorData; 387 return interceptor(window, Surface::dequeueBufferInternal, data, buffer, fenceFd); 388 } 389 } 390 return c->dequeueBuffer(buffer, fenceFd); 391 } 392 dequeueBufferInternal(ANativeWindow * window,ANativeWindowBuffer ** buffer,int * fenceFd)393 int Surface::dequeueBufferInternal(ANativeWindow* window, ANativeWindowBuffer** buffer, 394 int* fenceFd) { 395 Surface* c = getSelf(window); 396 return c->dequeueBuffer(buffer, fenceFd); 397 } 398 hook_cancelBuffer(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)399 int Surface::hook_cancelBuffer(ANativeWindow* window, 400 ANativeWindowBuffer* buffer, int fenceFd) { 401 Surface* c = getSelf(window); 402 { 403 std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex); 404 if (c->mCancelInterceptor != nullptr) { 405 auto interceptor = c->mCancelInterceptor; 406 auto data = c->mCancelInterceptorData; 407 return interceptor(window, Surface::cancelBufferInternal, data, buffer, fenceFd); 408 } 409 } 410 return c->cancelBuffer(buffer, fenceFd); 411 } 412 cancelBufferInternal(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)413 int Surface::cancelBufferInternal(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd) { 414 Surface* c = getSelf(window); 415 return c->cancelBuffer(buffer, fenceFd); 416 } 417 hook_queueBuffer(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)418 int Surface::hook_queueBuffer(ANativeWindow* window, 419 ANativeWindowBuffer* buffer, int fenceFd) { 420 Surface* c = getSelf(window); 421 { 422 std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex); 423 if (c->mQueueInterceptor != nullptr) { 424 auto interceptor = c->mQueueInterceptor; 425 auto data = c->mQueueInterceptorData; 426 return interceptor(window, Surface::queueBufferInternal, data, buffer, fenceFd); 427 } 428 } 429 return c->queueBuffer(buffer, fenceFd); 430 } 431 queueBufferInternal(ANativeWindow * window,ANativeWindowBuffer * buffer,int fenceFd)432 int Surface::queueBufferInternal(ANativeWindow* window, ANativeWindowBuffer* buffer, int fenceFd) { 433 Surface* c = getSelf(window); 434 return c->queueBuffer(buffer, fenceFd); 435 } 436 hook_dequeueBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer ** buffer)437 int Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, 438 ANativeWindowBuffer** buffer) { 439 Surface* c = getSelf(window); 440 ANativeWindowBuffer* buf; 441 int fenceFd = -1; 442 int result = c->dequeueBuffer(&buf, &fenceFd); 443 if (result != OK) { 444 return result; 445 } 446 sp<Fence> fence(new Fence(fenceFd)); 447 int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED"); 448 if (waitResult != OK) { 449 ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", 450 waitResult); 451 c->cancelBuffer(buf, -1); 452 return waitResult; 453 } 454 *buffer = buf; 455 return result; 456 } 457 hook_cancelBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)458 int Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window, 459 ANativeWindowBuffer* buffer) { 460 Surface* c = getSelf(window); 461 return c->cancelBuffer(buffer, -1); 462 } 463 hook_lockBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)464 int Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window, 465 ANativeWindowBuffer* buffer) { 466 Surface* c = getSelf(window); 467 return c->lockBuffer_DEPRECATED(buffer); 468 } 469 hook_queueBuffer_DEPRECATED(ANativeWindow * window,ANativeWindowBuffer * buffer)470 int Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window, 471 ANativeWindowBuffer* buffer) { 472 Surface* c = getSelf(window); 473 return c->queueBuffer(buffer, -1); 474 } 475 hook_perform(ANativeWindow * window,int operation,...)476 int Surface::hook_perform(ANativeWindow* window, int operation, ...) { 477 va_list args; 478 va_start(args, operation); 479 Surface* c = getSelf(window); 480 int result; 481 // Don't acquire shared ownership of the interceptor mutex if we're going to 482 // do interceptor registration, as otherwise we'll deadlock on acquiring 483 // exclusive ownership. 484 if (!isInterceptorRegistrationOp(operation)) { 485 std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex); 486 if (c->mPerformInterceptor != nullptr) { 487 result = c->mPerformInterceptor(window, Surface::performInternal, 488 c->mPerformInterceptorData, operation, args); 489 va_end(args); 490 return result; 491 } 492 } 493 result = c->perform(operation, args); 494 va_end(args); 495 return result; 496 } 497 performInternal(ANativeWindow * window,int operation,va_list args)498 int Surface::performInternal(ANativeWindow* window, int operation, va_list args) { 499 Surface* c = getSelf(window); 500 return c->perform(operation, args); 501 } 502 hook_query(const ANativeWindow * window,int what,int * value)503 int Surface::hook_query(const ANativeWindow* window, int what, int* value) { 504 const Surface* c = getSelf(window); 505 { 506 std::shared_lock<std::shared_mutex> lock(c->mInterceptorMutex); 507 if (c->mQueryInterceptor != nullptr) { 508 auto interceptor = c->mQueryInterceptor; 509 auto data = c->mQueryInterceptorData; 510 return interceptor(window, Surface::queryInternal, data, what, value); 511 } 512 } 513 return c->query(what, value); 514 } 515 queryInternal(const ANativeWindow * window,int what,int * value)516 int Surface::queryInternal(const ANativeWindow* window, int what, int* value) { 517 const Surface* c = getSelf(window); 518 return c->query(what, value); 519 } 520 setSwapInterval(int interval)521 int Surface::setSwapInterval(int interval) { 522 ATRACE_CALL(); 523 // EGL specification states: 524 // interval is silently clamped to minimum and maximum implementation 525 // dependent values before being stored. 526 527 if (interval < minSwapInterval) 528 interval = minSwapInterval; 529 530 if (interval > maxSwapInterval) 531 interval = maxSwapInterval; 532 533 const bool wasSwapIntervalZero = mSwapIntervalZero; 534 mSwapIntervalZero = (interval == 0); 535 536 if (mSwapIntervalZero != wasSwapIntervalZero) { 537 mGraphicBufferProducer->setAsyncMode(mSwapIntervalZero); 538 } 539 540 return NO_ERROR; 541 } 542 543 class FenceMonitor { 544 public: FenceMonitor(const char * name)545 explicit FenceMonitor(const char* name) : mName(name), mFencesQueued(0), mFencesSignaled(0) { 546 std::thread thread(&FenceMonitor::loop, this); 547 pthread_setname_np(thread.native_handle(), mName); 548 thread.detach(); 549 } 550 queueFence(const sp<Fence> & fence)551 void queueFence(const sp<Fence>& fence) { 552 char message[64]; 553 554 std::lock_guard<std::mutex> lock(mMutex); 555 if (fence->getSignalTime() != Fence::SIGNAL_TIME_PENDING) { 556 snprintf(message, sizeof(message), "%s fence %u has signaled", mName, mFencesQueued); 557 ATRACE_NAME(message); 558 // Need an increment on both to make the trace number correct. 559 mFencesQueued++; 560 mFencesSignaled++; 561 return; 562 } 563 snprintf(message, sizeof(message), "Trace %s fence %u", mName, mFencesQueued); 564 ATRACE_NAME(message); 565 566 mQueue.push_back(fence); 567 mCondition.notify_one(); 568 mFencesQueued++; 569 ATRACE_INT(mName, int32_t(mQueue.size())); 570 } 571 572 private: 573 #pragma clang diagnostic push 574 #pragma clang diagnostic ignored "-Wmissing-noreturn" loop()575 void loop() { 576 while (true) { 577 threadLoop(); 578 } 579 } 580 #pragma clang diagnostic pop 581 threadLoop()582 void threadLoop() { 583 sp<Fence> fence; 584 uint32_t fenceNum; 585 { 586 std::unique_lock<std::mutex> lock(mMutex); 587 while (mQueue.empty()) { 588 mCondition.wait(lock); 589 } 590 fence = mQueue[0]; 591 fenceNum = mFencesSignaled; 592 } 593 { 594 char message[64]; 595 snprintf(message, sizeof(message), "waiting for %s %u", mName, fenceNum); 596 ATRACE_NAME(message); 597 598 status_t result = fence->waitForever(message); 599 if (result != OK) { 600 ALOGE("Error waiting for fence: %d", result); 601 } 602 } 603 { 604 std::lock_guard<std::mutex> lock(mMutex); 605 mQueue.pop_front(); 606 mFencesSignaled++; 607 ATRACE_INT(mName, int32_t(mQueue.size())); 608 } 609 } 610 611 const char* mName; 612 uint32_t mFencesQueued; 613 uint32_t mFencesSignaled; 614 std::deque<sp<Fence>> mQueue; 615 std::condition_variable mCondition; 616 std::mutex mMutex; 617 }; 618 dequeueBuffer(android_native_buffer_t ** buffer,int * fenceFd)619 int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { 620 ATRACE_CALL(); 621 ALOGV("Surface::dequeueBuffer"); 622 623 uint32_t reqWidth; 624 uint32_t reqHeight; 625 PixelFormat reqFormat; 626 uint64_t reqUsage; 627 bool enableFrameTimestamps; 628 629 { 630 Mutex::Autolock lock(mMutex); 631 if (mReportRemovedBuffers) { 632 mRemovedBuffers.clear(); 633 } 634 635 reqWidth = mReqWidth ? mReqWidth : mUserWidth; 636 reqHeight = mReqHeight ? mReqHeight : mUserHeight; 637 638 reqFormat = mReqFormat; 639 reqUsage = mReqUsage; 640 641 enableFrameTimestamps = mEnableFrameTimestamps; 642 643 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot != 644 BufferItem::INVALID_BUFFER_SLOT) { 645 sp<GraphicBuffer>& gbuf(mSlots[mSharedBufferSlot].buffer); 646 if (gbuf != nullptr) { 647 *buffer = gbuf.get(); 648 *fenceFd = -1; 649 return OK; 650 } 651 } 652 } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffer 653 654 int buf = -1; 655 sp<Fence> fence; 656 nsecs_t startTime = systemTime(); 657 658 FrameEventHistoryDelta frameTimestamps; 659 status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, reqWidth, reqHeight, 660 reqFormat, reqUsage, &mBufferAge, 661 enableFrameTimestamps ? &frameTimestamps 662 : nullptr); 663 mLastDequeueDuration = systemTime() - startTime; 664 665 if (result < 0) { 666 ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer" 667 "(%d, %d, %d, %#" PRIx64 ") failed: %d", 668 reqWidth, reqHeight, reqFormat, reqUsage, result); 669 return result; 670 } 671 672 if (buf < 0 || buf >= NUM_BUFFER_SLOTS) { 673 ALOGE("dequeueBuffer: IGraphicBufferProducer returned invalid slot number %d", buf); 674 android_errorWriteLog(0x534e4554, "36991414"); // SafetyNet logging 675 return FAILED_TRANSACTION; 676 } 677 678 Mutex::Autolock lock(mMutex); 679 680 // Write this while holding the mutex 681 mLastDequeueStartTime = startTime; 682 683 sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); 684 685 // this should never happen 686 ALOGE_IF(fence == nullptr, "Surface::dequeueBuffer: received null Fence! buf=%d", buf); 687 688 if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) { 689 static FenceMonitor hwcReleaseThread("HWC release"); 690 hwcReleaseThread.queueFence(fence); 691 } 692 693 if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) { 694 freeAllBuffers(); 695 } 696 697 if (enableFrameTimestamps) { 698 mFrameEventHistory->applyDelta(frameTimestamps); 699 } 700 701 if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == nullptr) { 702 if (mReportRemovedBuffers && (gbuf != nullptr)) { 703 mRemovedBuffers.push_back(gbuf); 704 } 705 result = mGraphicBufferProducer->requestBuffer(buf, &gbuf); 706 if (result != NO_ERROR) { 707 ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result); 708 mGraphicBufferProducer->cancelBuffer(buf, fence); 709 return result; 710 } 711 } 712 713 if (fence->isValid()) { 714 *fenceFd = fence->dup(); 715 if (*fenceFd == -1) { 716 ALOGE("dequeueBuffer: error duping fence: %d", errno); 717 // dup() should never fail; something is badly wrong. Soldier on 718 // and hope for the best; the worst that should happen is some 719 // visible corruption that lasts until the next frame. 720 } 721 } else { 722 *fenceFd = -1; 723 } 724 725 *buffer = gbuf.get(); 726 727 if (mSharedBufferMode && mAutoRefresh) { 728 mSharedBufferSlot = buf; 729 mSharedBufferHasBeenQueued = false; 730 } else if (mSharedBufferSlot == buf) { 731 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 732 mSharedBufferHasBeenQueued = false; 733 } 734 735 mDequeuedSlots.insert(buf); 736 737 return OK; 738 } 739 cancelBuffer(android_native_buffer_t * buffer,int fenceFd)740 int Surface::cancelBuffer(android_native_buffer_t* buffer, 741 int fenceFd) { 742 ATRACE_CALL(); 743 ALOGV("Surface::cancelBuffer"); 744 Mutex::Autolock lock(mMutex); 745 int i = getSlotFromBufferLocked(buffer); 746 if (i < 0) { 747 if (fenceFd >= 0) { 748 close(fenceFd); 749 } 750 return i; 751 } 752 if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) { 753 if (fenceFd >= 0) { 754 close(fenceFd); 755 } 756 return OK; 757 } 758 sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 759 mGraphicBufferProducer->cancelBuffer(i, fence); 760 761 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) { 762 mSharedBufferHasBeenQueued = true; 763 } 764 765 mDequeuedSlots.erase(i); 766 767 return OK; 768 } 769 getSlotFromBufferLocked(android_native_buffer_t * buffer) const770 int Surface::getSlotFromBufferLocked( 771 android_native_buffer_t* buffer) const { 772 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 773 if (mSlots[i].buffer != nullptr && 774 mSlots[i].buffer->handle == buffer->handle) { 775 return i; 776 } 777 } 778 ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); 779 return BAD_VALUE; 780 } 781 lockBuffer_DEPRECATED(android_native_buffer_t * buffer)782 int Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__((unused))) { 783 ALOGV("Surface::lockBuffer"); 784 Mutex::Autolock lock(mMutex); 785 return OK; 786 } 787 queueBuffer(android_native_buffer_t * buffer,int fenceFd)788 int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { 789 ATRACE_CALL(); 790 ALOGV("Surface::queueBuffer"); 791 Mutex::Autolock lock(mMutex); 792 int64_t timestamp; 793 bool isAutoTimestamp = false; 794 795 if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 796 timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 797 isAutoTimestamp = true; 798 ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 799 timestamp / 1000000.0); 800 } else { 801 timestamp = mTimestamp; 802 } 803 int i = getSlotFromBufferLocked(buffer); 804 if (i < 0) { 805 if (fenceFd >= 0) { 806 close(fenceFd); 807 } 808 return i; 809 } 810 if (mSharedBufferSlot == i && mSharedBufferHasBeenQueued) { 811 if (fenceFd >= 0) { 812 close(fenceFd); 813 } 814 return OK; 815 } 816 817 818 // Make sure the crop rectangle is entirely inside the buffer. 819 Rect crop(Rect::EMPTY_RECT); 820 mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 821 822 sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 823 IGraphicBufferProducer::QueueBufferOutput output; 824 IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp, 825 static_cast<android_dataspace>(mDataSpace), crop, mScalingMode, 826 mTransform ^ mStickyTransform, fence, mStickyTransform, 827 mEnableFrameTimestamps); 828 829 // we should send HDR metadata as needed if this becomes a bottleneck 830 input.setHdrMetadata(mHdrMetadata); 831 832 if (mConnectedToCpu || mDirtyRegion.bounds() == Rect::INVALID_RECT) { 833 input.setSurfaceDamage(Region::INVALID_REGION); 834 } else { 835 // Here we do two things: 836 // 1) The surface damage was specified using the OpenGL ES convention of 837 // the origin being in the bottom-left corner. Here we flip to the 838 // convention that the rest of the system uses (top-left corner) by 839 // subtracting all top/bottom coordinates from the buffer height. 840 // 2) If the buffer is coming in rotated (for example, because the EGL 841 // implementation is reacting to the transform hint coming back from 842 // SurfaceFlinger), the surface damage needs to be rotated the 843 // opposite direction, since it was generated assuming an unrotated 844 // buffer (the app doesn't know that the EGL implementation is 845 // reacting to the transform hint behind its back). The 846 // transformations in the switch statement below apply those 847 // complementary rotations (e.g., if 90 degrees, rotate 270 degrees). 848 849 int width = buffer->width; 850 int height = buffer->height; 851 bool rotated90 = (mTransform ^ mStickyTransform) & 852 NATIVE_WINDOW_TRANSFORM_ROT_90; 853 if (rotated90) { 854 std::swap(width, height); 855 } 856 857 Region flippedRegion; 858 for (auto rect : mDirtyRegion) { 859 int left = rect.left; 860 int right = rect.right; 861 int top = height - rect.bottom; // Flip from OpenGL convention 862 int bottom = height - rect.top; // Flip from OpenGL convention 863 switch (mTransform ^ mStickyTransform) { 864 case NATIVE_WINDOW_TRANSFORM_ROT_90: { 865 // Rotate 270 degrees 866 Rect flippedRect{top, width - right, bottom, width - left}; 867 flippedRegion.orSelf(flippedRect); 868 break; 869 } 870 case NATIVE_WINDOW_TRANSFORM_ROT_180: { 871 // Rotate 180 degrees 872 Rect flippedRect{width - right, height - bottom, 873 width - left, height - top}; 874 flippedRegion.orSelf(flippedRect); 875 break; 876 } 877 case NATIVE_WINDOW_TRANSFORM_ROT_270: { 878 // Rotate 90 degrees 879 Rect flippedRect{height - bottom, left, 880 height - top, right}; 881 flippedRegion.orSelf(flippedRect); 882 break; 883 } 884 default: { 885 Rect flippedRect{left, top, right, bottom}; 886 flippedRegion.orSelf(flippedRect); 887 break; 888 } 889 } 890 } 891 892 input.setSurfaceDamage(flippedRegion); 893 } 894 895 nsecs_t now = systemTime(); 896 status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 897 mLastQueueDuration = systemTime() - now; 898 if (err != OK) { 899 ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 900 } 901 902 mDequeuedSlots.erase(i); 903 904 if (mEnableFrameTimestamps) { 905 mFrameEventHistory->applyDelta(output.frameTimestamps); 906 // Update timestamps with the local acquire fence. 907 // The consumer doesn't send it back to prevent us from having two 908 // file descriptors of the same fence. 909 mFrameEventHistory->updateAcquireFence(mNextFrameNumber, 910 std::make_shared<FenceTime>(fence)); 911 912 // Cache timestamps of signaled fences so we can close their file 913 // descriptors. 914 mFrameEventHistory->updateSignalTimes(); 915 } 916 917 mLastFrameNumber = mNextFrameNumber; 918 919 mDefaultWidth = output.width; 920 mDefaultHeight = output.height; 921 mNextFrameNumber = output.nextFrameNumber; 922 923 // Ignore transform hint if sticky transform is set or transform to display inverse flag is 924 // set. 925 if (mStickyTransform == 0 && !transformToDisplayInverse()) { 926 mTransformHint = output.transformHint; 927 } 928 929 mConsumerRunningBehind = (output.numPendingBuffers >= 2); 930 931 if (!mConnectedToCpu) { 932 // Clear surface damage back to full-buffer 933 mDirtyRegion = Region::INVALID_REGION; 934 } 935 936 if (mSharedBufferMode && mAutoRefresh && mSharedBufferSlot == i) { 937 mSharedBufferHasBeenQueued = true; 938 } 939 940 mQueueBufferCondition.broadcast(); 941 942 if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) { 943 static FenceMonitor gpuCompletionThread("GPU completion"); 944 gpuCompletionThread.queueFence(fence); 945 } 946 947 return err; 948 } 949 querySupportedTimestampsLocked() const950 void Surface::querySupportedTimestampsLocked() const { 951 // mMutex must be locked when calling this method. 952 953 if (mQueriedSupportedTimestamps) { 954 return; 955 } 956 mQueriedSupportedTimestamps = true; 957 958 std::vector<FrameEvent> supportedFrameTimestamps; 959 status_t err = composerService()->getSupportedFrameTimestamps( 960 &supportedFrameTimestamps); 961 962 if (err != NO_ERROR) { 963 return; 964 } 965 966 for (auto sft : supportedFrameTimestamps) { 967 if (sft == FrameEvent::DISPLAY_PRESENT) { 968 mFrameTimestampsSupportsPresent = true; 969 } 970 } 971 } 972 query(int what,int * value) const973 int Surface::query(int what, int* value) const { 974 ATRACE_CALL(); 975 ALOGV("Surface::query"); 976 { // scope for the lock 977 Mutex::Autolock lock(mMutex); 978 switch (what) { 979 case NATIVE_WINDOW_FORMAT: 980 if (mReqFormat) { 981 *value = static_cast<int>(mReqFormat); 982 return NO_ERROR; 983 } 984 break; 985 case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 986 if (composerService()->authenticateSurfaceTexture( 987 mGraphicBufferProducer)) { 988 *value = 1; 989 } else { 990 *value = 0; 991 } 992 return NO_ERROR; 993 } 994 case NATIVE_WINDOW_CONCRETE_TYPE: 995 *value = NATIVE_WINDOW_SURFACE; 996 return NO_ERROR; 997 case NATIVE_WINDOW_DEFAULT_WIDTH: 998 *value = static_cast<int>( 999 mUserWidth ? mUserWidth : mDefaultWidth); 1000 return NO_ERROR; 1001 case NATIVE_WINDOW_DEFAULT_HEIGHT: 1002 *value = static_cast<int>( 1003 mUserHeight ? mUserHeight : mDefaultHeight); 1004 return NO_ERROR; 1005 case NATIVE_WINDOW_TRANSFORM_HINT: 1006 *value = static_cast<int>(mTransformHint); 1007 return NO_ERROR; 1008 case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 1009 status_t err = NO_ERROR; 1010 if (!mConsumerRunningBehind) { 1011 *value = 0; 1012 } else { 1013 err = mGraphicBufferProducer->query(what, value); 1014 if (err == NO_ERROR) { 1015 mConsumerRunningBehind = *value; 1016 } 1017 } 1018 return err; 1019 } 1020 case NATIVE_WINDOW_BUFFER_AGE: { 1021 if (mBufferAge > INT32_MAX) { 1022 *value = 0; 1023 } else { 1024 *value = static_cast<int32_t>(mBufferAge); 1025 } 1026 return NO_ERROR; 1027 } 1028 case NATIVE_WINDOW_LAST_DEQUEUE_DURATION: { 1029 int64_t durationUs = mLastDequeueDuration / 1000; 1030 *value = durationUs > std::numeric_limits<int>::max() ? 1031 std::numeric_limits<int>::max() : 1032 static_cast<int>(durationUs); 1033 return NO_ERROR; 1034 } 1035 case NATIVE_WINDOW_LAST_QUEUE_DURATION: { 1036 int64_t durationUs = mLastQueueDuration / 1000; 1037 *value = durationUs > std::numeric_limits<int>::max() ? 1038 std::numeric_limits<int>::max() : 1039 static_cast<int>(durationUs); 1040 return NO_ERROR; 1041 } 1042 case NATIVE_WINDOW_FRAME_TIMESTAMPS_SUPPORTS_PRESENT: { 1043 querySupportedTimestampsLocked(); 1044 *value = mFrameTimestampsSupportsPresent ? 1 : 0; 1045 return NO_ERROR; 1046 } 1047 case NATIVE_WINDOW_IS_VALID: { 1048 *value = mGraphicBufferProducer != nullptr ? 1 : 0; 1049 return NO_ERROR; 1050 } 1051 case NATIVE_WINDOW_DATASPACE: { 1052 *value = static_cast<int>(mDataSpace); 1053 return NO_ERROR; 1054 } 1055 case NATIVE_WINDOW_MAX_BUFFER_COUNT: { 1056 *value = mMaxBufferCount; 1057 return NO_ERROR; 1058 } 1059 } 1060 } 1061 return mGraphicBufferProducer->query(what, value); 1062 } 1063 perform(int operation,va_list args)1064 int Surface::perform(int operation, va_list args) 1065 { 1066 int res = NO_ERROR; 1067 switch (operation) { 1068 case NATIVE_WINDOW_CONNECT: 1069 // deprecated. must return NO_ERROR. 1070 break; 1071 case NATIVE_WINDOW_DISCONNECT: 1072 // deprecated. must return NO_ERROR. 1073 break; 1074 case NATIVE_WINDOW_SET_USAGE: 1075 res = dispatchSetUsage(args); 1076 break; 1077 case NATIVE_WINDOW_SET_CROP: 1078 res = dispatchSetCrop(args); 1079 break; 1080 case NATIVE_WINDOW_SET_BUFFER_COUNT: 1081 res = dispatchSetBufferCount(args); 1082 break; 1083 case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 1084 res = dispatchSetBuffersGeometry(args); 1085 break; 1086 case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 1087 res = dispatchSetBuffersTransform(args); 1088 break; 1089 case NATIVE_WINDOW_SET_BUFFERS_STICKY_TRANSFORM: 1090 res = dispatchSetBuffersStickyTransform(args); 1091 break; 1092 case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 1093 res = dispatchSetBuffersTimestamp(args); 1094 break; 1095 case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 1096 res = dispatchSetBuffersDimensions(args); 1097 break; 1098 case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 1099 res = dispatchSetBuffersUserDimensions(args); 1100 break; 1101 case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 1102 res = dispatchSetBuffersFormat(args); 1103 break; 1104 case NATIVE_WINDOW_LOCK: 1105 res = dispatchLock(args); 1106 break; 1107 case NATIVE_WINDOW_UNLOCK_AND_POST: 1108 res = dispatchUnlockAndPost(args); 1109 break; 1110 case NATIVE_WINDOW_SET_SCALING_MODE: 1111 res = dispatchSetScalingMode(args); 1112 break; 1113 case NATIVE_WINDOW_API_CONNECT: 1114 res = dispatchConnect(args); 1115 break; 1116 case NATIVE_WINDOW_API_DISCONNECT: 1117 res = dispatchDisconnect(args); 1118 break; 1119 case NATIVE_WINDOW_SET_SIDEBAND_STREAM: 1120 res = dispatchSetSidebandStream(args); 1121 break; 1122 case NATIVE_WINDOW_SET_BUFFERS_DATASPACE: 1123 res = dispatchSetBuffersDataSpace(args); 1124 break; 1125 case NATIVE_WINDOW_SET_BUFFERS_SMPTE2086_METADATA: 1126 res = dispatchSetBuffersSmpte2086Metadata(args); 1127 break; 1128 case NATIVE_WINDOW_SET_BUFFERS_CTA861_3_METADATA: 1129 res = dispatchSetBuffersCta8613Metadata(args); 1130 break; 1131 case NATIVE_WINDOW_SET_BUFFERS_HDR10_PLUS_METADATA: 1132 res = dispatchSetBuffersHdr10PlusMetadata(args); 1133 break; 1134 case NATIVE_WINDOW_SET_SURFACE_DAMAGE: 1135 res = dispatchSetSurfaceDamage(args); 1136 break; 1137 case NATIVE_WINDOW_SET_SHARED_BUFFER_MODE: 1138 res = dispatchSetSharedBufferMode(args); 1139 break; 1140 case NATIVE_WINDOW_SET_AUTO_REFRESH: 1141 res = dispatchSetAutoRefresh(args); 1142 break; 1143 case NATIVE_WINDOW_GET_REFRESH_CYCLE_DURATION: 1144 res = dispatchGetDisplayRefreshCycleDuration(args); 1145 break; 1146 case NATIVE_WINDOW_GET_NEXT_FRAME_ID: 1147 res = dispatchGetNextFrameId(args); 1148 break; 1149 case NATIVE_WINDOW_ENABLE_FRAME_TIMESTAMPS: 1150 res = dispatchEnableFrameTimestamps(args); 1151 break; 1152 case NATIVE_WINDOW_GET_COMPOSITOR_TIMING: 1153 res = dispatchGetCompositorTiming(args); 1154 break; 1155 case NATIVE_WINDOW_GET_FRAME_TIMESTAMPS: 1156 res = dispatchGetFrameTimestamps(args); 1157 break; 1158 case NATIVE_WINDOW_GET_WIDE_COLOR_SUPPORT: 1159 res = dispatchGetWideColorSupport(args); 1160 break; 1161 case NATIVE_WINDOW_GET_HDR_SUPPORT: 1162 res = dispatchGetHdrSupport(args); 1163 break; 1164 case NATIVE_WINDOW_SET_USAGE64: 1165 res = dispatchSetUsage64(args); 1166 break; 1167 case NATIVE_WINDOW_GET_CONSUMER_USAGE64: 1168 res = dispatchGetConsumerUsage64(args); 1169 break; 1170 case NATIVE_WINDOW_SET_AUTO_PREROTATION: 1171 res = dispatchSetAutoPrerotation(args); 1172 break; 1173 case NATIVE_WINDOW_GET_LAST_DEQUEUE_START: 1174 res = dispatchGetLastDequeueStartTime(args); 1175 break; 1176 case NATIVE_WINDOW_SET_DEQUEUE_TIMEOUT: 1177 res = dispatchSetDequeueTimeout(args); 1178 break; 1179 case NATIVE_WINDOW_GET_LAST_DEQUEUE_DURATION: 1180 res = dispatchGetLastDequeueDuration(args); 1181 break; 1182 case NATIVE_WINDOW_GET_LAST_QUEUE_DURATION: 1183 res = dispatchGetLastQueueDuration(args); 1184 break; 1185 case NATIVE_WINDOW_SET_FRAME_RATE: 1186 res = dispatchSetFrameRate(args); 1187 break; 1188 case NATIVE_WINDOW_SET_CANCEL_INTERCEPTOR: 1189 res = dispatchAddCancelInterceptor(args); 1190 break; 1191 case NATIVE_WINDOW_SET_DEQUEUE_INTERCEPTOR: 1192 res = dispatchAddDequeueInterceptor(args); 1193 break; 1194 case NATIVE_WINDOW_SET_PERFORM_INTERCEPTOR: 1195 res = dispatchAddPerformInterceptor(args); 1196 break; 1197 case NATIVE_WINDOW_SET_QUEUE_INTERCEPTOR: 1198 res = dispatchAddQueueInterceptor(args); 1199 break; 1200 case NATIVE_WINDOW_SET_QUERY_INTERCEPTOR: 1201 res = dispatchAddQueryInterceptor(args); 1202 break; 1203 case NATIVE_WINDOW_ALLOCATE_BUFFERS: 1204 allocateBuffers(); 1205 res = NO_ERROR; 1206 break; 1207 case NATIVE_WINDOW_GET_LAST_QUEUED_BUFFER: 1208 res = dispatchGetLastQueuedBuffer(args); 1209 break; 1210 default: 1211 res = NAME_NOT_FOUND; 1212 break; 1213 } 1214 return res; 1215 } 1216 dispatchConnect(va_list args)1217 int Surface::dispatchConnect(va_list args) { 1218 int api = va_arg(args, int); 1219 return connect(api); 1220 } 1221 dispatchDisconnect(va_list args)1222 int Surface::dispatchDisconnect(va_list args) { 1223 int api = va_arg(args, int); 1224 return disconnect(api); 1225 } 1226 dispatchSetUsage(va_list args)1227 int Surface::dispatchSetUsage(va_list args) { 1228 uint64_t usage = va_arg(args, uint32_t); 1229 return setUsage(usage); 1230 } 1231 dispatchSetUsage64(va_list args)1232 int Surface::dispatchSetUsage64(va_list args) { 1233 uint64_t usage = va_arg(args, uint64_t); 1234 return setUsage(usage); 1235 } 1236 dispatchSetCrop(va_list args)1237 int Surface::dispatchSetCrop(va_list args) { 1238 android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 1239 return setCrop(reinterpret_cast<Rect const*>(rect)); 1240 } 1241 dispatchSetBufferCount(va_list args)1242 int Surface::dispatchSetBufferCount(va_list args) { 1243 size_t bufferCount = va_arg(args, size_t); 1244 return setBufferCount(static_cast<int32_t>(bufferCount)); 1245 } 1246 dispatchSetBuffersGeometry(va_list args)1247 int Surface::dispatchSetBuffersGeometry(va_list args) { 1248 uint32_t width = va_arg(args, uint32_t); 1249 uint32_t height = va_arg(args, uint32_t); 1250 PixelFormat format = va_arg(args, PixelFormat); 1251 int err = setBuffersDimensions(width, height); 1252 if (err != 0) { 1253 return err; 1254 } 1255 return setBuffersFormat(format); 1256 } 1257 dispatchSetBuffersDimensions(va_list args)1258 int Surface::dispatchSetBuffersDimensions(va_list args) { 1259 uint32_t width = va_arg(args, uint32_t); 1260 uint32_t height = va_arg(args, uint32_t); 1261 return setBuffersDimensions(width, height); 1262 } 1263 dispatchSetBuffersUserDimensions(va_list args)1264 int Surface::dispatchSetBuffersUserDimensions(va_list args) { 1265 uint32_t width = va_arg(args, uint32_t); 1266 uint32_t height = va_arg(args, uint32_t); 1267 return setBuffersUserDimensions(width, height); 1268 } 1269 dispatchSetBuffersFormat(va_list args)1270 int Surface::dispatchSetBuffersFormat(va_list args) { 1271 PixelFormat format = va_arg(args, PixelFormat); 1272 return setBuffersFormat(format); 1273 } 1274 dispatchSetScalingMode(va_list args)1275 int Surface::dispatchSetScalingMode(va_list args) { 1276 int mode = va_arg(args, int); 1277 return setScalingMode(mode); 1278 } 1279 dispatchSetBuffersTransform(va_list args)1280 int Surface::dispatchSetBuffersTransform(va_list args) { 1281 uint32_t transform = va_arg(args, uint32_t); 1282 return setBuffersTransform(transform); 1283 } 1284 dispatchSetBuffersStickyTransform(va_list args)1285 int Surface::dispatchSetBuffersStickyTransform(va_list args) { 1286 uint32_t transform = va_arg(args, uint32_t); 1287 return setBuffersStickyTransform(transform); 1288 } 1289 dispatchSetBuffersTimestamp(va_list args)1290 int Surface::dispatchSetBuffersTimestamp(va_list args) { 1291 int64_t timestamp = va_arg(args, int64_t); 1292 return setBuffersTimestamp(timestamp); 1293 } 1294 dispatchLock(va_list args)1295 int Surface::dispatchLock(va_list args) { 1296 ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 1297 ARect* inOutDirtyBounds = va_arg(args, ARect*); 1298 return lock(outBuffer, inOutDirtyBounds); 1299 } 1300 dispatchUnlockAndPost(va_list args)1301 int Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) { 1302 return unlockAndPost(); 1303 } 1304 dispatchSetSidebandStream(va_list args)1305 int Surface::dispatchSetSidebandStream(va_list args) { 1306 native_handle_t* sH = va_arg(args, native_handle_t*); 1307 sp<NativeHandle> sidebandHandle = NativeHandle::create(sH, false); 1308 setSidebandStream(sidebandHandle); 1309 return OK; 1310 } 1311 dispatchSetBuffersDataSpace(va_list args)1312 int Surface::dispatchSetBuffersDataSpace(va_list args) { 1313 Dataspace dataspace = static_cast<Dataspace>(va_arg(args, int)); 1314 return setBuffersDataSpace(dataspace); 1315 } 1316 dispatchSetBuffersSmpte2086Metadata(va_list args)1317 int Surface::dispatchSetBuffersSmpte2086Metadata(va_list args) { 1318 const android_smpte2086_metadata* metadata = 1319 va_arg(args, const android_smpte2086_metadata*); 1320 return setBuffersSmpte2086Metadata(metadata); 1321 } 1322 dispatchSetBuffersCta8613Metadata(va_list args)1323 int Surface::dispatchSetBuffersCta8613Metadata(va_list args) { 1324 const android_cta861_3_metadata* metadata = 1325 va_arg(args, const android_cta861_3_metadata*); 1326 return setBuffersCta8613Metadata(metadata); 1327 } 1328 dispatchSetBuffersHdr10PlusMetadata(va_list args)1329 int Surface::dispatchSetBuffersHdr10PlusMetadata(va_list args) { 1330 const size_t size = va_arg(args, size_t); 1331 const uint8_t* metadata = va_arg(args, const uint8_t*); 1332 return setBuffersHdr10PlusMetadata(size, metadata); 1333 } 1334 dispatchSetSurfaceDamage(va_list args)1335 int Surface::dispatchSetSurfaceDamage(va_list args) { 1336 android_native_rect_t* rects = va_arg(args, android_native_rect_t*); 1337 size_t numRects = va_arg(args, size_t); 1338 setSurfaceDamage(rects, numRects); 1339 return NO_ERROR; 1340 } 1341 dispatchSetSharedBufferMode(va_list args)1342 int Surface::dispatchSetSharedBufferMode(va_list args) { 1343 bool sharedBufferMode = va_arg(args, int); 1344 return setSharedBufferMode(sharedBufferMode); 1345 } 1346 dispatchSetAutoRefresh(va_list args)1347 int Surface::dispatchSetAutoRefresh(va_list args) { 1348 bool autoRefresh = va_arg(args, int); 1349 return setAutoRefresh(autoRefresh); 1350 } 1351 dispatchGetDisplayRefreshCycleDuration(va_list args)1352 int Surface::dispatchGetDisplayRefreshCycleDuration(va_list args) { 1353 nsecs_t* outRefreshDuration = va_arg(args, int64_t*); 1354 return getDisplayRefreshCycleDuration(outRefreshDuration); 1355 } 1356 dispatchGetNextFrameId(va_list args)1357 int Surface::dispatchGetNextFrameId(va_list args) { 1358 uint64_t* nextFrameId = va_arg(args, uint64_t*); 1359 *nextFrameId = getNextFrameNumber(); 1360 return NO_ERROR; 1361 } 1362 dispatchEnableFrameTimestamps(va_list args)1363 int Surface::dispatchEnableFrameTimestamps(va_list args) { 1364 bool enable = va_arg(args, int); 1365 enableFrameTimestamps(enable); 1366 return NO_ERROR; 1367 } 1368 dispatchGetCompositorTiming(va_list args)1369 int Surface::dispatchGetCompositorTiming(va_list args) { 1370 nsecs_t* compositeDeadline = va_arg(args, int64_t*); 1371 nsecs_t* compositeInterval = va_arg(args, int64_t*); 1372 nsecs_t* compositeToPresentLatency = va_arg(args, int64_t*); 1373 return getCompositorTiming(compositeDeadline, compositeInterval, 1374 compositeToPresentLatency); 1375 } 1376 dispatchGetFrameTimestamps(va_list args)1377 int Surface::dispatchGetFrameTimestamps(va_list args) { 1378 uint64_t frameId = va_arg(args, uint64_t); 1379 nsecs_t* outRequestedPresentTime = va_arg(args, int64_t*); 1380 nsecs_t* outAcquireTime = va_arg(args, int64_t*); 1381 nsecs_t* outLatchTime = va_arg(args, int64_t*); 1382 nsecs_t* outFirstRefreshStartTime = va_arg(args, int64_t*); 1383 nsecs_t* outLastRefreshStartTime = va_arg(args, int64_t*); 1384 nsecs_t* outGpuCompositionDoneTime = va_arg(args, int64_t*); 1385 nsecs_t* outDisplayPresentTime = va_arg(args, int64_t*); 1386 nsecs_t* outDequeueReadyTime = va_arg(args, int64_t*); 1387 nsecs_t* outReleaseTime = va_arg(args, int64_t*); 1388 return getFrameTimestamps(frameId, 1389 outRequestedPresentTime, outAcquireTime, outLatchTime, 1390 outFirstRefreshStartTime, outLastRefreshStartTime, 1391 outGpuCompositionDoneTime, outDisplayPresentTime, 1392 outDequeueReadyTime, outReleaseTime); 1393 } 1394 dispatchGetWideColorSupport(va_list args)1395 int Surface::dispatchGetWideColorSupport(va_list args) { 1396 bool* outSupport = va_arg(args, bool*); 1397 return getWideColorSupport(outSupport); 1398 } 1399 dispatchGetHdrSupport(va_list args)1400 int Surface::dispatchGetHdrSupport(va_list args) { 1401 bool* outSupport = va_arg(args, bool*); 1402 return getHdrSupport(outSupport); 1403 } 1404 dispatchGetConsumerUsage64(va_list args)1405 int Surface::dispatchGetConsumerUsage64(va_list args) { 1406 uint64_t* usage = va_arg(args, uint64_t*); 1407 return getConsumerUsage(usage); 1408 } 1409 dispatchSetAutoPrerotation(va_list args)1410 int Surface::dispatchSetAutoPrerotation(va_list args) { 1411 bool autoPrerotation = va_arg(args, int); 1412 return setAutoPrerotation(autoPrerotation); 1413 } 1414 dispatchGetLastDequeueStartTime(va_list args)1415 int Surface::dispatchGetLastDequeueStartTime(va_list args) { 1416 int64_t* lastDequeueStartTime = va_arg(args, int64_t*); 1417 *lastDequeueStartTime = mLastDequeueStartTime; 1418 return NO_ERROR; 1419 } 1420 dispatchSetDequeueTimeout(va_list args)1421 int Surface::dispatchSetDequeueTimeout(va_list args) { 1422 nsecs_t timeout = va_arg(args, int64_t); 1423 return setDequeueTimeout(timeout); 1424 } 1425 dispatchGetLastDequeueDuration(va_list args)1426 int Surface::dispatchGetLastDequeueDuration(va_list args) { 1427 int64_t* lastDequeueDuration = va_arg(args, int64_t*); 1428 *lastDequeueDuration = mLastDequeueDuration; 1429 return NO_ERROR; 1430 } 1431 dispatchGetLastQueueDuration(va_list args)1432 int Surface::dispatchGetLastQueueDuration(va_list args) { 1433 int64_t* lastQueueDuration = va_arg(args, int64_t*); 1434 *lastQueueDuration = mLastQueueDuration; 1435 return NO_ERROR; 1436 } 1437 dispatchSetFrameRate(va_list args)1438 int Surface::dispatchSetFrameRate(va_list args) { 1439 float frameRate = static_cast<float>(va_arg(args, double)); 1440 int8_t compatibility = static_cast<int8_t>(va_arg(args, int)); 1441 return setFrameRate(frameRate, compatibility); 1442 } 1443 dispatchAddCancelInterceptor(va_list args)1444 int Surface::dispatchAddCancelInterceptor(va_list args) { 1445 ANativeWindow_cancelBufferInterceptor interceptor = 1446 va_arg(args, ANativeWindow_cancelBufferInterceptor); 1447 void* data = va_arg(args, void*); 1448 std::lock_guard<std::shared_mutex> lock(mInterceptorMutex); 1449 mCancelInterceptor = interceptor; 1450 mCancelInterceptorData = data; 1451 return NO_ERROR; 1452 } 1453 dispatchAddDequeueInterceptor(va_list args)1454 int Surface::dispatchAddDequeueInterceptor(va_list args) { 1455 ANativeWindow_dequeueBufferInterceptor interceptor = 1456 va_arg(args, ANativeWindow_dequeueBufferInterceptor); 1457 void* data = va_arg(args, void*); 1458 std::lock_guard<std::shared_mutex> lock(mInterceptorMutex); 1459 mDequeueInterceptor = interceptor; 1460 mDequeueInterceptorData = data; 1461 return NO_ERROR; 1462 } 1463 dispatchAddPerformInterceptor(va_list args)1464 int Surface::dispatchAddPerformInterceptor(va_list args) { 1465 ANativeWindow_performInterceptor interceptor = va_arg(args, ANativeWindow_performInterceptor); 1466 void* data = va_arg(args, void*); 1467 std::lock_guard<std::shared_mutex> lock(mInterceptorMutex); 1468 mPerformInterceptor = interceptor; 1469 mPerformInterceptorData = data; 1470 return NO_ERROR; 1471 } 1472 dispatchAddQueueInterceptor(va_list args)1473 int Surface::dispatchAddQueueInterceptor(va_list args) { 1474 ANativeWindow_queueBufferInterceptor interceptor = 1475 va_arg(args, ANativeWindow_queueBufferInterceptor); 1476 void* data = va_arg(args, void*); 1477 std::lock_guard<std::shared_mutex> lock(mInterceptorMutex); 1478 mQueueInterceptor = interceptor; 1479 mQueueInterceptorData = data; 1480 return NO_ERROR; 1481 } 1482 dispatchAddQueryInterceptor(va_list args)1483 int Surface::dispatchAddQueryInterceptor(va_list args) { 1484 ANativeWindow_queryInterceptor interceptor = va_arg(args, ANativeWindow_queryInterceptor); 1485 void* data = va_arg(args, void*); 1486 std::lock_guard<std::shared_mutex> lock(mInterceptorMutex); 1487 mQueryInterceptor = interceptor; 1488 mQueryInterceptorData = data; 1489 return NO_ERROR; 1490 } 1491 dispatchGetLastQueuedBuffer(va_list args)1492 int Surface::dispatchGetLastQueuedBuffer(va_list args) { 1493 AHardwareBuffer** buffer = va_arg(args, AHardwareBuffer**); 1494 int* fence = va_arg(args, int*); 1495 float* matrix = va_arg(args, float*); 1496 sp<GraphicBuffer> graphicBuffer; 1497 sp<Fence> spFence; 1498 1499 int result = mGraphicBufferProducer->getLastQueuedBuffer(&graphicBuffer, &spFence, matrix); 1500 1501 if (graphicBuffer != nullptr) { 1502 *buffer = reinterpret_cast<AHardwareBuffer*>(graphicBuffer.get()); 1503 AHardwareBuffer_acquire(*buffer); 1504 } else { 1505 *buffer = nullptr; 1506 } 1507 1508 if (spFence != nullptr) { 1509 *fence = spFence->dup(); 1510 } else { 1511 *fence = -1; 1512 } 1513 return result; 1514 } 1515 transformToDisplayInverse()1516 bool Surface::transformToDisplayInverse() { 1517 return (mTransform & NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY) == 1518 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY; 1519 } 1520 connect(int api)1521 int Surface::connect(int api) { 1522 static sp<IProducerListener> listener = new DummyProducerListener(); 1523 return connect(api, listener); 1524 } 1525 connect(int api,const sp<IProducerListener> & listener)1526 int Surface::connect(int api, const sp<IProducerListener>& listener) { 1527 return connect(api, listener, false); 1528 } 1529 connect(int api,bool reportBufferRemoval,const sp<SurfaceListener> & sListener)1530 int Surface::connect( 1531 int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) { 1532 if (sListener != nullptr) { 1533 mListenerProxy = new ProducerListenerProxy(this, sListener); 1534 } 1535 return connect(api, mListenerProxy, reportBufferRemoval); 1536 } 1537 connect(int api,const sp<IProducerListener> & listener,bool reportBufferRemoval)1538 int Surface::connect( 1539 int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) { 1540 ATRACE_CALL(); 1541 ALOGV("Surface::connect"); 1542 Mutex::Autolock lock(mMutex); 1543 IGraphicBufferProducer::QueueBufferOutput output; 1544 mReportRemovedBuffers = reportBufferRemoval; 1545 int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output); 1546 if (err == NO_ERROR) { 1547 mDefaultWidth = output.width; 1548 mDefaultHeight = output.height; 1549 mNextFrameNumber = output.nextFrameNumber; 1550 mMaxBufferCount = output.maxBufferCount; 1551 1552 // Ignore transform hint if sticky transform is set or transform to display inverse flag is 1553 // set. Transform hint should be ignored if the client is expected to always submit buffers 1554 // in the same orientation. 1555 if (mStickyTransform == 0 && !transformToDisplayInverse()) { 1556 mTransformHint = output.transformHint; 1557 } 1558 1559 mConsumerRunningBehind = (output.numPendingBuffers >= 2); 1560 } 1561 if (!err && api == NATIVE_WINDOW_API_CPU) { 1562 mConnectedToCpu = true; 1563 // Clear the dirty region in case we're switching from a non-CPU API 1564 mDirtyRegion.clear(); 1565 } else if (!err) { 1566 // Initialize the dirty region for tracking surface damage 1567 mDirtyRegion = Region::INVALID_REGION; 1568 } 1569 1570 return err; 1571 } 1572 1573 disconnect(int api,IGraphicBufferProducer::DisconnectMode mode)1574 int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) { 1575 ATRACE_CALL(); 1576 ALOGV("Surface::disconnect"); 1577 Mutex::Autolock lock(mMutex); 1578 mRemovedBuffers.clear(); 1579 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1580 mSharedBufferHasBeenQueued = false; 1581 freeAllBuffers(); 1582 int err = mGraphicBufferProducer->disconnect(api, mode); 1583 if (!err) { 1584 mReqFormat = 0; 1585 mReqWidth = 0; 1586 mReqHeight = 0; 1587 mReqUsage = 0; 1588 mCrop.clear(); 1589 mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 1590 mTransform = 0; 1591 mStickyTransform = 0; 1592 mAutoPrerotation = false; 1593 mEnableFrameTimestamps = false; 1594 mMaxBufferCount = NUM_BUFFER_SLOTS; 1595 1596 if (api == NATIVE_WINDOW_API_CPU) { 1597 mConnectedToCpu = false; 1598 } 1599 } 1600 return err; 1601 } 1602 detachNextBuffer(sp<GraphicBuffer> * outBuffer,sp<Fence> * outFence)1603 int Surface::detachNextBuffer(sp<GraphicBuffer>* outBuffer, 1604 sp<Fence>* outFence) { 1605 ATRACE_CALL(); 1606 ALOGV("Surface::detachNextBuffer"); 1607 1608 if (outBuffer == nullptr || outFence == nullptr) { 1609 return BAD_VALUE; 1610 } 1611 1612 Mutex::Autolock lock(mMutex); 1613 if (mReportRemovedBuffers) { 1614 mRemovedBuffers.clear(); 1615 } 1616 1617 sp<GraphicBuffer> buffer(nullptr); 1618 sp<Fence> fence(nullptr); 1619 status_t result = mGraphicBufferProducer->detachNextBuffer( 1620 &buffer, &fence); 1621 if (result != NO_ERROR) { 1622 return result; 1623 } 1624 1625 *outBuffer = buffer; 1626 if (fence != nullptr && fence->isValid()) { 1627 *outFence = fence; 1628 } else { 1629 *outFence = Fence::NO_FENCE; 1630 } 1631 1632 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 1633 if (mSlots[i].buffer != nullptr && 1634 mSlots[i].buffer->getId() == buffer->getId()) { 1635 if (mReportRemovedBuffers) { 1636 mRemovedBuffers.push_back(mSlots[i].buffer); 1637 } 1638 mSlots[i].buffer = nullptr; 1639 } 1640 } 1641 1642 return NO_ERROR; 1643 } 1644 attachBuffer(ANativeWindowBuffer * buffer)1645 int Surface::attachBuffer(ANativeWindowBuffer* buffer) 1646 { 1647 ATRACE_CALL(); 1648 ALOGV("Surface::attachBuffer"); 1649 1650 Mutex::Autolock lock(mMutex); 1651 if (mReportRemovedBuffers) { 1652 mRemovedBuffers.clear(); 1653 } 1654 1655 sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer)); 1656 uint32_t priorGeneration = graphicBuffer->mGenerationNumber; 1657 graphicBuffer->mGenerationNumber = mGenerationNumber; 1658 int32_t attachedSlot = -1; 1659 status_t result = mGraphicBufferProducer->attachBuffer(&attachedSlot, graphicBuffer); 1660 if (result != NO_ERROR) { 1661 ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result); 1662 graphicBuffer->mGenerationNumber = priorGeneration; 1663 return result; 1664 } 1665 if (mReportRemovedBuffers && (mSlots[attachedSlot].buffer != nullptr)) { 1666 mRemovedBuffers.push_back(mSlots[attachedSlot].buffer); 1667 } 1668 mSlots[attachedSlot].buffer = graphicBuffer; 1669 mDequeuedSlots.insert(attachedSlot); 1670 1671 return NO_ERROR; 1672 } 1673 setUsage(uint64_t reqUsage)1674 int Surface::setUsage(uint64_t reqUsage) 1675 { 1676 ALOGV("Surface::setUsage"); 1677 Mutex::Autolock lock(mMutex); 1678 if (reqUsage != mReqUsage) { 1679 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1680 } 1681 mReqUsage = reqUsage; 1682 return OK; 1683 } 1684 setCrop(Rect const * rect)1685 int Surface::setCrop(Rect const* rect) 1686 { 1687 ATRACE_CALL(); 1688 1689 Rect realRect(Rect::EMPTY_RECT); 1690 if (rect == nullptr || rect->isEmpty()) { 1691 realRect.clear(); 1692 } else { 1693 realRect = *rect; 1694 } 1695 1696 ALOGV("Surface::setCrop rect=[%d %d %d %d]", 1697 realRect.left, realRect.top, realRect.right, realRect.bottom); 1698 1699 Mutex::Autolock lock(mMutex); 1700 mCrop = realRect; 1701 return NO_ERROR; 1702 } 1703 setBufferCount(int bufferCount)1704 int Surface::setBufferCount(int bufferCount) 1705 { 1706 ATRACE_CALL(); 1707 ALOGV("Surface::setBufferCount"); 1708 Mutex::Autolock lock(mMutex); 1709 1710 status_t err = NO_ERROR; 1711 if (bufferCount == 0) { 1712 err = mGraphicBufferProducer->setMaxDequeuedBufferCount(1); 1713 } else { 1714 int minUndequeuedBuffers = 0; 1715 err = mGraphicBufferProducer->query( 1716 NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBuffers); 1717 if (err == NO_ERROR) { 1718 err = mGraphicBufferProducer->setMaxDequeuedBufferCount( 1719 bufferCount - minUndequeuedBuffers); 1720 } 1721 } 1722 1723 ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 1724 bufferCount, strerror(-err)); 1725 1726 return err; 1727 } 1728 setMaxDequeuedBufferCount(int maxDequeuedBuffers)1729 int Surface::setMaxDequeuedBufferCount(int maxDequeuedBuffers) { 1730 ATRACE_CALL(); 1731 ALOGV("Surface::setMaxDequeuedBufferCount"); 1732 Mutex::Autolock lock(mMutex); 1733 1734 status_t err = mGraphicBufferProducer->setMaxDequeuedBufferCount( 1735 maxDequeuedBuffers); 1736 ALOGE_IF(err, "IGraphicBufferProducer::setMaxDequeuedBufferCount(%d) " 1737 "returned %s", maxDequeuedBuffers, strerror(-err)); 1738 1739 return err; 1740 } 1741 setAsyncMode(bool async)1742 int Surface::setAsyncMode(bool async) { 1743 ATRACE_CALL(); 1744 ALOGV("Surface::setAsyncMode"); 1745 Mutex::Autolock lock(mMutex); 1746 1747 status_t err = mGraphicBufferProducer->setAsyncMode(async); 1748 ALOGE_IF(err, "IGraphicBufferProducer::setAsyncMode(%d) returned %s", 1749 async, strerror(-err)); 1750 1751 return err; 1752 } 1753 setSharedBufferMode(bool sharedBufferMode)1754 int Surface::setSharedBufferMode(bool sharedBufferMode) { 1755 ATRACE_CALL(); 1756 ALOGV("Surface::setSharedBufferMode (%d)", sharedBufferMode); 1757 Mutex::Autolock lock(mMutex); 1758 1759 status_t err = mGraphicBufferProducer->setSharedBufferMode( 1760 sharedBufferMode); 1761 if (err == NO_ERROR) { 1762 mSharedBufferMode = sharedBufferMode; 1763 } 1764 ALOGE_IF(err, "IGraphicBufferProducer::setSharedBufferMode(%d) returned" 1765 "%s", sharedBufferMode, strerror(-err)); 1766 1767 return err; 1768 } 1769 setAutoRefresh(bool autoRefresh)1770 int Surface::setAutoRefresh(bool autoRefresh) { 1771 ATRACE_CALL(); 1772 ALOGV("Surface::setAutoRefresh (%d)", autoRefresh); 1773 Mutex::Autolock lock(mMutex); 1774 1775 status_t err = mGraphicBufferProducer->setAutoRefresh(autoRefresh); 1776 if (err == NO_ERROR) { 1777 mAutoRefresh = autoRefresh; 1778 } 1779 ALOGE_IF(err, "IGraphicBufferProducer::setAutoRefresh(%d) returned %s", 1780 autoRefresh, strerror(-err)); 1781 return err; 1782 } 1783 setBuffersDimensions(uint32_t width,uint32_t height)1784 int Surface::setBuffersDimensions(uint32_t width, uint32_t height) 1785 { 1786 ATRACE_CALL(); 1787 ALOGV("Surface::setBuffersDimensions"); 1788 1789 if ((width && !height) || (!width && height)) 1790 return BAD_VALUE; 1791 1792 Mutex::Autolock lock(mMutex); 1793 if (width != mReqWidth || height != mReqHeight) { 1794 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1795 } 1796 mReqWidth = width; 1797 mReqHeight = height; 1798 return NO_ERROR; 1799 } 1800 setBuffersUserDimensions(uint32_t width,uint32_t height)1801 int Surface::setBuffersUserDimensions(uint32_t width, uint32_t height) 1802 { 1803 ATRACE_CALL(); 1804 ALOGV("Surface::setBuffersUserDimensions"); 1805 1806 if ((width && !height) || (!width && height)) 1807 return BAD_VALUE; 1808 1809 Mutex::Autolock lock(mMutex); 1810 if (width != mUserWidth || height != mUserHeight) { 1811 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1812 } 1813 mUserWidth = width; 1814 mUserHeight = height; 1815 return NO_ERROR; 1816 } 1817 setBuffersFormat(PixelFormat format)1818 int Surface::setBuffersFormat(PixelFormat format) 1819 { 1820 ALOGV("Surface::setBuffersFormat"); 1821 1822 Mutex::Autolock lock(mMutex); 1823 if (format != mReqFormat) { 1824 mSharedBufferSlot = BufferItem::INVALID_BUFFER_SLOT; 1825 } 1826 mReqFormat = format; 1827 return NO_ERROR; 1828 } 1829 setScalingMode(int mode)1830 int Surface::setScalingMode(int mode) 1831 { 1832 ATRACE_CALL(); 1833 ALOGV("Surface::setScalingMode(%d)", mode); 1834 1835 switch (mode) { 1836 case NATIVE_WINDOW_SCALING_MODE_FREEZE: 1837 case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 1838 case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 1839 case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP: 1840 break; 1841 default: 1842 ALOGE("unknown scaling mode: %d", mode); 1843 return BAD_VALUE; 1844 } 1845 1846 Mutex::Autolock lock(mMutex); 1847 mScalingMode = mode; 1848 return NO_ERROR; 1849 } 1850 setBuffersTransform(uint32_t transform)1851 int Surface::setBuffersTransform(uint32_t transform) 1852 { 1853 ATRACE_CALL(); 1854 ALOGV("Surface::setBuffersTransform"); 1855 Mutex::Autolock lock(mMutex); 1856 // Ensure NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY is sticky. If the client sets the flag, do not 1857 // override it until the surface is disconnected. This is a temporary workaround for camera 1858 // until they switch to using Buffer State Layers. Currently if client sets the buffer transform 1859 // it may be overriden by the buffer producer when the producer sets the buffer transform. 1860 if (transformToDisplayInverse()) { 1861 transform |= NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY; 1862 } 1863 mTransform = transform; 1864 return NO_ERROR; 1865 } 1866 setBuffersStickyTransform(uint32_t transform)1867 int Surface::setBuffersStickyTransform(uint32_t transform) 1868 { 1869 ATRACE_CALL(); 1870 ALOGV("Surface::setBuffersStickyTransform"); 1871 Mutex::Autolock lock(mMutex); 1872 mStickyTransform = transform; 1873 return NO_ERROR; 1874 } 1875 setBuffersTimestamp(int64_t timestamp)1876 int Surface::setBuffersTimestamp(int64_t timestamp) 1877 { 1878 ALOGV("Surface::setBuffersTimestamp"); 1879 Mutex::Autolock lock(mMutex); 1880 mTimestamp = timestamp; 1881 return NO_ERROR; 1882 } 1883 setBuffersDataSpace(Dataspace dataSpace)1884 int Surface::setBuffersDataSpace(Dataspace dataSpace) 1885 { 1886 ALOGV("Surface::setBuffersDataSpace"); 1887 Mutex::Autolock lock(mMutex); 1888 mDataSpace = dataSpace; 1889 return NO_ERROR; 1890 } 1891 setBuffersSmpte2086Metadata(const android_smpte2086_metadata * metadata)1892 int Surface::setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata) { 1893 ALOGV("Surface::setBuffersSmpte2086Metadata"); 1894 Mutex::Autolock lock(mMutex); 1895 if (metadata) { 1896 mHdrMetadata.smpte2086 = *metadata; 1897 mHdrMetadata.validTypes |= HdrMetadata::SMPTE2086; 1898 } else { 1899 mHdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086; 1900 } 1901 return NO_ERROR; 1902 } 1903 setBuffersCta8613Metadata(const android_cta861_3_metadata * metadata)1904 int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata) { 1905 ALOGV("Surface::setBuffersCta8613Metadata"); 1906 Mutex::Autolock lock(mMutex); 1907 if (metadata) { 1908 mHdrMetadata.cta8613 = *metadata; 1909 mHdrMetadata.validTypes |= HdrMetadata::CTA861_3; 1910 } else { 1911 mHdrMetadata.validTypes &= ~HdrMetadata::CTA861_3; 1912 } 1913 return NO_ERROR; 1914 } 1915 setBuffersHdr10PlusMetadata(const size_t size,const uint8_t * metadata)1916 int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) { 1917 ALOGV("Surface::setBuffersBlobMetadata"); 1918 Mutex::Autolock lock(mMutex); 1919 if (size > 0) { 1920 mHdrMetadata.hdr10plus.assign(metadata, metadata + size); 1921 mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS; 1922 } else { 1923 mHdrMetadata.validTypes &= ~HdrMetadata::HDR10PLUS; 1924 mHdrMetadata.hdr10plus.clear(); 1925 } 1926 return NO_ERROR; 1927 } 1928 getBuffersDataSpace()1929 Dataspace Surface::getBuffersDataSpace() { 1930 ALOGV("Surface::getBuffersDataSpace"); 1931 Mutex::Autolock lock(mMutex); 1932 return mDataSpace; 1933 } 1934 freeAllBuffers()1935 void Surface::freeAllBuffers() { 1936 if (!mDequeuedSlots.empty()) { 1937 ALOGE("%s: %zu buffers were freed while being dequeued!", 1938 __FUNCTION__, mDequeuedSlots.size()); 1939 } 1940 for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 1941 mSlots[i].buffer = nullptr; 1942 } 1943 } 1944 getAndFlushBuffersFromSlots(const std::vector<int32_t> & slots,std::vector<sp<GraphicBuffer>> * outBuffers)1945 status_t Surface::getAndFlushBuffersFromSlots(const std::vector<int32_t>& slots, 1946 std::vector<sp<GraphicBuffer>>* outBuffers) { 1947 ALOGV("Surface::getAndFlushBuffersFromSlots"); 1948 for (int32_t i : slots) { 1949 if (i < 0 || i >= NUM_BUFFER_SLOTS) { 1950 ALOGE("%s: Invalid slotIndex: %d", __FUNCTION__, i); 1951 return BAD_VALUE; 1952 } 1953 } 1954 1955 Mutex::Autolock lock(mMutex); 1956 for (int32_t i : slots) { 1957 if (mSlots[i].buffer == nullptr) { 1958 ALOGW("%s: Discarded slot %d doesn't contain buffer!", __FUNCTION__, i); 1959 continue; 1960 } 1961 // Don't flush currently dequeued buffers 1962 if (mDequeuedSlots.count(i) > 0) { 1963 continue; 1964 } 1965 outBuffers->push_back(mSlots[i].buffer); 1966 mSlots[i].buffer = nullptr; 1967 } 1968 return OK; 1969 } 1970 setSurfaceDamage(android_native_rect_t * rects,size_t numRects)1971 void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) { 1972 ATRACE_CALL(); 1973 ALOGV("Surface::setSurfaceDamage"); 1974 Mutex::Autolock lock(mMutex); 1975 1976 if (mConnectedToCpu || numRects == 0) { 1977 mDirtyRegion = Region::INVALID_REGION; 1978 return; 1979 } 1980 1981 mDirtyRegion.clear(); 1982 for (size_t r = 0; r < numRects; ++r) { 1983 // We intentionally flip top and bottom here, since because they're 1984 // specified with a bottom-left origin, top > bottom, which fails 1985 // validation in the Region class. We will fix this up when we flip to a 1986 // top-left origin in queueBuffer. 1987 Rect rect(rects[r].left, rects[r].bottom, rects[r].right, rects[r].top); 1988 mDirtyRegion.orSelf(rect); 1989 } 1990 } 1991 1992 // ---------------------------------------------------------------------- 1993 // the lock/unlock APIs must be used from the same thread 1994 copyBlt(const sp<GraphicBuffer> & dst,const sp<GraphicBuffer> & src,const Region & reg,int * dstFenceFd)1995 static status_t copyBlt( 1996 const sp<GraphicBuffer>& dst, 1997 const sp<GraphicBuffer>& src, 1998 const Region& reg, 1999 int *dstFenceFd) 2000 { 2001 if (dst->getId() == src->getId()) 2002 return OK; 2003 2004 // src and dst with, height and format must be identical. no verification 2005 // is done here. 2006 status_t err; 2007 uint8_t* src_bits = nullptr; 2008 err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), 2009 reinterpret_cast<void**>(&src_bits)); 2010 ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 2011 2012 uint8_t* dst_bits = nullptr; 2013 err = dst->lockAsync(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), 2014 reinterpret_cast<void**>(&dst_bits), *dstFenceFd); 2015 ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 2016 *dstFenceFd = -1; 2017 2018 Region::const_iterator head(reg.begin()); 2019 Region::const_iterator tail(reg.end()); 2020 if (head != tail && src_bits && dst_bits) { 2021 const size_t bpp = bytesPerPixel(src->format); 2022 const size_t dbpr = static_cast<uint32_t>(dst->stride) * bpp; 2023 const size_t sbpr = static_cast<uint32_t>(src->stride) * bpp; 2024 2025 while (head != tail) { 2026 const Rect& r(*head++); 2027 int32_t h = r.height(); 2028 if (h <= 0) continue; 2029 size_t size = static_cast<uint32_t>(r.width()) * bpp; 2030 uint8_t const * s = src_bits + 2031 static_cast<uint32_t>(r.left + src->stride * r.top) * bpp; 2032 uint8_t * d = dst_bits + 2033 static_cast<uint32_t>(r.left + dst->stride * r.top) * bpp; 2034 if (dbpr==sbpr && size==sbpr) { 2035 size *= static_cast<size_t>(h); 2036 h = 1; 2037 } 2038 do { 2039 memcpy(d, s, size); 2040 d += dbpr; 2041 s += sbpr; 2042 } while (--h > 0); 2043 } 2044 } 2045 2046 if (src_bits) 2047 src->unlock(); 2048 2049 if (dst_bits) 2050 dst->unlockAsync(dstFenceFd); 2051 2052 return err; 2053 } 2054 2055 // ---------------------------------------------------------------------------- 2056 lock(ANativeWindow_Buffer * outBuffer,ARect * inOutDirtyBounds)2057 status_t Surface::lock( 2058 ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 2059 { 2060 if (mLockedBuffer != nullptr) { 2061 ALOGE("Surface::lock failed, already locked"); 2062 return INVALID_OPERATION; 2063 } 2064 2065 if (!mConnectedToCpu) { 2066 int err = Surface::connect(NATIVE_WINDOW_API_CPU); 2067 if (err) { 2068 return err; 2069 } 2070 // we're intending to do software rendering from this point 2071 setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 2072 } 2073 2074 ANativeWindowBuffer* out; 2075 int fenceFd = -1; 2076 status_t err = dequeueBuffer(&out, &fenceFd); 2077 ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 2078 if (err == NO_ERROR) { 2079 sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 2080 const Rect bounds(backBuffer->width, backBuffer->height); 2081 2082 Region newDirtyRegion; 2083 if (inOutDirtyBounds) { 2084 newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 2085 newDirtyRegion.andSelf(bounds); 2086 } else { 2087 newDirtyRegion.set(bounds); 2088 } 2089 2090 // figure out if we can copy the frontbuffer back 2091 const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 2092 const bool canCopyBack = (frontBuffer != nullptr && 2093 backBuffer->width == frontBuffer->width && 2094 backBuffer->height == frontBuffer->height && 2095 backBuffer->format == frontBuffer->format); 2096 2097 if (canCopyBack) { 2098 // copy the area that is invalid and not repainted this round 2099 const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 2100 if (!copyback.isEmpty()) { 2101 copyBlt(backBuffer, frontBuffer, copyback, &fenceFd); 2102 } 2103 } else { 2104 // if we can't copy-back anything, modify the user's dirty 2105 // region to make sure they redraw the whole buffer 2106 newDirtyRegion.set(bounds); 2107 mDirtyRegion.clear(); 2108 Mutex::Autolock lock(mMutex); 2109 for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 2110 mSlots[i].dirtyRegion.clear(); 2111 } 2112 } 2113 2114 2115 { // scope for the lock 2116 Mutex::Autolock lock(mMutex); 2117 int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 2118 if (backBufferSlot >= 0) { 2119 Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 2120 mDirtyRegion.subtract(dirtyRegion); 2121 dirtyRegion = newDirtyRegion; 2122 } 2123 } 2124 2125 mDirtyRegion.orSelf(newDirtyRegion); 2126 if (inOutDirtyBounds) { 2127 *inOutDirtyBounds = newDirtyRegion.getBounds(); 2128 } 2129 2130 void* vaddr; 2131 status_t res = backBuffer->lockAsync( 2132 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 2133 newDirtyRegion.bounds(), &vaddr, fenceFd); 2134 2135 ALOGW_IF(res, "failed locking buffer (handle = %p)", 2136 backBuffer->handle); 2137 2138 if (res != 0) { 2139 err = INVALID_OPERATION; 2140 } else { 2141 mLockedBuffer = backBuffer; 2142 outBuffer->width = backBuffer->width; 2143 outBuffer->height = backBuffer->height; 2144 outBuffer->stride = backBuffer->stride; 2145 outBuffer->format = backBuffer->format; 2146 outBuffer->bits = vaddr; 2147 } 2148 } 2149 return err; 2150 } 2151 unlockAndPost()2152 status_t Surface::unlockAndPost() 2153 { 2154 if (mLockedBuffer == nullptr) { 2155 ALOGE("Surface::unlockAndPost failed, no locked buffer"); 2156 return INVALID_OPERATION; 2157 } 2158 2159 int fd = -1; 2160 status_t err = mLockedBuffer->unlockAsync(&fd); 2161 ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 2162 2163 err = queueBuffer(mLockedBuffer.get(), fd); 2164 ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)", 2165 mLockedBuffer->handle, strerror(-err)); 2166 2167 mPostedBuffer = mLockedBuffer; 2168 mLockedBuffer = nullptr; 2169 return err; 2170 } 2171 waitForNextFrame(uint64_t lastFrame,nsecs_t timeout)2172 bool Surface::waitForNextFrame(uint64_t lastFrame, nsecs_t timeout) { 2173 Mutex::Autolock lock(mMutex); 2174 if (mNextFrameNumber > lastFrame) { 2175 return true; 2176 } 2177 return mQueueBufferCondition.waitRelative(mMutex, timeout) == OK; 2178 } 2179 getUniqueId(uint64_t * outId) const2180 status_t Surface::getUniqueId(uint64_t* outId) const { 2181 Mutex::Autolock lock(mMutex); 2182 return mGraphicBufferProducer->getUniqueId(outId); 2183 } 2184 getConsumerUsage(uint64_t * outUsage) const2185 int Surface::getConsumerUsage(uint64_t* outUsage) const { 2186 Mutex::Autolock lock(mMutex); 2187 return mGraphicBufferProducer->getConsumerUsage(outUsage); 2188 } 2189 getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>> * out)2190 status_t Surface::getAndFlushRemovedBuffers(std::vector<sp<GraphicBuffer>>* out) { 2191 if (out == nullptr) { 2192 ALOGE("%s: out must not be null!", __FUNCTION__); 2193 return BAD_VALUE; 2194 } 2195 2196 Mutex::Autolock lock(mMutex); 2197 *out = mRemovedBuffers; 2198 mRemovedBuffers.clear(); 2199 return OK; 2200 } 2201 attachAndQueueBufferWithDataspace(Surface * surface,sp<GraphicBuffer> buffer,Dataspace dataspace)2202 status_t Surface::attachAndQueueBufferWithDataspace(Surface* surface, sp<GraphicBuffer> buffer, 2203 Dataspace dataspace) { 2204 if (buffer == nullptr) { 2205 return BAD_VALUE; 2206 } 2207 int err = static_cast<ANativeWindow*>(surface)->perform(surface, NATIVE_WINDOW_API_CONNECT, 2208 NATIVE_WINDOW_API_CPU); 2209 if (err != OK) { 2210 return err; 2211 } 2212 ui::Dataspace tmpDataspace = surface->getBuffersDataSpace(); 2213 err = surface->setBuffersDataSpace(dataspace); 2214 if (err != OK) { 2215 return err; 2216 } 2217 err = surface->attachBuffer(buffer->getNativeBuffer()); 2218 if (err != OK) { 2219 return err; 2220 } 2221 err = static_cast<ANativeWindow*>(surface)->queueBuffer(surface, buffer->getNativeBuffer(), -1); 2222 if (err != OK) { 2223 return err; 2224 } 2225 err = surface->setBuffersDataSpace(tmpDataspace); 2226 if (err != OK) { 2227 return err; 2228 } 2229 err = surface->disconnect(NATIVE_WINDOW_API_CPU); 2230 return err; 2231 } 2232 setAutoPrerotation(bool autoPrerotation)2233 int Surface::setAutoPrerotation(bool autoPrerotation) { 2234 ATRACE_CALL(); 2235 ALOGV("Surface::setAutoPrerotation (%d)", autoPrerotation); 2236 Mutex::Autolock lock(mMutex); 2237 2238 if (mAutoPrerotation == autoPrerotation) { 2239 return OK; 2240 } 2241 2242 status_t err = mGraphicBufferProducer->setAutoPrerotation(autoPrerotation); 2243 if (err == NO_ERROR) { 2244 mAutoPrerotation = autoPrerotation; 2245 } 2246 ALOGE_IF(err, "IGraphicBufferProducer::setAutoPrerotation(%d) returned %s", autoPrerotation, 2247 strerror(-err)); 2248 return err; 2249 } 2250 onBuffersDiscarded(const std::vector<int32_t> & slots)2251 void Surface::ProducerListenerProxy::onBuffersDiscarded(const std::vector<int32_t>& slots) { 2252 ATRACE_CALL(); 2253 sp<Surface> parent = mParent.promote(); 2254 if (parent == nullptr) { 2255 return; 2256 } 2257 2258 std::vector<sp<GraphicBuffer>> discardedBufs; 2259 status_t res = parent->getAndFlushBuffersFromSlots(slots, &discardedBufs); 2260 if (res != OK) { 2261 ALOGE("%s: Failed to get buffers from slots: %s(%d)", __FUNCTION__, 2262 strerror(-res), res); 2263 return; 2264 } 2265 2266 mSurfaceListener->onBuffersDiscarded(discardedBufs); 2267 } 2268 setFrameRate(float frameRate,int8_t compatibility)2269 status_t Surface::setFrameRate(float frameRate, int8_t compatibility) { 2270 ATRACE_CALL(); 2271 ALOGV("Surface::setFrameRate"); 2272 2273 if (!ValidateFrameRate(frameRate, compatibility, "Surface::setFrameRate")) { 2274 return BAD_VALUE; 2275 } 2276 2277 return composerService()->setFrameRate(mGraphicBufferProducer, frameRate, compatibility); 2278 } 2279 2280 }; // namespace android 2281