From 8072711307aa98ee5ee6f7369860ae38c3e19656 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Mon, 2 May 2011 19:51:12 -0700 Subject: Implement {Surface|SurfaceTextureClient}::setSwapInterval() Change-Id: I8382e346ddaa2c4c8ff56ac3ffd7f0109572f188 --- libs/gui/SurfaceTextureClient.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'libs/gui/SurfaceTextureClient.cpp') 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(ANativeWindow::minSwapInterval) = 0; + const_cast(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& 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"); -- cgit v1.2.3-59-g8ed1b