Surface.cpp revision 8f3960179c56767e5077be8337792bd4e244b7d7
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; 757895e90e29d096be039202f2ff24fa8033b92477Eino-Ville Talvala mProducerControlledByApp = controlledByApp; 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; 2653c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden bool isAutoTimestamp = false; 266e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 2674b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 2683c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden isAutoTimestamp = true; 2694b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 2704b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden timestamp / 1000000.f); 271e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 272e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = mTimestamp; 273e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 274e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 275e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 276e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 277e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 278e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 279e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 280e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Make sure the crop rectangle is entirely inside the buffer. 281e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect crop; 282e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 283e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 284e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 285e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 2863c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp, 2873c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden crop, mScalingMode, mTransform, mSwapIntervalZero, fence); 288e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 289e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 290e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 291bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 292e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 293e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 294e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 295e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 296e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 297e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 298e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 29901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 30062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 301e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::query(int what, int* value) const { 302e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 303e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::query"); 304e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 305e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 306e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (what) { 307e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_FORMAT: 308e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mReqFormat) { 309e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mReqFormat; 310e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 311e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 312e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 313e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 314e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<ISurfaceComposer> composer( 315e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ComposerService::getComposerService()); 316e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (composer->authenticateSurfaceTexture(mGraphicBufferProducer)) { 317e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 1; 318e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 319e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 320e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 321e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 322e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 323e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONCRETE_TYPE: 324e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = NATIVE_WINDOW_SURFACE; 325e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 326e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_WIDTH: 327e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserWidth ? mUserWidth : mDefaultWidth; 328e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 329e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_HEIGHT: 330e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserHeight ? mUserHeight : mDefaultHeight; 331e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 332e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_TRANSFORM_HINT: 333e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mTransformHint; 334e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 335e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 336e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = NO_ERROR; 337e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConsumerRunningBehind) { 338e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 339e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 340e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = mGraphicBufferProducer->query(what, value); 341e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 342e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = *value; 343e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 344e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 345e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 346e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 347e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 348bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 349e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer->query(what, value); 350bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg} 351bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 352e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::perform(int operation, va_list args) 353bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg{ 354e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int res = NO_ERROR; 355e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (operation) { 356e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONNECT: 357e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 358e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 359e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DISCONNECT: 360e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 361e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 362e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_USAGE: 363e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetUsage(args); 364e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 365e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_CROP: 366e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetCrop(args); 367e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 368e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFER_COUNT: 369e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBufferCount(args); 370e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 371e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 372e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersGeometry(args); 373e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 374e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 375e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTransform(args); 376e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 377e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 378e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTimestamp(args); 379e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 380e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 381e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersDimensions(args); 382e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 383e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 384e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersUserDimensions(args); 385e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 386e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 387e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersFormat(args); 388e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 389e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_LOCK: 390e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchLock(args); 391e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 392e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_UNLOCK_AND_POST: 393e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchUnlockAndPost(args); 394e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 395e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_SCALING_MODE: 396e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetScalingMode(args); 397e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 398e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_CONNECT: 399e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchConnect(args); 400e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 401e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_DISCONNECT: 402e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchDisconnect(args); 403e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 404e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 405e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = NAME_NOT_FOUND; 406e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 407e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 408e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return res; 40901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 41001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 411e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchConnect(va_list args) { 412e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 413e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return connect(api); 414e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 415e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 416e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchDisconnect(va_list args) { 417e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 418e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return disconnect(api); 419e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 420e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 421e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetUsage(va_list args) { 422e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int usage = va_arg(args, int); 423e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setUsage(usage); 424e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 425e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 426e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetCrop(va_list args) { 427e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 428e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setCrop(reinterpret_cast<Rect const*>(rect)); 429e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 430e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 431e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBufferCount(va_list args) { 432e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t bufferCount = va_arg(args, size_t); 433e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBufferCount(bufferCount); 434e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 435e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 436e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersGeometry(va_list args) { 437e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 438e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 439e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 440e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = setBuffersDimensions(w, h); 441e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != 0) { 442e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 443579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian } 444e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 445e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 446bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 447e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersDimensions(va_list args) { 448e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 449e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 450e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersDimensions(w, h); 451e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 452579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 453e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersUserDimensions(va_list args) { 454e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 455e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 456e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersUserDimensions(w, h); 457579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 458579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 459e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersFormat(va_list args) { 460e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 461e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 462e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 463aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 464e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetScalingMode(va_list args) { 465e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int m = va_arg(args, int); 466e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setScalingMode(m); 467e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 468e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 469e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTransform(va_list args) { 470e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int transform = va_arg(args, int); 471e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTransform(transform); 472e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 473e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 474e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTimestamp(va_list args) { 475e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp = va_arg(args, int64_t); 476e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTimestamp(timestamp); 477e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 478e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 479e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchLock(va_list args) { 480e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 481e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ARect* inOutDirtyBounds = va_arg(args, ARect*); 482e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return lock(outBuffer, inOutDirtyBounds); 483e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 484e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 485e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchUnlockAndPost(va_list args) { 486e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return unlockAndPost(); 487e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 488e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 489e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 490e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::connect(int api) { 491e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 492e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::connect"); 493365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian static sp<BBinder> sLife = new BBinder(); 494e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 495e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 496365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian int err = mGraphicBufferProducer->connect(sLife, api, mProducerControlledByApp, &output); 497e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 498e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 499e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 500e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 501e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 502aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 503e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err && api == NATIVE_WINDOW_API_CPU) { 504e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = true; 505aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 506e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 507aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis} 508aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 509365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian 510e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::disconnect(int api) { 511e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 512e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::disconnect"); 513e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 514e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 515e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = mGraphicBufferProducer->disconnect(api); 516e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err) { 517e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 518e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 519e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 520e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 521e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 522e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 523e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 524e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (api == NATIVE_WINDOW_API_CPU) { 525e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 526aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 527a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian } 528e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 529a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian} 530a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian 531e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setUsage(uint32_t reqUsage) 53201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{ 533e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setUsage"); 534e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 535e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = reqUsage; 536e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 537e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 538e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 539e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setCrop(Rect const* rect) 540e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 541e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 542a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 543e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect realRect; 544e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (rect == NULL || rect->isEmpty()) { 545e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.clear(); 546e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 547e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect = *rect; 548631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian } 549e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 550e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setCrop rect=[%d %d %d %d]", 551e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.left, realRect.top, realRect.right, realRect.bottom); 552e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 553e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 554e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop = realRect; 555e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 558e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBufferCount(int bufferCount) 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 560e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 561e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBufferCount"); 562e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 563e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 564e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->setBufferCount(bufferCount); 565e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 566e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bufferCount, strerror(-err)); 567e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 568e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 569e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 570e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 571e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 572e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 575e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersDimensions(int w, int h) 576e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 577e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 578e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersDimensions"); 579e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 580e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 581e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 582e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 583e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 584e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 585e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 586e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 587e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = w; 588e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = h; 589e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 592e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersUserDimensions(int w, int h) 593e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 594e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 595e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersUserDimensions"); 596e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 597e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 598e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 599e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 600e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 601e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 602e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 603e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 604e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = w; 605e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = h; 606e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 6071e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo} 6081e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo 609e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersFormat(int format) 610e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 611e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersFormat"); 612e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 613e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (format<0) 614e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 615e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 616e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 617e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = format; 618e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 619631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian} 620631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian 621e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setScalingMode(int mode) 622e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 623e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 624e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setScalingMode(%d)", mode); 625e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 626e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (mode) { 627e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_FREEZE: 628e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 629e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 630e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 631e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 632e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("unknown scaling mode: %d", mode); 633e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 634e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 636e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 637e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = mode; 638e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 639e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 640e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 641e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTransform(int transform) 642e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 643e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 644e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTransform"); 645e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 646e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = transform; 647e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 648e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 649e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 650e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTimestamp(int64_t timestamp) 651e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 652e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTimestamp"); 653e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 654e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = timestamp; 655e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 656e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 657e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 658e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid Surface::freeAllBuffers() { 659e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 660e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer = 0; 661391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis } 6621d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala} 6631d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 664e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------- 665e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// the lock/unlock APIs must be used from the same thread 666e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 667e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatic status_t copyBlt( 668e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& dst, 669e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& src, 670e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region& reg) 671e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 672e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // src and dst with, height and format must be identical. no verification 673e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // is done here. 674e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err; 675e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * src_bits = NULL; 676e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), (void**)&src_bits); 677e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 678e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 679e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t* dst_bits = NULL; 680e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), (void**)&dst_bits); 681e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 682e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 683e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator head(reg.begin()); 684e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator tail(reg.end()); 685e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (head != tail && src_bits && dst_bits) { 686e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t bpp = bytesPerPixel(src->format); 687e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t dbpr = dst->stride * bpp; 688e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t sbpr = src->stride * bpp; 689e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 690e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian while (head != tail) { 691e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect& r(*head++); 692e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ssize_t h = r.height(); 693e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (h <= 0) continue; 694e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t size = r.width() * bpp; 695e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 696e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 697e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dbpr==sbpr && size==sbpr) { 698e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size *= h; 699e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian h = 1; 700e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 701e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian do { 702e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian memcpy(d, s, size); 703e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian d += dbpr; 704e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian s += sbpr; 705e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } while (--h > 0); 706e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 707e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 708e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 709e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (src_bits) 710e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian src->unlock(); 711e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 712e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dst_bits) 713e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dst->unlock(); 714e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 715e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 716e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 717a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 718e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 71955fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian 720e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::lock( 721e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 722e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 723e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer != 0) { 724e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::lock failed, already locked"); 725e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 726076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 72787a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 728e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConnectedToCpu) { 729e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = Surface::connect(NATIVE_WINDOW_API_CPU); 730e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err) { 731e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 732e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 733e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // we're intending to do software rendering from this point 734e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 73587a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian } 73687a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 737e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* out; 738e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 739e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = dequeueBuffer(&out, &fenceFd); 740e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 741e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 742e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 743e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect bounds(backBuffer->width, backBuffer->height); 744e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 745e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region newDirtyRegion; 746e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 747e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 748e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.andSelf(bounds); 749e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 750e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 751e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 752e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 753e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // figure out if we can copy the frontbuffer back 754e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 755e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const bool canCopyBack = (frontBuffer != 0 && 756e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->width == frontBuffer->width && 757e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->height == frontBuffer->height && 758e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->format == frontBuffer->format); 759e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 760e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (canCopyBack) { 761e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // copy the area that is invalid and not repainted this round 762e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 763e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!copyback.isEmpty()) 764e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian copyBlt(backBuffer, frontBuffer, copyback); 765e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 766e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // if we can't copy-back anything, modify the user's dirty 767e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // region to make sure they redraw the whole buffer 768e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 769e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.clear(); 770e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 771e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 772e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].dirtyRegion.clear(); 773e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 774e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 775e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 776e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 777e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 778e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 779e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 780e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (backBufferSlot >= 0) { 781e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 782e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.subtract(dirtyRegion); 783e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dirtyRegion = newDirtyRegion; 784e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 785e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 786e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 787e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.orSelf(newDirtyRegion); 788e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 789e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *inOutDirtyBounds = newDirtyRegion.getBounds(); 790e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 791e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 792e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian void* vaddr; 7938f3960179c56767e5077be8337792bd4e244b7d7Francis Hart status_t res = backBuffer->lockAsync( 794e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 7958f3960179c56767e5077be8337792bd4e244b7d7Francis Hart newDirtyRegion.bounds(), &vaddr, fenceFd); 796e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 797e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGW_IF(res, "failed locking buffer (handle = %p)", 798e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->handle); 799e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 800e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (res != 0) { 801e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = INVALID_OPERATION; 802e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 803e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = backBuffer; 804e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->width = backBuffer->width; 805e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->height = backBuffer->height; 806e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->stride = backBuffer->stride; 807e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->format = backBuffer->format; 808e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->bits = vaddr; 809e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 810e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 811076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return err; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 813cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 814e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::unlockAndPost() 815e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 816e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer == 0) { 817e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::unlockAndPost failed, no locked buffer"); 818e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 819e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 820e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 8218f3960179c56767e5077be8337792bd4e244b7d7Francis Hart int fd = -1; 8228f3960179c56767e5077be8337792bd4e244b7d7Francis Hart status_t err = mLockedBuffer->unlockAsync(&fd); 823e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 824e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 8258f3960179c56767e5077be8337792bd4e244b7d7Francis Hart err = queueBuffer(mLockedBuffer.get(), fd); 826e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)", 827e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer->handle, strerror(-err)); 828e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 829e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mPostedBuffer = mLockedBuffer; 830e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = 0; 831e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 835