diff options
| author | Mathias Agopian <mathias@google.com> | 2010-10-04 20:17:25 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-10-04 20:17:25 -0700 |
| commit | f461930872beb4362998642c115691bdd2e94617 (patch) | |
| tree | 21c69636fc1578484210f0e980828f4624e2ac16 /libs/surfaceflinger_client/Surface.cpp | |
| parent | ef11530874f86570aa04a10c16a416b274b3fdf5 (diff) | |
| parent | 8ddd2c72ee7dd6f45e5375a197774b8671b982b7 (diff) | |
| download | frameworks_base-f461930872beb4362998642c115691bdd2e94617.zip frameworks_base-f461930872beb4362998642c115691bdd2e94617.tar.gz frameworks_base-f461930872beb4362998642c115691bdd2e94617.tar.bz2 | |
Merge "fix [2835280] Add support for cancelling buffers to ANativeWindow" into gingerbread
Diffstat (limited to 'libs/surfaceflinger_client/Surface.cpp')
| -rw-r--r-- | libs/surfaceflinger_client/Surface.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp index 560ea67..d44aab9 100644 --- a/libs/surfaceflinger_client/Surface.cpp +++ b/libs/surfaceflinger_client/Surface.cpp @@ -409,6 +409,7 @@ void Surface::init() { ANativeWindow::setSwapInterval = setSwapInterval; ANativeWindow::dequeueBuffer = dequeueBuffer; + ANativeWindow::cancelBuffer = cancelBuffer; ANativeWindow::lockBuffer = lockBuffer; ANativeWindow::queueBuffer = queueBuffer; ANativeWindow::query = query; @@ -517,6 +518,12 @@ int Surface::dequeueBuffer(ANativeWindow* window, return self->dequeueBuffer(buffer); } +int Surface::cancelBuffer(ANativeWindow* window, + android_native_buffer_t* buffer) { + Surface* self = getSelf(window); + return self->cancelBuffer(buffer); +} + int Surface::lockBuffer(ANativeWindow* window, android_native_buffer_t* buffer) { Surface* self = getSelf(window); @@ -617,6 +624,33 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer) return err; } +int Surface::cancelBuffer(android_native_buffer_t* buffer) +{ + status_t err = validate(); + switch (err) { + case NO_ERROR: + // no error, common case + break; + case INVALID_OPERATION: + // legitimate errors here + return err; + default: + // other errors happen because the surface is now invalid, + // for instance because it has been destroyed. In this case, + // we just fail silently (canceling a buffer is not technically + // an error at this point) + return NO_ERROR; + } + + int32_t bufIdx = getBufferIndex(GraphicBuffer::getSelf(buffer)); + + err = mSharedBufferClient->cancel(bufIdx); + + LOGE_IF(err, "error canceling buffer %d (%s)", bufIdx, strerror(-err)); + return err; +} + + int Surface::lockBuffer(android_native_buffer_t* buffer) { status_t err = validate(); |
