Surface.cpp revision 35ffa6a868f1aa650c90956a4129bb70f780fc99
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( 40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<IGraphicBufferProducer>& bufferProducer) 4135ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian : mGraphicBufferProducer(bufferProducer) 4262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{ 43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Initialize the ANativeWindow function pointers. 44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::setSwapInterval = hook_setSwapInterval; 45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer = hook_dequeueBuffer; 46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer = hook_cancelBuffer; 47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer = hook_queueBuffer; 48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::query = hook_query; 49e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::perform = hook_perform; 50e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 51e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED; 52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED; 53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED; 54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED; 55e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::minSwapInterval) = 0; 57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; 58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; 64e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultWidth = 0; 68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultHeight = 0; 69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = 0; 70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = 0; 71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransformHint = 0; 72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = false; 73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 74e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 7635ffa6a868f1aa650c90956a4129bb70f780fc99Mathias AgopianSurface::~Surface() { 7735ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian if (mConnectedToCpu) { 7835ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian Surface::disconnect(NATIVE_WINDOW_API_CPU); 7935ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian } 8062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 8162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const { 83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer; 84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 85e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 86e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { 87e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->setSwapInterval(interval); 89e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 90e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 91e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer(ANativeWindow* window, 92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer, int* fenceFd) { 93e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->dequeueBuffer(buffer, fenceFd); 95e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 97e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer(ANativeWindow* window, 98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 100e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, fenceFd); 101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer(ANativeWindow* window, 104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 105e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, fenceFd); 107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 108e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, 110e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer) { 111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buf; 113e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int result = c->dequeueBuffer(&buf, &fenceFd); 115e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(new Fence(fenceFd)); 116e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int waitResult = fence->waitForever(1000, "dequeueBuffer_DEPRECATED"); 117e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (waitResult != OK) { 118e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", 119e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian waitResult); 120e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian c->cancelBuffer(buf, -1); 121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return waitResult; 12262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian } 123e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = buf; 124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 12562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 12662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window, 128e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 129e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 130e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, -1); 131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 133e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window, 134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 135e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->lockBuffer_DEPRECATED(buffer); 137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 138e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 139e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window, 140e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 142e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, -1); 143e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_query(const ANativeWindow* window, 146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int what, int* value) { 147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Surface* c = getSelf(window); 148e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->query(what, value); 149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 150e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 151e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_perform(ANativeWindow* window, int operation, ...) { 152e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_list args; 153e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_start(args, operation); 154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->perform(operation, args); 156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 158e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setSwapInterval(int interval) { 159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 160e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // EGL specification states: 161e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // interval is silently clamped to minimum and maximum implementation 162e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dependent values before being stored. 163e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Although we don't have to, we apply the same logic here. 164e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval < minSwapInterval) 166e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = minSwapInterval; 167e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 168e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval > maxSwapInterval) 169e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = maxSwapInterval; 170e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 171e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t res = mGraphicBufferProducer->setSynchronousMode(interval ? true : false); 172e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 173e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return res; 174e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 175e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 176e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dequeueBuffer(android_native_buffer_t** buffer, 177e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int* fenceFd) { 178e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 179e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::dequeueBuffer"); 180e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 181e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int buf = -1; 182e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int reqW = mReqWidth ? mReqWidth : mUserWidth; 183e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int reqH = mReqHeight ? mReqHeight : mUserHeight; 184e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence; 185e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, fence, reqW, reqH, 186e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat, mReqUsage); 187e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result < 0) { 188e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer(%d, %d, %d, %d)" 189e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian "failed: %d", mReqWidth, mReqHeight, mReqFormat, mReqUsage, 190e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result); 191e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 19201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 193e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); 194e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) { 195e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 196e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 197e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 198e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) { 199e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result = mGraphicBufferProducer->requestBuffer(buf, &gbuf); 200e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result != NO_ERROR) { 201e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", 202e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result); 203e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 204e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 205e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 206e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 207e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (fence->isValid()) { 208e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = fence->dup(); 209e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (*fenceFd == -1) { 210e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer: error duping fence: %d", errno); 211e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dup() should never fail; something is badly wrong. Soldier on 212e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // and hope for the best; the worst that should happen is some 213e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // visible corruption that lasts until the next frame. 214e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 215e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 216e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = -1; 217e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 218e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 219e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = gbuf.get(); 220e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 22101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 22201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 223e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::cancelBuffer(android_native_buffer_t* buffer, 224e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd) { 225e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 226e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::cancelBuffer"); 227e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 228e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 229e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 230e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 231e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 232e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 233e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mGraphicBufferProducer->cancelBuffer(i, fence); 234e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 235e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 236e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 237e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::getSlotFromBufferLocked( 238e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_buffer_t* buffer) const { 239e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bool dumpedState = false; 240e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 241e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mSlots[i].buffer != NULL && 242e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer->handle == buffer->handle) { 243e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 244e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 24501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 246e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); 247e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 24801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 24901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 250e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer) { 251e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::lockBuffer"); 252e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 253e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 254e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 256e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { 257e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 258e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::queueBuffer"); 259e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 260e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp; 261e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 262e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 263e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 264e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp / 1000000.f); 265e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 266e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = mTimestamp; 267e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 268e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 269e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 270e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 271e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 272e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 273e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 274e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Make sure the crop rectangle is entirely inside the buffer. 275e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect crop; 276e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 277e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 278e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 279e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 280e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferInput input(timestamp, crop, mScalingMode, 281e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform, fence); 282e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 283e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 284e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 285bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 286e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 287e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 288e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 289e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 290e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 291e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 292e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 29301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 29462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 295e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::query(int what, int* value) const { 296e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 297e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::query"); 298e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 299e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 300e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (what) { 301e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_FORMAT: 302e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mReqFormat) { 303e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mReqFormat; 304e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 305e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 306e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 307e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 308e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<ISurfaceComposer> composer( 309e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ComposerService::getComposerService()); 310e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (composer->authenticateSurfaceTexture(mGraphicBufferProducer)) { 311e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 1; 312e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 313e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 314e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 315e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 316e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 317e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONCRETE_TYPE: 318e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = NATIVE_WINDOW_SURFACE; 319e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 320e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_WIDTH: 321e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserWidth ? mUserWidth : mDefaultWidth; 322e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 323e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_HEIGHT: 324e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserHeight ? mUserHeight : mDefaultHeight; 325e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 326e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_TRANSFORM_HINT: 327e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mTransformHint; 328e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 329e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 330e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = NO_ERROR; 331e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConsumerRunningBehind) { 332e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 333e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 334e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = mGraphicBufferProducer->query(what, value); 335e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 336e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = *value; 337e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 338e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 339e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 340e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 341e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 342bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 343e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer->query(what, value); 344bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg} 345bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 346e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::perform(int operation, va_list args) 347bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg{ 348e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int res = NO_ERROR; 349e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (operation) { 350e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONNECT: 351e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 352e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 353e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DISCONNECT: 354e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 355e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 356e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_USAGE: 357e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetUsage(args); 358e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 359e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_CROP: 360e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetCrop(args); 361e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 362e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFER_COUNT: 363e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBufferCount(args); 364e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 365e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 366e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersGeometry(args); 367e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 368e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 369e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTransform(args); 370e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 371e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 372e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTimestamp(args); 373e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 374e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 375e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersDimensions(args); 376e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 377e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 378e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersUserDimensions(args); 379e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 380e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 381e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersFormat(args); 382e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 383e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_LOCK: 384e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchLock(args); 385e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 386e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_UNLOCK_AND_POST: 387e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchUnlockAndPost(args); 388e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 389e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_SCALING_MODE: 390e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetScalingMode(args); 391e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 392e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_CONNECT: 393e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchConnect(args); 394e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 395e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_DISCONNECT: 396e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchDisconnect(args); 397e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 398e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 399e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = NAME_NOT_FOUND; 400e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 401e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 402e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return res; 40301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 40401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 405e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchConnect(va_list args) { 406e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 407e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return connect(api); 408e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 409e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 410e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchDisconnect(va_list args) { 411e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 412e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return disconnect(api); 413e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 414e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 415e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetUsage(va_list args) { 416e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int usage = va_arg(args, int); 417e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setUsage(usage); 418e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 419e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 420e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetCrop(va_list args) { 421e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 422e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setCrop(reinterpret_cast<Rect const*>(rect)); 423e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 424e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 425e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBufferCount(va_list args) { 426e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t bufferCount = va_arg(args, size_t); 427e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBufferCount(bufferCount); 428e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 429e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 430e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersGeometry(va_list args) { 431e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 432e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 433e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 434e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = setBuffersDimensions(w, h); 435e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != 0) { 436e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 437579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian } 438e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 439e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 440bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 441e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersDimensions(va_list args) { 442e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 443e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 444e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersDimensions(w, h); 445e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 446579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 447e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersUserDimensions(va_list args) { 448e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 449e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 450e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersUserDimensions(w, h); 451579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 452579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 453e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersFormat(va_list args) { 454e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 455e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 456e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 457aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 458e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetScalingMode(va_list args) { 459e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int m = va_arg(args, int); 460e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setScalingMode(m); 461e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 462e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 463e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTransform(va_list args) { 464e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int transform = va_arg(args, int); 465e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTransform(transform); 466e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 467e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 468e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTimestamp(va_list args) { 469e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp = va_arg(args, int64_t); 470e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTimestamp(timestamp); 471e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 472e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 473e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchLock(va_list args) { 474e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 475e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ARect* inOutDirtyBounds = va_arg(args, ARect*); 476e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return lock(outBuffer, inOutDirtyBounds); 477e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 478e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 479e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchUnlockAndPost(va_list args) { 480e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return unlockAndPost(); 481e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 482e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 483e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 484e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::connect(int api) { 485e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 486e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::connect"); 487e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 488e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 489e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = mGraphicBufferProducer->connect(api, &output); 490e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 491e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 492e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint, 493e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 494e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 495aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 496e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err && api == NATIVE_WINDOW_API_CPU) { 497e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = true; 498aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 499e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 500aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis} 501aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 502e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::disconnect(int api) { 503e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 504e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::disconnect"); 505e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 506e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 507e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = mGraphicBufferProducer->disconnect(api); 508e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err) { 509e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 510e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 511e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 512e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 513e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 514e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 515e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 516e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (api == NATIVE_WINDOW_API_CPU) { 517e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 518aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 519a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian } 520e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 521a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian} 522a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian 523e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setUsage(uint32_t reqUsage) 52401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{ 525e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setUsage"); 526e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 527e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = reqUsage; 528e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 529e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 530e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 531e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setCrop(Rect const* rect) 532e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 533e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 534a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 535e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect realRect; 536e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (rect == NULL || rect->isEmpty()) { 537e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.clear(); 538e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 539e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect = *rect; 540631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian } 541e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 542e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setCrop rect=[%d %d %d %d]", 543e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.left, realRect.top, realRect.right, realRect.bottom); 544e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 545e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 546e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop = realRect; 547e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 550e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBufferCount(int bufferCount) 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 552e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 553e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBufferCount"); 554e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 555e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 556e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->setBufferCount(bufferCount); 557e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 558e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bufferCount, strerror(-err)); 559e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 560e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 561e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 562e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 563e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 564e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 567e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersDimensions(int w, int h) 568e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 569e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 570e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersDimensions"); 571e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 572e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 573e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 574e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 575e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 576e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 577e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 578e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 579e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = w; 580e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = h; 581e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 584e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersUserDimensions(int w, int h) 585e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 586e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 587e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersUserDimensions"); 588e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 589e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 590e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 591e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 592e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 593e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 594e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 595e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 596e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = w; 597e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = h; 598e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 5991e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo} 6001e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo 601e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersFormat(int format) 602e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 603e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersFormat"); 604e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 605e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (format<0) 606e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 607e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 608e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 609e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = format; 610e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 611631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian} 612631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian 613e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setScalingMode(int mode) 614e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 615e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 616e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setScalingMode(%d)", mode); 617e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 618e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (mode) { 619e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_FREEZE: 620e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 621e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 622e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 623e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 624e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("unknown scaling mode: %d", mode); 625e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 626e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 628e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 629e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = mode; 630e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 631e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 632e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 633e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTransform(int transform) 634e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 635e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 636e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTransform"); 637e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 638e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = transform; 639e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 640e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 641e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 642e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTimestamp(int64_t timestamp) 643e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 644e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTimestamp"); 645e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 646e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = timestamp; 647e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 648e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 649e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 650e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid Surface::freeAllBuffers() { 651e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 652e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer = 0; 653391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis } 6541d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala} 6551d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 656e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------- 657e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// the lock/unlock APIs must be used from the same thread 658e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 659e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatic status_t copyBlt( 660e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& dst, 661e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& src, 662e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region& reg) 663e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 664e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // src and dst with, height and format must be identical. no verification 665e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // is done here. 666e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err; 667e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * src_bits = NULL; 668e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), (void**)&src_bits); 669e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 670e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 671e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t* dst_bits = NULL; 672e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), (void**)&dst_bits); 673e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 674e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 675e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator head(reg.begin()); 676e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator tail(reg.end()); 677e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (head != tail && src_bits && dst_bits) { 678e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t bpp = bytesPerPixel(src->format); 679e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t dbpr = dst->stride * bpp; 680e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t sbpr = src->stride * bpp; 681e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 682e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian while (head != tail) { 683e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect& r(*head++); 684e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ssize_t h = r.height(); 685e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (h <= 0) continue; 686e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t size = r.width() * bpp; 687e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 688e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 689e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dbpr==sbpr && size==sbpr) { 690e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size *= h; 691e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian h = 1; 692e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 693e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian do { 694e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian memcpy(d, s, size); 695e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian d += dbpr; 696e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian s += sbpr; 697e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } while (--h > 0); 698e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 699e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 700e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 701e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (src_bits) 702e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian src->unlock(); 703e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 704e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dst_bits) 705e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dst->unlock(); 706e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 707e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 708e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 709a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 710e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 71155fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian 712e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::lock( 713e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 714e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 715e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer != 0) { 716e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::lock failed, already locked"); 717e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 718076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 71987a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 720e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConnectedToCpu) { 721e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = Surface::connect(NATIVE_WINDOW_API_CPU); 722e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err) { 723e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 724e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 725e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // we're intending to do software rendering from this point 726e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 72787a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian } 72887a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 729e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* out; 730e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 731e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = dequeueBuffer(&out, &fenceFd); 732e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 733e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 734e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 735e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(new Fence(fenceFd)); 736e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 737e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = fence->waitForever(1000, "Surface::lock"); 738e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 739e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Fence::wait failed (%s)", strerror(-err)); 740e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian cancelBuffer(out, fenceFd); 741e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 742e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 743e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 744e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect bounds(backBuffer->width, backBuffer->height); 745e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 746e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region newDirtyRegion; 747e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 748e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 749e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.andSelf(bounds); 750e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 751e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 752e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 753e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 754e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // figure out if we can copy the frontbuffer back 755e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 756e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const bool canCopyBack = (frontBuffer != 0 && 757e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->width == frontBuffer->width && 758e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->height == frontBuffer->height && 759e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->format == frontBuffer->format); 760e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 761e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (canCopyBack) { 762e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // copy the area that is invalid and not repainted this round 763e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 764e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!copyback.isEmpty()) 765e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian copyBlt(backBuffer, frontBuffer, copyback); 766e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 767e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // if we can't copy-back anything, modify the user's dirty 768e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // region to make sure they redraw the whole buffer 769e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 770e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.clear(); 771e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 772e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 773e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].dirtyRegion.clear(); 774e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 775e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 776e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 777e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 778e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 779e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 780e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 781e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (backBufferSlot >= 0) { 782e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 783e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.subtract(dirtyRegion); 784e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dirtyRegion = newDirtyRegion; 785e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 786e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 787e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 788e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.orSelf(newDirtyRegion); 789e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 790e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *inOutDirtyBounds = newDirtyRegion.getBounds(); 791e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 792e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 793e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian void* vaddr; 794e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t res = backBuffer->lock( 795e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 796e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.bounds(), &vaddr); 797e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 798e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGW_IF(res, "failed locking buffer (handle = %p)", 799e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->handle); 800e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 801e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (res != 0) { 802e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = INVALID_OPERATION; 803e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 804e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = backBuffer; 805e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->width = backBuffer->width; 806e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->height = backBuffer->height; 807e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->stride = backBuffer->stride; 808e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->format = backBuffer->format; 809e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->bits = vaddr; 810e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 811e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return err; 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 814cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 815e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::unlockAndPost() 816e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 817e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer == 0) { 818e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::unlockAndPost failed, no locked buffer"); 819e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 820e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 821e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 822e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mLockedBuffer->unlock(); 823e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 824e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 825e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = queueBuffer(mLockedBuffer.get(), -1); 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