diff options
| author | 2011-05-02 19:51:12 -0700 | |
|---|---|---|
| committer | 2011-05-11 18:01:51 -0700 | |
| commit | 8072711307aa98ee5ee6f7369860ae38c3e19656 (patch) | |
| tree | 5c9e85291c9c76367fbfad2d7f3ef36b361d3d1f /libs/gui/SurfaceTextureClient.cpp | |
| parent | 7a5b22c4e33928f81c2e8a3d85050c35bd44b1e0 (diff) | |
Implement {Surface|SurfaceTextureClient}::setSwapInterval()
Change-Id: I8382e346ddaa2c4c8ff56ac3ffd7f0109572f188
Diffstat (limited to 'libs/gui/SurfaceTextureClient.cpp')
| -rw-r--r-- | libs/gui/SurfaceTextureClient.cpp | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp index f3ce44b530..6f103208fd 100644 --- a/libs/gui/SurfaceTextureClient.cpp +++ b/libs/gui/SurfaceTextureClient.cpp @@ -39,6 +39,9 @@ SurfaceTextureClient::SurfaceTextureClient( ANativeWindow::query = query; ANativeWindow::perform = perform; + const_cast<int&>(ANativeWindow::minSwapInterval) = 0; + const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; + // Get a reference to the allocator. mAllocator = mSurfaceTexture->getAllocator(); } @@ -90,22 +93,39 @@ int SurfaceTextureClient::perform(ANativeWindow* window, int operation, ...) { } int SurfaceTextureClient::setSwapInterval(int interval) { - return INVALID_OPERATION; + // EGL specification states: + // interval is silently clamped to minimum and maximum implementation + // dependent values before being stored. + // Although we don't have to, we apply the same logic here. + + if (interval < minSwapInterval) + interval = minSwapInterval; + + if (interval > maxSwapInterval) + interval = maxSwapInterval; + + status_t res = mSurfaceTexture->setSynchronousMode(interval ? true : false); + + return res; } int SurfaceTextureClient::dequeueBuffer(android_native_buffer_t** buffer) { LOGV("SurfaceTextureClient::dequeueBuffer"); Mutex::Autolock lock(mMutex); int buf = -1; - status_t err = mSurfaceTexture->dequeueBuffer(&buf, mReqWidth, mReqHeight, + status_t result = mSurfaceTexture->dequeueBuffer(&buf, mReqWidth, mReqHeight, mReqFormat, mReqUsage); - if (err < 0) { + if (result < 0) { LOGV("dequeueBuffer: ISurfaceTexture::dequeueBuffer(%d, %d, %d, %d)" - "failed: %d", err, mReqWidth, mReqHeight, mReqFormat, mReqUsage); - return err; + "failed: %d", result, mReqWidth, mReqHeight, mReqFormat, mReqUsage); + return result; } sp<GraphicBuffer>& gbuf(mSlots[buf]); - if (err == ISurfaceTexture::BUFFER_NEEDS_REALLOCATION || gbuf == 0) { + if (result & ISurfaceTexture::RELEASE_ALL_BUFFERS) { + freeAllBuffers(); + } + + if ((result & ISurfaceTexture::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) { gbuf = mSurfaceTexture->requestBuffer(buf); if (gbuf == 0) { LOGE("dequeueBuffer: ISurfaceTexture::requestBuffer failed"); |