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> 277cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad#include <utils/NativeHandle.h> 28a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Fence.h> 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/GLConsumer.h> 35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h> 36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <private/gui/ComposerService.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android { 4062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurface::Surface( 42595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian const sp<IGraphicBufferProducer>& bufferProducer, 43595264f1af12e25dce57d7c5b1d52ed86ac0d0c9Mathias Agopian bool controlledByApp) 4435ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian : mGraphicBufferProducer(bufferProducer) 4562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{ 46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Initialize the ANativeWindow function pointers. 47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::setSwapInterval = hook_setSwapInterval; 48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer = hook_dequeueBuffer; 49e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer = hook_cancelBuffer; 50e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer = hook_queueBuffer; 51e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::query = hook_query; 52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::perform = hook_perform; 53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED; 55e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED; 56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED; 57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED; 58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::minSwapInterval) = 0; 60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const_cast<int&>(ANativeWindow::maxSwapInterval) = 1; 61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 64e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO; 67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 701681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk mStickyTransform = 0; 71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultWidth = 0; 72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDefaultHeight = 0; 73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = 0; 74e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = 0; 75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransformHint = 0; 76e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = false; 77e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 787895e90e29d096be039202f2ff24fa8033b92477Eino-Ville Talvala mProducerControlledByApp = controlledByApp; 797cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mSwapIntervalZero = false; 80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 8235ffa6a868f1aa650c90956a4129bb70f780fc99Mathias AgopianSurface::~Surface() { 8335ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian if (mConnectedToCpu) { 8435ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian Surface::disconnect(NATIVE_WINDOW_API_CPU); 8535ffa6a868f1aa650c90956a4129bb70f780fc99Mathias Agopian } 8662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 8762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<IGraphicBufferProducer> Surface::getIGraphicBufferProducer() const { 89e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer; 90e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 91e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 920ee14ca23dc2759e213172e38a840da0c36bd3abWonsik Kimvoid Surface::setSidebandStream(const sp<NativeHandle>& stream) { 930ee14ca23dc2759e213172e38a840da0c36bd3abWonsik Kim mGraphicBufferProducer->setSidebandStream(stream); 940ee14ca23dc2759e213172e38a840da0c36bd3abWonsik Kim} 950ee14ca23dc2759e213172e38a840da0c36bd3abWonsik Kim 9629a3e90879fd96404c971e7187cd0e05927bbce0Dan Stozavoid Surface::allocateBuffers() { 9729a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t reqWidth = mReqWidth ? mReqWidth : mUserWidth; 9829a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza uint32_t reqHeight = mReqHeight ? mReqHeight : mUserHeight; 9929a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza mGraphicBufferProducer->allocateBuffers(mSwapIntervalZero, mReqWidth, 10029a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza mReqHeight, mReqFormat, mReqUsage); 10129a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza} 10229a3e90879fd96404c971e7187cd0e05927bbce0Dan Stoza 103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_setSwapInterval(ANativeWindow* window, int interval) { 104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 105e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->setSwapInterval(interval); 106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 108e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer(ANativeWindow* window, 109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer, int* fenceFd) { 110e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->dequeueBuffer(buffer, fenceFd); 112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 113e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer(ANativeWindow* window, 115e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 116e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 117e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, fenceFd); 118e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 119e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 120e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer(ANativeWindow* window, 121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer, int fenceFd) { 122e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 123e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, fenceFd); 124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 125e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 126e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_dequeueBuffer_DEPRECATED(ANativeWindow* window, 127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer** buffer) { 128e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 129e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buf; 130e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int result = c->dequeueBuffer(&buf, &fenceFd); 132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(new Fence(fenceFd)); 133ea74d3b78d607cde17790a7bb83e6f68ffd34cfdMathias Agopian int waitResult = fence->waitForever("dequeueBuffer_DEPRECATED"); 134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (waitResult != OK) { 135e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer_DEPRECATED: Fence::wait returned an error: %d", 136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian waitResult); 137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian c->cancelBuffer(buf, -1); 138e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return waitResult; 13962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian } 140e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = buf; 141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 14262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian} 14362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_cancelBuffer_DEPRECATED(ANativeWindow* window, 145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->cancelBuffer(buffer, -1); 148e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 150e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_lockBuffer_DEPRECATED(ANativeWindow* window, 151e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 152e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 153e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->lockBuffer_DEPRECATED(buffer); 154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_queueBuffer_DEPRECATED(ANativeWindow* window, 157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* buffer) { 158e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->queueBuffer(buffer, -1); 160e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 161e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 162e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_query(const ANativeWindow* window, 163e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int what, int* value) { 164e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Surface* c = getSelf(window); 165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->query(what, value); 166e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 167e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 168e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::hook_perform(ANativeWindow* window, int operation, ...) { 169e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_list args; 170e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian va_start(args, operation); 171e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Surface* c = getSelf(window); 172e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return c->perform(operation, args); 173e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 174e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 175e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setSwapInterval(int interval) { 176e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 177e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // EGL specification states: 178e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // interval is silently clamped to minimum and maximum implementation 179e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dependent values before being stored. 180e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 181e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval < minSwapInterval) 182e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = minSwapInterval; 183e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 184e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (interval > maxSwapInterval) 185e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian interval = maxSwapInterval; 186e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 1877cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian mSwapIntervalZero = (interval == 0); 188e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 1897cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian return NO_ERROR; 190e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 191e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 192ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopianint Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) { 193e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 194e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::dequeueBuffer"); 1950f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 1960f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin int reqW; 1970f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin int reqH; 1980f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin bool swapIntervalZero; 1990f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin uint32_t reqFormat; 2000f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin uint32_t reqUsage; 2010f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 2020f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin { 2030f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin Mutex::Autolock lock(mMutex); 2040f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 2050f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin reqW = mReqWidth ? mReqWidth : mUserWidth; 2060f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin reqH = mReqHeight ? mReqHeight : mUserHeight; 2070f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 2080f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin swapIntervalZero = mSwapIntervalZero; 2090f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin reqFormat = mReqFormat; 2100f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin reqUsage = mReqUsage; 2110f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin } // Drop the lock so that we can still touch the Surface while blocking in IGBP::dequeueBuffer 2120f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 213e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int buf = -1; 214e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence; 2150f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, swapIntervalZero, 2160f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin reqW, reqH, reqFormat, reqUsage); 2170f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 218e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result < 0) { 2190f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin ALOGV("dequeueBuffer: IGraphicBufferProducer::dequeueBuffer(%d, %d, %d, %d, %d)" 2200f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin "failed: %d", swapIntervalZero, reqW, reqH, reqFormat, reqUsage, 221e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result); 222e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 22301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 2240f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 2250f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin Mutex::Autolock lock(mMutex); 2260f1889efe77171696bfb3499832ed1732343d9fbIgor Murashkin 227e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer>& gbuf(mSlots[buf].buffer); 228ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian 229ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian // this should never happen 230ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian ALOGE_IF(fence == NULL, "Surface::dequeueBuffer: received null Fence! buf=%d", buf); 231ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian 232e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result & IGraphicBufferProducer::RELEASE_ALL_BUFFERS) { 233e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 234e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 235e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 236e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) { 237e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian result = mGraphicBufferProducer->requestBuffer(buf, &gbuf); 238e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (result != NO_ERROR) { 239ba93b3f8e403636b614a4a379f9421bc70dca84fMathias Agopian ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result); 2409f5a1b6abd5d77923bf5e0f1c5e2816fdee832c2Jesse Hall mGraphicBufferProducer->cancelBuffer(buf, fence); 241e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return result; 242e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 243e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 244e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 245e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (fence->isValid()) { 246e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = fence->dup(); 247e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (*fenceFd == -1) { 248e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("dequeueBuffer: error duping fence: %d", errno); 249e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // dup() should never fail; something is badly wrong. Soldier on 250e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // and hope for the best; the worst that should happen is some 251e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // visible corruption that lasts until the next frame. 252e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 253e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 254e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *fenceFd = -1; 255e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 256e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 257e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *buffer = gbuf.get(); 258e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 25901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 26001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 261e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::cancelBuffer(android_native_buffer_t* buffer, 262e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd) { 263e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 264e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::cancelBuffer"); 265e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 266e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 267e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 268e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 269e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 270e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 271e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mGraphicBufferProducer->cancelBuffer(i, fence); 272e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 273e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 274e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 275e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::getSlotFromBufferLocked( 276e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_buffer_t* buffer) const { 277e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bool dumpedState = false; 278e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 279e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mSlots[i].buffer != NULL && 280e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer->handle == buffer->handle) { 281e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 282e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 28301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian } 284e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("getSlotFromBufferLocked: unknown buffer: %p", buffer->handle); 285e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 28601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 28701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 2887d2d160cdc3cba9f4454f38433c94b68376cb843Igor Murashkinint Surface::lockBuffer_DEPRECATED(android_native_buffer_t* buffer __attribute__((unused))) { 289e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::lockBuffer"); 290e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 291e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 292e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 294e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) { 295e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 296e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::queueBuffer"); 297e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 298e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp; 2993c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden bool isAutoTimestamp = false; 300e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mTimestamp == NATIVE_WINDOW_TIMESTAMP_AUTO) { 3014b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 3023c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden isAutoTimestamp = true; 3034b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden ALOGV("Surface::queueBuffer making up timestamp: %.2f ms", 3044b49e08385a96398aa2633e096fe916dc9f08768Andy McFadden timestamp / 1000000.f); 305e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 306e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian timestamp = mTimestamp; 307e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 308e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int i = getSlotFromBufferLocked(buffer); 309e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (i < 0) { 310e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return i; 311e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 312e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 313e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 314e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // Make sure the crop rectangle is entirely inside the buffer. 315e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect crop; 316e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.intersect(Rect(buffer->width, buffer->height), &crop); 317e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 318e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<Fence> fence(fenceFd >= 0 ? new Fence(fenceFd) : Fence::NO_FENCE); 319e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 3203c25621ad7d13f64d3ab95a27fa970fbc9998f73Andy McFadden IGraphicBufferProducer::QueueBufferInput input(timestamp, isAutoTimestamp, 3211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk crop, mScalingMode, mTransform ^ mStickyTransform, mSwapIntervalZero, 3221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk fence, mStickyTransform); 323e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->queueBuffer(i, input, &output); 324e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != OK) { 325e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err); 326bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 327e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 3281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk uint32_t hint = 0; 3291681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk output.deflate(&mDefaultWidth, &mDefaultHeight, &hint, 330e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 331e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 3321681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk // Disable transform hint if sticky transform is set. 3331681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (mStickyTransform == 0) { 3341681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk mTransformHint = hint; 3351681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 3361681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 337e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 338e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 339e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 34001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 34162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian 342e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::query(int what, int* value) const { 343e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 344e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::query"); 345e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 346e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 347e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (what) { 348e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_FORMAT: 349e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mReqFormat) { 350e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mReqFormat; 351e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 352e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 353e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 354e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER: { 355e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<ISurfaceComposer> composer( 356e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ComposerService::getComposerService()); 357e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (composer->authenticateSurfaceTexture(mGraphicBufferProducer)) { 358e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 1; 359e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 360e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 361e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 362e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 363e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 364e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONCRETE_TYPE: 365e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = NATIVE_WINDOW_SURFACE; 366e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 367e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_WIDTH: 368e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserWidth ? mUserWidth : mDefaultWidth; 369e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 370e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DEFAULT_HEIGHT: 371e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mUserHeight ? mUserHeight : mDefaultHeight; 372e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 373e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_TRANSFORM_HINT: 374e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = mTransformHint; 375e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 376e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: { 377e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = NO_ERROR; 378e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConsumerRunningBehind) { 379e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *value = 0; 380e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 381e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = mGraphicBufferProducer->query(what, value); 382e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 383e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = *value; 384e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 385e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 386e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 387e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 388e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 389bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg } 390e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return mGraphicBufferProducer->query(what, value); 391bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg} 392bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 393e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::perform(int operation, va_list args) 394bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg{ 395e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int res = NO_ERROR; 396e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (operation) { 397e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_CONNECT: 398e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 399e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 400e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_DISCONNECT: 401e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // deprecated. must return NO_ERROR. 402e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 403e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_USAGE: 404e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetUsage(args); 405e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 406e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_CROP: 407e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetCrop(args); 408e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 409e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFER_COUNT: 410e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBufferCount(args); 411e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 412e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY: 413e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersGeometry(args); 414e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 415e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM: 416e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTransform(args); 417e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 4181681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk case NATIVE_WINDOW_SET_BUFFERS_STICKY_TRANSFORM: 4191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk res = dispatchSetBuffersStickyTransform(args); 4201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk break; 421e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP: 422e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersTimestamp(args); 423e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 424e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS: 425e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersDimensions(args); 426e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 427e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS: 428e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersUserDimensions(args); 429e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 430e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_BUFFERS_FORMAT: 431e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetBuffersFormat(args); 432e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 433e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_LOCK: 434e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchLock(args); 435e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 436e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_UNLOCK_AND_POST: 437e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchUnlockAndPost(args); 438e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 439e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SET_SCALING_MODE: 440e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchSetScalingMode(args); 441e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 442e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_CONNECT: 443e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchConnect(args); 444e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 445e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_API_DISCONNECT: 446e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = dispatchDisconnect(args); 447e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 4487cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad case NATIVE_WINDOW_SET_SIDEBAND_STREAM: 4497cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad res = dispatchSetSidebandStream(args); 4507cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad break; 451e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 452e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian res = NAME_NOT_FOUND; 453e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 454e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 455e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return res; 45601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian} 45701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian 458e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchConnect(va_list args) { 459e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 460e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return connect(api); 461e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 462e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 463e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchDisconnect(va_list args) { 464e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int api = va_arg(args, int); 465e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return disconnect(api); 466e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 467e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 468e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetUsage(va_list args) { 469e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int usage = va_arg(args, int); 470e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setUsage(usage); 471e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 472e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 473e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetCrop(va_list args) { 474e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian android_native_rect_t const* rect = va_arg(args, android_native_rect_t*); 475e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setCrop(reinterpret_cast<Rect const*>(rect)); 476e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 477e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 478e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBufferCount(va_list args) { 479e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t bufferCount = va_arg(args, size_t); 480e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBufferCount(bufferCount); 481e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 482e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 483e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersGeometry(va_list args) { 484e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 485e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 486e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 487e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = setBuffersDimensions(w, h); 488e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err != 0) { 489e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 490579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian } 491e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 492e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 493bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg 494e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersDimensions(va_list args) { 495e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 496e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 497e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersDimensions(w, h); 498e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 499579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 500e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersUserDimensions(va_list args) { 501e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int w = va_arg(args, int); 502e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int h = va_arg(args, int); 503e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersUserDimensions(w, h); 504579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 505579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 506e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersFormat(va_list args) { 507e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int f = va_arg(args, int); 508e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersFormat(f); 509e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 510aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 511e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetScalingMode(va_list args) { 512e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int m = va_arg(args, int); 513e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setScalingMode(m); 514e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 515e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 516e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTransform(va_list args) { 517e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int transform = va_arg(args, int); 518e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTransform(transform); 519e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 520e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 5211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkint Surface::dispatchSetBuffersStickyTransform(va_list args) { 5221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int transform = va_arg(args, int); 5231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return setBuffersStickyTransform(transform); 5241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 5251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 526e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchSetBuffersTimestamp(va_list args) { 527e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int64_t timestamp = va_arg(args, int64_t); 528e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return setBuffersTimestamp(timestamp); 529e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 530e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 531e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::dispatchLock(va_list args) { 532e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer = va_arg(args, ANativeWindow_Buffer*); 533e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ARect* inOutDirtyBounds = va_arg(args, ARect*); 534e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return lock(outBuffer, inOutDirtyBounds); 535e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 536e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 5377d2d160cdc3cba9f4454f38433c94b68376cb843Igor Murashkinint Surface::dispatchUnlockAndPost(va_list args __attribute__((unused))) { 538e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return unlockAndPost(); 539e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 540e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 5417cb0d39016ff8061fe9fc2967870c145a6ffa2acRachadint Surface::dispatchSetSidebandStream(va_list args) { 5427cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad native_handle_t* sH = va_arg(args, native_handle_t*); 5437cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad sp<NativeHandle> sidebandHandle = NativeHandle::create(sH, false); 5447cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad setSidebandStream(sidebandHandle); 5457cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad return OK; 5467cb0d39016ff8061fe9fc2967870c145a6ffa2acRachad} 547e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 548e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::connect(int api) { 549e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 550e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::connect"); 551f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza static sp<IProducerListener> listener = new DummyProducerListener(); 552e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 553e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian IGraphicBufferProducer::QueueBufferOutput output; 554f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output); 555e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 556e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint32_t numPendingBuffers = 0; 5571681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk uint32_t hint = 0; 5581681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk output.deflate(&mDefaultWidth, &mDefaultHeight, &hint, 559e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian &numPendingBuffers); 5601681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 5611681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk // Disable transform hint if sticky transform is set. 5621681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (mStickyTransform == 0) { 5631681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk mTransformHint = hint; 5641681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 5651681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 566e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConsumerRunningBehind = (numPendingBuffers >= 2); 567aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 568e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err && api == NATIVE_WINDOW_API_CPU) { 569e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = true; 570aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 571e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 572aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis} 573aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis 574365857df8b94c959dea984a63013f6e7730ef976Mathias Agopian 575e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::disconnect(int api) { 576e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 577e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::disconnect"); 578e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 579e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 580e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = mGraphicBufferProducer->disconnect(api); 581e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!err) { 582e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = 0; 583e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = 0; 584e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = 0; 585e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = 0; 586e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop.clear(); 587e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE; 588e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = 0; 5891681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk mStickyTransform = 0; 5901681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 591e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (api == NATIVE_WINDOW_API_CPU) { 592e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mConnectedToCpu = false; 593aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis } 594a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian } 595e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 596a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian} 597a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian 598e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setUsage(uint32_t reqUsage) 59901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian{ 600e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setUsage"); 601e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 602e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqUsage = reqUsage; 603e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return OK; 604e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 605e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 606e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setCrop(Rect const* rect) 607e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 608e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 609a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 610e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Rect realRect; 611e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (rect == NULL || rect->isEmpty()) { 612e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.clear(); 613e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 614e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect = *rect; 615631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian } 616e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 617e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setCrop rect=[%d %d %d %d]", 618e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian realRect.left, realRect.top, realRect.right, realRect.bottom); 619e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 620e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 621e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mCrop = realRect; 622e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 625e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBufferCount(int bufferCount) 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 627e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 628e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBufferCount"); 629e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 630e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 631e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = mGraphicBufferProducer->setBufferCount(bufferCount); 632e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "IGraphicBufferProducer::setBufferCount(%d) returned %s", 633e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian bufferCount, strerror(-err)); 634e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 635e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 636e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian freeAllBuffers(); 637e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 638e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 639e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 642e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersDimensions(int w, int h) 643e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 644e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 645e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersDimensions"); 646e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 647e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 648e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 649e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 650e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 651e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 652e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 653e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 654e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqWidth = w; 655e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqHeight = h; 656e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 657076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} 658076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 659e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersUserDimensions(int w, int h) 660e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 661e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 662e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersUserDimensions"); 663e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 664e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (w<0 || h<0) 665e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 666e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 667e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if ((w && !h) || (!w && h)) 668e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 669e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 670e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 671e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserWidth = w; 672e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mUserHeight = h; 673e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 6741e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo} 6751e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo 676e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersFormat(int format) 677e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 678e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersFormat"); 679e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 680e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (format<0) 681e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 682e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 683e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 684e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mReqFormat = format; 685e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 686631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian} 687631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopian 688e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setScalingMode(int mode) 689e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 690e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 691e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setScalingMode(%d)", mode); 692e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 693e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian switch (mode) { 694e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_FREEZE: 695e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: 696e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: 697e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian break; 698e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian default: 699e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("unknown scaling mode: %d", mode); 700e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return BAD_VALUE; 701e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 702076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 703e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 704e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mScalingMode = mode; 705e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 706e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 707e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 708e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTransform(int transform) 709e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 710e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ATRACE_CALL(); 711e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTransform"); 712e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 713e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTransform = transform; 714e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 715e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 716e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 7171681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkint Surface::setBuffersStickyTransform(int transform) 7181681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk{ 7191681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ATRACE_CALL(); 7201681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGV("Surface::setBuffersStickyTransform"); 7211681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk Mutex::Autolock lock(mMutex); 7221681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk mStickyTransform = transform; 7231681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return NO_ERROR; 7241681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 7251681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 726e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianint Surface::setBuffersTimestamp(int64_t timestamp) 727e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 728e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGV("Surface::setBuffersTimestamp"); 729e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 730e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mTimestamp = timestamp; 731e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return NO_ERROR; 732e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 733e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 734e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid Surface::freeAllBuffers() { 735e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (int i = 0; i < NUM_BUFFER_SLOTS; i++) { 736e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].buffer = 0; 737391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis } 7381d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala} 7391d01a12e7150be569557b64da9b8663c62c13594Eino-Ville Talvala 740e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------- 741e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// the lock/unlock APIs must be used from the same thread 742e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 743e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatic status_t copyBlt( 744e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& dst, 745e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& src, 746e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region& reg) 747e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 748e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // src and dst with, height and format must be identical. no verification 749e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // is done here. 750e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err; 751e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * src_bits = NULL; 752e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = src->lock(GRALLOC_USAGE_SW_READ_OFTEN, reg.bounds(), (void**)&src_bits); 753e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking src buffer %s", strerror(-err)); 754e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 755e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t* dst_bits = NULL; 756e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = dst->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, reg.bounds(), (void**)&dst_bits); 757e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "error locking dst buffer %s", strerror(-err)); 758e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 759e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator head(reg.begin()); 760e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region::const_iterator tail(reg.end()); 761e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (head != tail && src_bits && dst_bits) { 762e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t bpp = bytesPerPixel(src->format); 763e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t dbpr = dst->stride * bpp; 764e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const size_t sbpr = src->stride * bpp; 765e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 766e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian while (head != tail) { 767e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect& r(*head++); 768e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ssize_t h = r.height(); 769e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (h <= 0) continue; 770e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size_t size = r.width() * bpp; 771e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t const * s = src_bits + (r.left + src->stride * r.top) * bpp; 772e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian uint8_t * d = dst_bits + (r.left + dst->stride * r.top) * bpp; 773e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dbpr==sbpr && size==sbpr) { 774e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian size *= h; 775e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian h = 1; 776e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 777e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian do { 778e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian memcpy(d, s, size); 779e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian d += dbpr; 780e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian s += sbpr; 781e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } while (--h > 0); 782e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 783e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 784e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 785e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (src_bits) 786e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian src->unlock(); 787e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 788e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (dst_bits) 789e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dst->unlock(); 790e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 791e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 792e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian} 793a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 794e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------- 79555fa25161a7626ae6a15bc2cc46e22771455ed80Mathias Agopian 796e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::lock( 797e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) 798e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 799e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer != 0) { 800e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::lock failed, already locked"); 801e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 80387a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 804e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!mConnectedToCpu) { 805e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int err = Surface::connect(NATIVE_WINDOW_API_CPU); 806e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err) { 807e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 808e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 809e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // we're intending to do software rendering from this point 810e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian setUsage(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 81187a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian } 81287a96ea9eae3f998381735ec65496e256f871c3cMathias Agopian 813e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ANativeWindowBuffer* out; 814e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int fenceFd = -1; 815e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian status_t err = dequeueBuffer(&out, &fenceFd); 816e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "dequeueBuffer failed (%s)", strerror(-err)); 817e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (err == NO_ERROR) { 818e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out)); 819e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Rect bounds(backBuffer->width, backBuffer->height); 820e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 821e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region newDirtyRegion; 822e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 823e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(static_cast<Rect const&>(*inOutDirtyBounds)); 824e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.andSelf(bounds); 825e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 826e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 827e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 828e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 829e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // figure out if we can copy the frontbuffer back 830e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const sp<GraphicBuffer>& frontBuffer(mPostedBuffer); 831e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const bool canCopyBack = (frontBuffer != 0 && 832e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->width == frontBuffer->width && 833e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->height == frontBuffer->height && 834e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->format == frontBuffer->format); 835e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 836e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (canCopyBack) { 837e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // copy the area that is invalid and not repainted this round 838e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian const Region copyback(mDirtyRegion.subtract(newDirtyRegion)); 839e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (!copyback.isEmpty()) 840e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian copyBlt(backBuffer, frontBuffer, copyback); 841e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 842e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // if we can't copy-back anything, modify the user's dirty 843e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian // region to make sure they redraw the whole buffer 844e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian newDirtyRegion.set(bounds); 845e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.clear(); 846e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 847e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian for (size_t i=0 ; i<NUM_BUFFER_SLOTS ; i++) { 848e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mSlots[i].dirtyRegion.clear(); 849e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 850e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 851e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 852e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 853e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian { // scope for the lock 854e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Mutex::Autolock lock(mMutex); 855e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian int backBufferSlot(getSlotFromBufferLocked(backBuffer.get())); 856e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (backBufferSlot >= 0) { 857e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian Region& dirtyRegion(mSlots[backBufferSlot].dirtyRegion); 858e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.subtract(dirtyRegion); 859e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian dirtyRegion = newDirtyRegion; 860e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 861e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 862e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 863e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mDirtyRegion.orSelf(newDirtyRegion); 864e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (inOutDirtyBounds) { 865e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *inOutDirtyBounds = newDirtyRegion.getBounds(); 866e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 867e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 868e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian void* vaddr; 8698f3960179c56767e5077be8337792bd4e244b7d7Francis Hart status_t res = backBuffer->lockAsync( 870e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 8718f3960179c56767e5077be8337792bd4e244b7d7Francis Hart newDirtyRegion.bounds(), &vaddr, fenceFd); 872e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 873e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGW_IF(res, "failed locking buffer (handle = %p)", 874e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian backBuffer->handle); 875e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 876e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (res != 0) { 877e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian err = INVALID_OPERATION; 878e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } else { 879e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = backBuffer; 880e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->width = backBuffer->width; 881e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->height = backBuffer->height; 882e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->stride = backBuffer->stride; 883e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->format = backBuffer->format; 884e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian outBuffer->bits = vaddr; 885e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 886e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 887076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian return err; 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 889cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 890e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t Surface::unlockAndPost() 891e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{ 892e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian if (mLockedBuffer == 0) { 893e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE("Surface::unlockAndPost failed, no locked buffer"); 894e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return INVALID_OPERATION; 895e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian } 896e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 8978f3960179c56767e5077be8337792bd4e244b7d7Francis Hart int fd = -1; 8988f3960179c56767e5077be8337792bd4e244b7d7Francis Hart status_t err = mLockedBuffer->unlockAsync(&fd); 899e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle); 900e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 9018f3960179c56767e5077be8337792bd4e244b7d7Francis Hart err = queueBuffer(mLockedBuffer.get(), fd); 902e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)", 903e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer->handle, strerror(-err)); 904e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 905e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mPostedBuffer = mLockedBuffer; 906e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian mLockedBuffer = 0; 907e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian return err; 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 911