diff options
| author | Mathias Agopian <mathias@google.com> | 2010-10-04 20:21:14 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-04 20:21:14 -0700 |
| commit | ff04e97faf75c435e453d4c1caf7eeac8b9c1ceb (patch) | |
| tree | 089714d6c07e5ec9e3bbf3cf5478c1dd264d8bc1 /libs/surfaceflinger_client/Surface.cpp | |
| parent | 722665c5f76e81bed646490977ea30f38aaa00da (diff) | |
| parent | f461930872beb4362998642c115691bdd2e94617 (diff) | |
| download | frameworks_base-ff04e97faf75c435e453d4c1caf7eeac8b9c1ceb.zip frameworks_base-ff04e97faf75c435e453d4c1caf7eeac8b9c1ceb.tar.gz frameworks_base-ff04e97faf75c435e453d4c1caf7eeac8b9c1ceb.tar.bz2 | |
am f4619308: Merge "fix [2835280] Add support for cancelling buffers to ANativeWindow" into gingerbread
Merge commit 'f461930872beb4362998642c115691bdd2e94617' into gingerbread-plus-aosp
* commit 'f461930872beb4362998642c115691bdd2e94617':
fix [2835280] Add support for cancelling buffers to ANativeWindow
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(); |
