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