Surface.cpp revision ba93b3f8e403636b614a4a379f9421bc70dca84f
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Copyright (C) 2010 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "Surface" 18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#define ATRACE_TAG ATRACE_TAG_GRAPHICS 19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian//#define LOG_NDEBUG 0 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21b0e76f456afaada43ddb0968bb37145219f90cd3Mathias Agopian#include <android/native_window.h> 22b0e76f456afaada43ddb0968bb37145219f90cd3Mathias Agopian 23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <binder/Parcel.h> 249cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Log.h> 26e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Trace.h> 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 28e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Fence.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 32e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/GLConsumer.h> 33e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <private/gui/ComposerService.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android { 3862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurface::Surface( 40595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian const sp<IGraphicBufferProducer>& bufferProducer, 41595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool controlledByApp) 4235ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian : mGraphicBufferProducer(bufferProducer) 4362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{ 44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Initialize the ANativeWindow function pointers. 45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::setSwapInterval = hook_setSwapInterval; 46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer = hook_dequeueBuffer; 47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer = hook_cancelBuffer; 48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer = hook_queueBuffer; 49e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::query = hook_query; 50e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::perform = hook_perform; 51e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED; 53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED; 54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED; 55e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED; 56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::minSwapInterval) = 0; 58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; 59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 64e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; 65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultWidth = 0; 69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultHeight = 0; 70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = 0; 71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = 0; 72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransformHint = 0; 73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = false; 74e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 75595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian mProducerControlledByApp = true; 767cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mSwapIntervalZero = false; 77e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 78e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 7935ffa6a868f1aa650c90956a4129bb70f780fc99Mathias AgopianSurface::~Surface() { 8035ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian if (mConnectedToCpu) { 8135ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian Surface::disconnect(NATIVE_WINDOW_API_CPU); 8235ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian } 8362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 8462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 85e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const { 86e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer; 87e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 89e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { 90e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 91e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->setSwapInterval(interval); 92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 93e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer(ANativeWindow* window, 95e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer, int* fenceFd) { 96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 97e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->dequeueBuffer(buffer, fenceFd); 98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 100e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer(ANativeWindow* window, 101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, fenceFd); 104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 105e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer(ANativeWindow* window, 107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 108e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, fenceFd); 110e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, 113e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer) { 114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 115e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buf; 116e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 117e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int result = c->dequeueBuffer(&buf, &fenceFd); 118e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(new Fence(fenceFd)); 119ea74d3b78d607cde17790a7bb83e6f68ffd34cfdMathias Agopian int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED"); 120e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (waitResult != OK) { 121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", 122e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian waitResult); 123e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian c->cancelBuffer(buf, -1); 124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return waitResult; 12562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian } 126e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = buf; 127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 12862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 12962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 130e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window, 131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 133e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, -1); 134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 135e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window, 137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 138e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 139e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->lockBuffer_DEPRECATED(buffer); 140e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 142e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window, 143e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, -1); 146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 148e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_query(const ANativeWindow* window, 149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int what, int* value) { 150e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Surface* c = getSelf(window); 151e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->query(what, value); 152e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 153e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_perform(ANativeWindow* window, int operation, ...) { 155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_list args; 156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_start(args, operation); 157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 158e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->perform(operation, args); 159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 160e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 161e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setSwapInterval(int interval) { 162e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 163e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // EGL specification states: 164e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // interval is silently clamped to minimum and maximum implementation 165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dependent values before being stored. 166e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 167e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval < minSwapInterval) 168e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = minSwapInterval; 169e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 170e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval > maxSwapInterval) 171e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = maxSwapInterval; 172e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 1737cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mSwapIntervalZero = (interval == 0); 174e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 1757cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian return NO_ERROR; 176e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 177e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 178ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopianint Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { 179e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 180e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::dequeueBuffer"); 181e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 182e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int buf = -1; 183e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int reqW = mReqWidth ? mReqWidth : mUserWidth; 184e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int reqH = mReqHeight ? mReqHeight : mUserHeight; 185e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence; 1867cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, mSwapIntervalZero, 1874c00cc11141da7d159eb2323b186ed344115c0f1Jesse Hall reqW, reqH, mReqFormat, mReqUsage); 188e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result < 0) { 189e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer(%d, %d, %d, %d)" 190e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian "failed: %d", mReqWidth, mReqHeight, mReqFormat, mReqUsage, 191e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result); 192e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 19301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 194e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); 195ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian 196ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian // this should never happen 197ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian ALOGE_IF(fence == NULL, "Surface::dequeueBuffer: received null Fence! buf=%d", buf); 198ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian 199e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) { 200e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 201e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 202e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 203e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) { 204e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result = mGraphicBufferProducer->requestBuffer(buf, &gbuf); 205e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result != NO_ERROR) { 206ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result); 207e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 208e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 209e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 210e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 211e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (fence->isValid()) { 212e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = fence->dup(); 213e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (*fenceFd == -1) { 214e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer: error duping fence: %d", errno); 215e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dup() should never fail; something is badly wrong. Soldier on 216e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // and hope for the best; the worst that should happen is some 217e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // visible corruption that lasts until the next frame. 218e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 219e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 220e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = -1; 221e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 222e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 223e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = gbuf.get(); 224e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 22501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 22601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 227e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::cancelBuffer(android_native_buffer_t* buffer, 228e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd) { 229e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 230e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::cancelBuffer"); 231e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 232e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 233e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 234e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 235e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 236e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 237e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mGraphicBufferProducer->cancelBuffer(i, fence); 238e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 239e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 240e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 241e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::getSlotFromBufferLocked( 242e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_buffer_t* buffer) const { 243e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bool dumpedState = false; 244e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 245e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mSlots[i].buffer != NULL && 246e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer->handle == buffer->handle) { 247e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 248e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 24901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 250e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); 251e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 25201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 25301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 254e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer) { 255e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::lockBuffer"); 256e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 257e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 258e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 260e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { 261e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 262e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::queueBuffer"); 263e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 264e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp; 265e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 266e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 267e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 268e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp / 1000000.f); 269e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 270e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = mTimestamp; 271e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 272e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 273e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 274e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 275e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 276e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 277e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 278e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Make sure the crop rectangle is entirely inside the buffer. 279e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect crop; 280e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 281e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 282e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 283e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 284e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferInput input(timestamp, crop, mScalingMode, 2857cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mTransform, mSwapIntervalZero, fence); 286e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 287e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 288e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 289bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 290e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 291e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 292e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 293e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 294e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 295e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 296e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 29701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 29862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 299e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::query(int what, int* value) const { 300e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 301e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::query"); 302e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 303e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 304e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (what) { 305e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_FORMAT: 306e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mReqFormat) { 307e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mReqFormat; 308e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 309e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 310e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 311e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 312e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<ISurfaceComposer> composer( 313e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ComposerService::getComposerService()); 314e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (composer->authenticateSurfaceTexture(mGraphicBufferProducer)) { 315e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 1; 316e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 317e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 318e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 319e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 320e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 321e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONCRETE_TYPE: 322e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = NATIVE_WINDOW_SURFACE; 323e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 324e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_WIDTH: 325e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserWidth ? mUserWidth : mDefaultWidth; 326e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 327e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_HEIGHT: 328e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserHeight ? mUserHeight : mDefaultHeight; 329e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 330e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_TRANSFORM_HINT: 331e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mTransformHint; 332e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 333e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 334e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = NO_ERROR; 335e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConsumerRunningBehind) { 336e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 337e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 338e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = mGraphicBufferProducer->query(what, value); 339e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 340e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = *value; 341e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 342e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 343e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 344e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 345e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 346bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 347e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer->query(what, value); 348bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg} 349bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 350e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::perform(int operation, va_list args) 351bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg{ 352e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int res = NO_ERROR; 353e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (operation) { 354e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONNECT: 355e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 356e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 357e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DISCONNECT: 358e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 359e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 360e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_USAGE: 361e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetUsage(args); 362e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 363e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_CROP: 364e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetCrop(args); 365e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 366e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFER_COUNT: 367e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBufferCount(args); 368e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 369e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 370e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersGeometry(args); 371e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 372e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 373e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTransform(args); 374e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 375e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 376e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTimestamp(args); 377e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 378e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 379e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersDimensions(args); 380e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 381e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 382e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersUserDimensions(args); 383e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 384e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 385e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersFormat(args); 386e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 387e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_LOCK: 388e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchLock(args); 389e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 390e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_UNLOCK_AND_POST: 391e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchUnlockAndPost(args); 392e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 393e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_SCALING_MODE: 394e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetScalingMode(args); 395e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 396e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_CONNECT: 397e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchConnect(args); 398e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 399e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_DISCONNECT: 400e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchDisconnect(args); 401e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 402e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 403e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = NAME_NOT_FOUND; 404e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 405e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 406e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return res; 40701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 40801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 409e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchConnect(va_list args) { 410e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 411e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return connect(api); 412e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 413e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 414e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchDisconnect(va_list args) { 415e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 416e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return disconnect(api); 417e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 418e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 419e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetUsage(va_list args) { 420e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int usage = va_arg(args, int); 421e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setUsage(usage); 422e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 423e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 424e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetCrop(va_list args) { 425e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 426e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setCrop(reinterpret_cast<Rect const*>(rect)); 427e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 428e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 429e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBufferCount(va_list args) { 430e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t bufferCount = va_arg(args, size_t); 431e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBufferCount(bufferCount); 432e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 433e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 434e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersGeometry(va_list args) { 435e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 436e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 437e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 438e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = setBuffersDimensions(w, h); 439e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != 0) { 440e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 441579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian } 442e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 443e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 444bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 445e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersDimensions(va_list args) { 446e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 447e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 448e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersDimensions(w, h); 449e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 450579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 451e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersUserDimensions(va_list args) { 452e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 453e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 454e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersUserDimensions(w, h); 455579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 456579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 457e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersFormat(va_list args) { 458e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 459e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 460e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 461aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 462e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetScalingMode(va_list args) { 463e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int m = va_arg(args, int); 464e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setScalingMode(m); 465e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 466e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 467e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTransform(va_list args) { 468e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int transform = va_arg(args, int); 469e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTransform(transform); 470e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 471e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 472e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTimestamp(va_list args) { 473e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp = va_arg(args, int64_t); 474e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTimestamp(timestamp); 475e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 476e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 477e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchLock(va_list args) { 478e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 479e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ARect* inOutDirtyBounds = va_arg(args, ARect*); 480e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return lock(outBuffer, inOutDirtyBounds); 481e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 482e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 483e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchUnlockAndPost(va_list args) { 484e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return unlockAndPost(); 485e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 486e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 487e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 488e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::connect(int api) { 489e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 490e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::connect"); 491e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 492e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 493595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian int err = mGraphicBufferProducer->connect(api, mProducerControlledByApp, &output); 494e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 495e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 496e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 497e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 498e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 499aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 500e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err && api == NATIVE_WINDOW_API_CPU) { 501e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = true; 502aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 503e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 504aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis} 505aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 506e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::disconnect(int api) { 507e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 508e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::disconnect"); 509e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 510e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 511e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = mGraphicBufferProducer->disconnect(api); 512e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err) { 513e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 514e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 515e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 516e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 517e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 518e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 519e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 520e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (api == NATIVE_WINDOW_API_CPU) { 521e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 522aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 523a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian } 524e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 525a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian} 526a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian 527e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setUsage(uint32_t reqUsage) 52801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{ 529e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setUsage"); 530e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 531e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = reqUsage; 532e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 533e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 534e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 535e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setCrop(Rect const* rect) 536e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 537e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 538a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 539e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect realRect; 540e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (rect == NULL || rect->isEmpty()) { 541e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.clear(); 542e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 543e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect = *rect; 544631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian } 545e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 546e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setCrop rect=[%d %d %d %d]", 547e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.left, realRect.top, realRect.right, realRect.bottom); 548e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 549e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 550e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop = realRect; 551e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 554e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBufferCount(int bufferCount) 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 556e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 557e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBufferCount"); 558e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 559e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 560e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->setBufferCount(bufferCount); 561e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 562e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bufferCount, strerror(-err)); 563e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 564e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 565e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 566e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 567e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 568e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 571e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersDimensions(int w, int h) 572e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 573e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 574e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersDimensions"); 575e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 576e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 577e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 578e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 579e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 580e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 581e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 582e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 583e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = w; 584e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = h; 585e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 588e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersUserDimensions(int w, int h) 589e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 590e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 591e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersUserDimensions"); 592e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 593e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 594e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 595e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 596e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 597e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 598e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 599e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 600e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = w; 601e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = h; 602e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 6031e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo} 6041e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo 605e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersFormat(int format) 606e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 607e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersFormat"); 608e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 609e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (format<0) 610e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 611e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 612e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 613e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = format; 614e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 615631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian} 616631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian 617e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setScalingMode(int mode) 618e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 619e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 620e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setScalingMode(%d)", mode); 621e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 622e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (mode) { 623e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_FREEZE: 624e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 625e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 626e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 627e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 628e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("unknown scaling mode: %d", mode); 629e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 630e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 632e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 633e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = mode; 634e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 635e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 636e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 637e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTransform(int transform) 638e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 639e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 640e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTransform"); 641e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 642e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = transform; 643e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 644e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 645e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 646e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTimestamp(int64_t timestamp) 647e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 648e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTimestamp"); 649e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 650e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = timestamp; 651e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 652e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 653e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 654e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid Surface::freeAllBuffers() { 655e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 656e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer = 0; 657391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis } 6581d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala} 6591d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 660e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------- 661e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// the lock/unlock APIs must be used from the same thread 662e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 663e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatic status_t copyBlt( 664e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& dst, 665e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& src, 666e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region& reg) 667e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 668e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // src and dst with, height and format must be identical. no verification 669e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // is done here. 670e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err; 671e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * src_bits = NULL; 672e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), (void**)&src_bits); 673e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 674e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 675e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t* dst_bits = NULL; 676e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), (void**)&dst_bits); 677e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 678e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 679e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator head(reg.begin()); 680e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator tail(reg.end()); 681e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (head != tail && src_bits && dst_bits) { 682e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t bpp = bytesPerPixel(src->format); 683e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t dbpr = dst->stride * bpp; 684e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t sbpr = src->stride * bpp; 685e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 686e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian while (head != tail) { 687e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect& r(*head++); 688e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ssize_t h = r.height(); 689e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (h <= 0) continue; 690e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t size = r.width() * bpp; 691e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 692e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 693e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dbpr==sbpr && size==sbpr) { 694e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size *= h; 695e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian h = 1; 696e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 697e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian do { 698e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian memcpy(d, s, size); 699e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian d += dbpr; 700e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian s += sbpr; 701e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } while (--h > 0); 702e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 703e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 704e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 705e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (src_bits) 706e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian src->unlock(); 707e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 708e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dst_bits) 709e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dst->unlock(); 710e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 711e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 712e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 713a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 714e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 71555fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian 716e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::lock( 717e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 718e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 719e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer != 0) { 720e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::lock failed, already locked"); 721e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 722076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 72387a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 724e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConnectedToCpu) { 725e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = Surface::connect(NATIVE_WINDOW_API_CPU); 726e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err) { 727e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 728e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 729e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // we're intending to do software rendering from this point 730e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 73187a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian } 73287a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 733e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* out; 734e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 735e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = dequeueBuffer(&out, &fenceFd); 736e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 737e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 738e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 739e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(new Fence(fenceFd)); 740e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 741ea74d3b78d607cde17790a7bb83e6f68ffd34cfdMathias Agopian err = fence->waitForever("Surface::lock"); 742e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 743e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Fence::wait failed (%s)", strerror(-err)); 744e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian cancelBuffer(out, fenceFd); 745e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 746e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 747e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 748e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect bounds(backBuffer->width, backBuffer->height); 749e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 750e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region newDirtyRegion; 751e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 752e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 753e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.andSelf(bounds); 754e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 755e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 756e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 757e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 758e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // figure out if we can copy the frontbuffer back 759e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 760e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const bool canCopyBack = (frontBuffer != 0 && 761e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->width == frontBuffer->width && 762e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->height == frontBuffer->height && 763e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->format == frontBuffer->format); 764e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 765e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (canCopyBack) { 766e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // copy the area that is invalid and not repainted this round 767e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 768e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!copyback.isEmpty()) 769e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian copyBlt(backBuffer, frontBuffer, copyback); 770e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 771e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // if we can't copy-back anything, modify the user's dirty 772e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // region to make sure they redraw the whole buffer 773e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 774e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.clear(); 775e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 776e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 777e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].dirtyRegion.clear(); 778e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 779e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 780e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 781e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 782e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 783e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 784e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 785e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (backBufferSlot >= 0) { 786e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 787e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.subtract(dirtyRegion); 788e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dirtyRegion = newDirtyRegion; 789e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 790e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 791e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 792e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.orSelf(newDirtyRegion); 793e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 794e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *inOutDirtyBounds = newDirtyRegion.getBounds(); 795e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 796e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 797e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian void* vaddr; 798e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t res = backBuffer->lock( 799e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 800e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.bounds(), &vaddr); 801e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 802e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGW_IF(res, "failed locking buffer (handle = %p)", 803e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->handle); 804e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 805e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (res != 0) { 806e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = INVALID_OPERATION; 807e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 808e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = backBuffer; 809e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->width = backBuffer->width; 810e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->height = backBuffer->height; 811e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->stride = backBuffer->stride; 812e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->format = backBuffer->format; 813e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->bits = vaddr; 814e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 815e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return err; 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 818cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 819e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::unlockAndPost() 820e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 821e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer == 0) { 822e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::unlockAndPost failed, no locked buffer"); 823e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 824e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 825e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 826e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mLockedBuffer->unlock(); 827e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 828e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 829e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = queueBuffer(mLockedBuffer.get(), -1); 830e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)", 831e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer->handle, strerror(-err)); 832e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 833e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mPostedBuffer = mLockedBuffer; 834e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = 0; 835e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 839