diff options
28 files changed, 215 insertions, 75 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index facf3000cb..5885738e9d 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -102,6 +102,7 @@ static const TracingCategory k_categories[] = { { "pm", "Package Manager", ATRACE_TAG_PACKAGE_MANAGER, { } }, { "ss", "System Server", ATRACE_TAG_SYSTEM_SERVER, { } }, { "database", "Database", ATRACE_TAG_DATABASE, { } }, + { "network", "Network", ATRACE_TAG_NETWORK, { } }, { k_coreServiceCategory, "Core services", 0, { } }, { "sched", "CPU Scheduling", 0, { { REQ, "/sys/kernel/debug/tracing/events/sched/sched_switch/enable" }, diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp index e9f9e57358..23629b33b3 100644 --- a/cmds/dumpstate/dumpstate.cpp +++ b/cmds/dumpstate/dumpstate.cpp @@ -689,6 +689,8 @@ static void dump_iptables() { run_command("IP6TABLES", 10, "ip6tables", "-L", "-nvx", NULL); run_command("IPTABLE NAT", 10, "iptables", "-t", "nat", "-L", "-nvx", NULL); /* no ip6 nat */ + run_command("IPTABLE MANGLE", 10, "iptables", "-t", "mangle", "-L", "-nvx", NULL); + run_command("IP6TABLE MANGLE", 10, "ip6tables", "-t", "mangle", "-L", "-nvx", NULL); run_command("IPTABLE RAW", 10, "iptables", "-t", "raw", "-L", "-nvx", NULL); run_command("IP6TABLE RAW", 10, "ip6tables", "-t", "raw", "-L", "-nvx", NULL); } diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 2014e993e3..31f9d7e4da 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -2186,6 +2186,9 @@ int move_ab(const char* apk_path, const char* instruction_set, const char* oat_d bool art_success = true; if (!a_image_path.empty()) { art_success = move_ab_path(b_image_path, a_image_path); + if (!art_success) { + unlink(a_image_path.c_str()); + } } success = art_success || kIgnoreAppImageFailure; diff --git a/include/gui/GraphicBufferAlloc.h b/include/gui/GraphicBufferAlloc.h index 69fe51ef93..62e3877259 100644 --- a/include/gui/GraphicBufferAlloc.h +++ b/include/gui/GraphicBufferAlloc.h @@ -35,7 +35,7 @@ public: virtual ~GraphicBufferAlloc(); virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t width, uint32_t height, PixelFormat format, uint32_t usage, - status_t* error); + std::string requestorName, status_t* error) override; }; diff --git a/include/gui/IGraphicBufferAlloc.h b/include/gui/IGraphicBufferAlloc.h index f3c46ec2ed..600cf27c4c 100644 --- a/include/gui/IGraphicBufferAlloc.h +++ b/include/gui/IGraphicBufferAlloc.h @@ -21,14 +21,15 @@ #include <sys/types.h> #include <binder/IInterface.h> +#include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> #include <utils/RefBase.h> +#include <string> + namespace android { // ---------------------------------------------------------------------------- -class GraphicBuffer; - class IGraphicBufferAlloc : public IInterface { public: @@ -37,7 +38,13 @@ public: /* Create a new GraphicBuffer for the client to use. */ virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, - PixelFormat format, uint32_t usage, status_t* error) = 0; + PixelFormat format, uint32_t usage, std::string requestorName, + status_t* error) = 0; + + sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, + PixelFormat format, uint32_t usage, status_t* error) { + return createGraphicBuffer(w, h, format, usage, "<Unknown>", error); + } }; // ---------------------------------------------------------------------------- diff --git a/include/gui/SurfaceComposerClient.h b/include/gui/SurfaceComposerClient.h index b8ee331736..c4f88b60cc 100644 --- a/include/gui/SurfaceComposerClient.h +++ b/include/gui/SurfaceComposerClient.h @@ -166,8 +166,8 @@ public: static status_t getHdrCapabilities(const sp<IBinder>& display, HdrCapabilities* outCapabilities); - static void setDisplaySurface(const sp<IBinder>& token, - const sp<IGraphicBufferProducer>& bufferProducer); + static status_t setDisplaySurface(const sp<IBinder>& token, + sp<IGraphicBufferProducer> bufferProducer); static void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); static void setDisplaySize(const sp<IBinder>& token, uint32_t width, uint32_t height); diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h index 3da720ff37..3e127a12a5 100644 --- a/include/ui/GraphicBuffer.h +++ b/include/ui/GraphicBuffer.h @@ -26,6 +26,7 @@ #include <utils/Flattenable.h> #include <utils/RefBase.h> +#include <string> struct ANativeWindowBuffer; @@ -73,7 +74,7 @@ public: // creates w * h buffer GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat, - uint32_t inUsage); + uint32_t inUsage, std::string requestorName = "<Unknown>"); // create a buffer from an existing handle GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat, @@ -159,7 +160,7 @@ private: const GraphicBuffer& operator = (const GraphicBuffer& rhs) const; status_t initSize(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat, - uint32_t inUsage); + uint32_t inUsage, std::string requestorName); void free_handle(); diff --git a/include/ui/GraphicBufferAllocator.h b/include/ui/GraphicBufferAllocator.h index 62ebbd5ff2..28d0238339 100644 --- a/include/ui/GraphicBufferAllocator.h +++ b/include/ui/GraphicBufferAllocator.h @@ -61,7 +61,7 @@ public: status_t allocate(uint32_t w, uint32_t h, PixelFormat format, uint32_t usage, buffer_handle_t* handle, uint32_t* stride, - uint64_t graphicBufferId); + uint64_t graphicBufferId, std::string requestorName); status_t free(buffer_handle_t handle); @@ -76,6 +76,7 @@ private: PixelFormat format; uint32_t usage; size_t size; + std::string requestorName; }; static Mutex sLock; diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index b7b56f03f2..47ab6f2fab 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -496,7 +496,8 @@ status_t BufferQueueProducer::dequeueBuffer(int *outSlot, status_t error; BQ_LOGV("dequeueBuffer: allocating a new buffer for slot %d", *outSlot); sp<GraphicBuffer> graphicBuffer(mCore->mAllocator->createGraphicBuffer( - width, height, format, usage, &error)); + width, height, format, usage, + {mConsumerName.string(), mConsumerName.size()}, &error)); { // Autolock scope Mutex::Autolock lock(mCore->mMutex); @@ -1262,7 +1263,8 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height, for (size_t i = 0; i < newBufferCount; ++i) { status_t result = NO_ERROR; sp<GraphicBuffer> graphicBuffer(mCore->mAllocator->createGraphicBuffer( - allocWidth, allocHeight, allocFormat, allocUsage, &result)); + allocWidth, allocHeight, allocFormat, allocUsage, + {mConsumerName.string(), mConsumerName.size()}, &result)); if (result != NO_ERROR) { BQ_LOGE("allocateBuffers: failed to allocate buffer (%u x %u, format" " %u, usage %u)", width, height, format, usage); diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp index 553b65ce28..aa0db4506c 100644 --- a/libs/gui/GLConsumer.cpp +++ b/libs/gui/GLConsumer.cpp @@ -345,7 +345,8 @@ sp<GraphicBuffer> GLConsumer::getDebugTexImageBuffer() { // continues to use it. sp<GraphicBuffer> buffer = new GraphicBuffer( kDebugData.width, kDebugData.height, PIXEL_FORMAT_RGBA_8888, - GraphicBuffer::USAGE_SW_WRITE_RARELY); + GraphicBuffer::USAGE_SW_WRITE_RARELY, + "[GLConsumer debug texture]"); uint32_t* bits; buffer->lock(GraphicBuffer::USAGE_SW_WRITE_RARELY, reinterpret_cast<void**>(&bits)); uint32_t stride = buffer->getStride(); diff --git a/libs/gui/GraphicBufferAlloc.cpp b/libs/gui/GraphicBufferAlloc.cpp index 9643402dfa..e6150f4926 100644 --- a/libs/gui/GraphicBufferAlloc.cpp +++ b/libs/gui/GraphicBufferAlloc.cpp @@ -32,9 +32,10 @@ GraphicBufferAlloc::~GraphicBufferAlloc() { } sp<GraphicBuffer> GraphicBufferAlloc::createGraphicBuffer(uint32_t width, - uint32_t height, PixelFormat format, uint32_t usage, status_t* error) { - sp<GraphicBuffer> graphicBuffer( - new GraphicBuffer(width, height, format, usage)); + uint32_t height, PixelFormat format, uint32_t usage, + std::string requestorName, status_t* error) { + sp<GraphicBuffer> graphicBuffer(new GraphicBuffer( + width, height, format, usage, std::move(requestorName))); status_t err = graphicBuffer->initCheck(); *error = err; if (err != 0 || graphicBuffer->handle == 0) { diff --git a/libs/gui/IGraphicBufferAlloc.cpp b/libs/gui/IGraphicBufferAlloc.cpp index 3009989964..7b3b7c1dc5 100644 --- a/libs/gui/IGraphicBufferAlloc.cpp +++ b/libs/gui/IGraphicBufferAlloc.cpp @@ -46,13 +46,19 @@ public: virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t width, uint32_t height, PixelFormat format, uint32_t usage, - status_t* error) { + std::string requestorName, status_t* error) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferAlloc::getInterfaceDescriptor()); data.writeUint32(width); data.writeUint32(height); data.writeInt32(static_cast<int32_t>(format)); data.writeUint32(usage); + if (requestorName.empty()) { + requestorName += "[PID "; + requestorName += std::to_string(getpid()); + requestorName += ']'; + } + data.writeUtf8AsUtf16(requestorName); remote()->transact(CREATE_GRAPHIC_BUFFER, data, &reply); sp<GraphicBuffer> graphicBuffer; status_t result = reply.readInt32(); @@ -101,9 +107,11 @@ status_t BnGraphicBufferAlloc::onTransact( uint32_t height = data.readUint32(); PixelFormat format = static_cast<PixelFormat>(data.readInt32()); uint32_t usage = data.readUint32(); - status_t error; - sp<GraphicBuffer> result = - createGraphicBuffer(width, height, format, usage, &error); + status_t error = NO_ERROR; + std::string requestorName; + data.readUtf8FromUtf16(&requestorName); + sp<GraphicBuffer> result = createGraphicBuffer(width, height, + format, usage, requestorName, &error); reply->writeInt32(error); if (result != 0) { reply->write(*result); diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index dbf811462d..ab223ffd4b 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1364,12 +1364,18 @@ status_t Surface::writeToParcel(Parcel* parcel, bool nameAlreadyWritten) const { status_t res = OK; - if (!nameAlreadyWritten) res = parcel->writeString16(name); + if (!nameAlreadyWritten) { + res = parcel->writeString16(name); + if (res != OK) return res; - if (res == OK) { - res = parcel->writeStrongBinder( - IGraphicBufferProducer::asBinder(graphicBufferProducer)); + /* isSingleBuffered defaults to no */ + res = parcel->writeInt32(0); + if (res != OK) return res; } + + res = parcel->writeStrongBinder( + IGraphicBufferProducer::asBinder(graphicBufferProducer)); + return res; } @@ -1380,13 +1386,20 @@ status_t Surface::readFromParcel(const Parcel* parcel) { status_t Surface::readFromParcel(const Parcel* parcel, bool nameAlreadyRead) { if (parcel == nullptr) return BAD_VALUE; + status_t res = OK; if (!nameAlreadyRead) { name = readMaybeEmptyString16(parcel); + // Discard this for now + int isSingleBuffered; + res = parcel->readInt32(&isSingleBuffered); + if (res != OK) { + return res; + } } sp<IBinder> binder; - status_t res = parcel->readStrongBinder(&binder); + res = parcel->readStrongBinder(&binder); if (res != OK) return res; graphicBufferProducer = interface_cast<IGraphicBufferProducer>(binder); diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 3df5f74fc9..b78de2ea59 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -170,8 +170,8 @@ public: status_t setGeometryAppliesWithResize(const sp<SurfaceComposerClient>& client, const sp<IBinder>& id); - void setDisplaySurface(const sp<IBinder>& token, - const sp<IGraphicBufferProducer>& bufferProducer); + status_t setDisplaySurface(const sp<IBinder>& token, + sp<IGraphicBufferProducer> bufferProducer); void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); void setDisplayProjection(const sp<IBinder>& token, uint32_t orientation, @@ -473,12 +473,24 @@ DisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { return mDisplayStates.editItemAt(static_cast<size_t>(index)); } -void Composer::setDisplaySurface(const sp<IBinder>& token, - const sp<IGraphicBufferProducer>& bufferProducer) { +status_t Composer::setDisplaySurface(const sp<IBinder>& token, + sp<IGraphicBufferProducer> bufferProducer) { + if (bufferProducer.get() != nullptr) { + // Make sure that composition can never be stalled by a virtual display + // consumer that isn't processing buffers fast enough. + status_t err = bufferProducer->setAsyncMode(true); + if (err != NO_ERROR) { + ALOGE("Composer::setDisplaySurface Failed to enable async mode on the " + "BufferQueue. This BufferQueue cannot be used for virtual " + "display. (%d)", err); + return err; + } + } Mutex::Autolock _l(mLock); DisplayState& s(getDisplayStateLocked(token)); s.surface = bufferProducer; s.what |= DisplayState::eSurfaceChanged; + return NO_ERROR; } void Composer::setDisplayLayerStack(const sp<IBinder>& token, @@ -716,9 +728,9 @@ status_t SurfaceComposerClient::setGeometryAppliesWithResize( // ---------------------------------------------------------------------------- -void SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, - const sp<IGraphicBufferProducer>& bufferProducer) { - Composer::getInstance().setDisplaySurface(token, bufferProducer); +status_t SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, + sp<IGraphicBufferProducer> bufferProducer) { + return Composer::getInstance().setDisplaySurface(token, bufferProducer); } void SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp index f28af6e200..97b948d979 100644 --- a/libs/ui/GraphicBuffer.cpp +++ b/libs/ui/GraphicBuffer.cpp @@ -54,7 +54,7 @@ GraphicBuffer::GraphicBuffer() } GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight, - PixelFormat inFormat, uint32_t inUsage) + PixelFormat inFormat, uint32_t inUsage, std::string requestorName) : BASE(), mOwner(ownData), mBufferMapper(GraphicBufferMapper::get()), mInitCheck(NO_ERROR), mId(getUniqueId()), mGenerationNumber(0) { @@ -64,7 +64,8 @@ GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight, format = usage = 0; handle = NULL; - mInitCheck = initSize(inWidth, inHeight, inFormat, inUsage); + mInitCheck = initSize(inWidth, inHeight, inFormat, inUsage, + std::move(requestorName)); } GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight, @@ -151,7 +152,7 @@ status_t GraphicBuffer::reallocate(uint32_t inWidth, uint32_t inHeight, allocator.free(handle); handle = 0; } - return initSize(inWidth, inHeight, inFormat, inUsage); + return initSize(inWidth, inHeight, inFormat, inUsage, "[Reallocation]"); } bool GraphicBuffer::needsReallocation(uint32_t inWidth, uint32_t inHeight, @@ -165,12 +166,12 @@ bool GraphicBuffer::needsReallocation(uint32_t inWidth, uint32_t inHeight, } status_t GraphicBuffer::initSize(uint32_t inWidth, uint32_t inHeight, - PixelFormat inFormat, uint32_t inUsage) + PixelFormat inFormat, uint32_t inUsage, std::string requestorName) { GraphicBufferAllocator& allocator = GraphicBufferAllocator::get(); uint32_t outStride = 0; status_t err = allocator.allocate(inWidth, inHeight, inFormat, inUsage, - &handle, &outStride, mId); + &handle, &outStride, mId, std::move(requestorName)); if (err == NO_ERROR) { width = static_cast<int>(inWidth); height = static_cast<int>(inHeight); diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp index 3b83fb6a44..edfff4d6a5 100644 --- a/libs/ui/GraphicBufferAllocator.cpp +++ b/libs/ui/GraphicBufferAllocator.cpp @@ -55,13 +55,15 @@ void GraphicBufferAllocator::dump(String8& result) const for (size_t i=0 ; i<c ; i++) { const alloc_rec_t& rec(list.valueAt(i)); if (rec.size) { - snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u (%4u) x %4u | %8X | 0x%08x\n", + snprintf(buffer, SIZE, "%10p: %7.2f KiB | %4u (%4u) x %4u | %8X | 0x%08x | %s\n", list.keyAt(i), rec.size/1024.0f, - rec.width, rec.stride, rec.height, rec.format, rec.usage); + rec.width, rec.stride, rec.height, rec.format, rec.usage, + rec.requestorName.c_str()); } else { - snprintf(buffer, SIZE, "%10p: unknown | %4u (%4u) x %4u | %8X | 0x%08x\n", + snprintf(buffer, SIZE, "%10p: unknown | %4u (%4u) x %4u | %8X | 0x%08x | %s\n", list.keyAt(i), - rec.width, rec.stride, rec.height, rec.format, rec.usage); + rec.width, rec.stride, rec.height, rec.format, rec.usage, + rec.requestorName.c_str()); } result.append(buffer); total += rec.size; @@ -81,7 +83,7 @@ void GraphicBufferAllocator::dumpToSystemLog() status_t GraphicBufferAllocator::allocate(uint32_t width, uint32_t height, PixelFormat format, uint32_t usage, buffer_handle_t* handle, - uint32_t* stride, uint64_t graphicBufferId) + uint32_t* stride, uint64_t graphicBufferId, std::string requestorName) { ATRACE_CALL(); @@ -140,6 +142,7 @@ status_t GraphicBufferAllocator::allocate(uint32_t width, uint32_t height, rec.format = format; rec.usage = usage; rec.size = static_cast<size_t>(height * (*stride) * bpp); + rec.requestorName = std::move(requestorName); list.add(*handle, rec); } diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp index 61ed8b651c..f41e6e2311 100644 --- a/opengl/libs/EGL/eglApi.cpp +++ b/opengl/libs/EGL/eglApi.cpp @@ -1920,6 +1920,10 @@ EGLClientBuffer eglCreateNativeClientBufferANDROID(const EGLint *attrib_list) CHECK_ERROR_CONDITION("Unable to write format"); err = data.writeUint32(usage); CHECK_ERROR_CONDITION("Unable to write usage"); + err = data.writeUtf8AsUtf16( + std::string("[eglCreateNativeClientBufferANDROID pid ") + + std::to_string(getpid()) + ']'); + CHECK_ERROR_CONDITION("Unable to write requestor name"); err = allocator->transact(IBinder::FIRST_CALL_TRANSACTION, data, &reply); CHECK_ERROR_CONDITION( diff --git a/services/sensorservice/SensorEventConnection.cpp b/services/sensorservice/SensorEventConnection.cpp index c1e1badf32..f2f1444125 100644 --- a/services/sensorservice/SensorEventConnection.cpp +++ b/services/sensorservice/SensorEventConnection.cpp @@ -206,7 +206,7 @@ void SensorService::SensorEventConnection::incrementPendingFlushCount(int32_t ha status_t SensorService::SensorEventConnection::sendEvents( sensors_event_t const* buffer, size_t numEvents, sensors_event_t* scratch, - SensorEventConnection const * const * mapFlushEventsToConnections) { + wp<const SensorEventConnection> const * mapFlushEventsToConnections) { // filter out events not for this connection int count = 0; Mutex::Autolock _l(mConnectionLock); @@ -234,7 +234,7 @@ status_t SensorService::SensorEventConnection::sendEvents( FlushInfo& flushInfo = mSensorInfo.editValueAt(index); // Check if there is a pending flush_complete event for this sensor on this connection. if (buffer[i].type == SENSOR_TYPE_META_DATA && flushInfo.mFirstFlushPending == true && - this == mapFlushEventsToConnections[i]) { + mapFlushEventsToConnections[i] == this) { flushInfo.mFirstFlushPending = false; ALOGD_IF(DEBUG_CONNECTIONS, "First flush event for sensor==%d ", buffer[i].meta_data.sensor); @@ -255,7 +255,7 @@ status_t SensorService::SensorEventConnection::sendEvents( // from the same sensor_handle AND the current connection is mapped to the // corresponding flush_complete_event. if (buffer[i].type == SENSOR_TYPE_META_DATA) { - if (this == mapFlushEventsToConnections[i]) { + if (mapFlushEventsToConnections[i] == this) { scratch[count++] = buffer[i]; } ++i; diff --git a/services/sensorservice/SensorEventConnection.h b/services/sensorservice/SensorEventConnection.h index b796cc05a1..883c16e23b 100644 --- a/services/sensorservice/SensorEventConnection.h +++ b/services/sensorservice/SensorEventConnection.h @@ -52,7 +52,7 @@ public: bool isDataInjectionMode, const String16& opPackageName); status_t sendEvents(sensors_event_t const* buffer, size_t count, sensors_event_t* scratch, - SensorEventConnection const * const * mapFlushEventsToConnections = NULL); + wp<const SensorEventConnection> const * mapFlushEventsToConnections = NULL); bool hasSensor(int32_t handle) const; bool hasAnySensor() const; bool hasOneShotSensors() const; diff --git a/services/sensorservice/SensorRecord.cpp b/services/sensorservice/SensorRecord.cpp index 644cfb0de3..53fb9de230 100644 --- a/services/sensorservice/SensorRecord.cpp +++ b/services/sensorservice/SensorRecord.cpp @@ -21,13 +21,13 @@ namespace android { SensorService::SensorRecord::SensorRecord( - const sp<SensorEventConnection>& connection) + const sp<const SensorEventConnection>& connection) { mConnections.add(connection); } bool SensorService::SensorRecord::addConnection( - const sp<SensorEventConnection>& connection) + const sp<const SensorEventConnection>& connection) { if (mConnections.indexOf(connection) < 0) { mConnections.add(connection); @@ -37,16 +37,16 @@ bool SensorService::SensorRecord::addConnection( } bool SensorService::SensorRecord::removeConnection( - const wp<SensorEventConnection>& connection) + const wp<const SensorEventConnection>& connection) { ssize_t index = mConnections.indexOf(connection); if (index >= 0) { mConnections.removeItemsAt(index, 1); } // Remove this connections from the queue of flush() calls made on this sensor. - for (Vector< wp<SensorEventConnection> >::iterator it = mPendingFlushConnections.begin(); + for (Vector< wp<const SensorEventConnection> >::iterator it = mPendingFlushConnections.begin(); it != mPendingFlushConnections.end(); ) { - if (it->unsafe_get() == connection.unsafe_get()) { + if (*it == connection) { it = mPendingFlushConnections.erase(it); } else { ++it; @@ -56,7 +56,7 @@ bool SensorService::SensorRecord::removeConnection( } void SensorService::SensorRecord::addPendingFlushConnection( - const sp<SensorEventConnection>& connection) { + const sp<const SensorEventConnection>& connection) { mPendingFlushConnections.add(connection); } @@ -66,10 +66,10 @@ void SensorService::SensorRecord::removeFirstPendingFlushConnection() { } } -SensorService::SensorEventConnection * +wp<const SensorService::SensorEventConnection> SensorService::SensorRecord::getFirstPendingFlushConnection() { if (mPendingFlushConnections.size() > 0) { - return mPendingFlushConnections[0].unsafe_get(); + return mPendingFlushConnections[0]; } return NULL; } diff --git a/services/sensorservice/SensorRecord.h b/services/sensorservice/SensorRecord.h index 29b970dc1f..5a35410572 100644 --- a/services/sensorservice/SensorRecord.h +++ b/services/sensorservice/SensorRecord.h @@ -25,20 +25,20 @@ class SensorService; class SensorService::SensorRecord { public: - SensorRecord(const sp<SensorEventConnection>& connection); - bool addConnection(const sp<SensorEventConnection>& connection); - bool removeConnection(const wp<SensorEventConnection>& connection); + SensorRecord(const sp<const SensorEventConnection>& connection); + bool addConnection(const sp<const SensorEventConnection>& connection); + bool removeConnection(const wp<const SensorEventConnection>& connection); size_t getNumConnections() const { return mConnections.size(); } - void addPendingFlushConnection(const sp<SensorEventConnection>& connection); + void addPendingFlushConnection(const sp<const SensorEventConnection>& connection); void removeFirstPendingFlushConnection(); - SensorEventConnection * getFirstPendingFlushConnection(); + wp<const SensorEventConnection> getFirstPendingFlushConnection(); void clearAllPendingFlushConnections(); private: - SortedVector< wp<SensorEventConnection> > mConnections; + SortedVector< wp<const SensorEventConnection> > mConnections; // A queue of all flush() calls made on this sensor. Flush complete events // will be sent in this order. - Vector< wp<SensorEventConnection> > mPendingFlushConnections; + Vector< wp<const SensorEventConnection> > mPendingFlushConnections; }; } diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index a24740be74..dbd06244cb 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -260,7 +260,7 @@ void SensorService::onFirstRef() { const size_t minBufferSize = SensorEventQueue::MAX_RECEIVE_BUFFER_EVENT_COUNT; mSensorEventBuffer = new sensors_event_t[minBufferSize]; mSensorEventScratch = new sensors_event_t[minBufferSize]; - mMapFlushEventsToConnections = new SensorEventConnection const * [minBufferSize]; + mMapFlushEventsToConnections = new wp<const SensorEventConnection> [minBufferSize]; mCurrentOperatingMode = NORMAL; mNextSensorRegIndex = 0; diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index 1e1ea5ab4a..4a63ef0afc 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -237,7 +237,7 @@ private: SortedVector< wp<SensorEventConnection> > mActiveConnections; bool mWakeLockAcquired; sensors_event_t *mSensorEventBuffer, *mSensorEventScratch; - SensorEventConnection const **mMapFlushEventsToConnections; + wp<const SensorEventConnection> * mMapFlushEventsToConnections; std::unordered_map<int, RecentEventLogger*> mRecentEvent; Mode mCurrentOperatingMode; diff --git a/services/surfaceflinger/DispSync.cpp b/services/surfaceflinger/DispSync.cpp index c67feb30aa..1a9820d95e 100644 --- a/services/surfaceflinger/DispSync.cpp +++ b/services/surfaceflinger/DispSync.cpp @@ -385,7 +385,7 @@ DispSync::DispSync(const char* name) : mThread->run("DispSync", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE); // set DispSync to SCHED_FIFO to minimize jitter struct sched_param param = {0}; - param.sched_priority = 1; + param.sched_priority = 2; if (sched_setscheduler(mThread->getTid(), SCHED_FIFO, ¶m) != 0) { ALOGE("Couldn't set SCHED_FIFO for DispSyncThread"); } diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 785df1a288..dfece935b1 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -591,19 +591,25 @@ void Layer::setGeometry( const Transform& tr(displayDevice->getTransform()); Rect transformedFrame = tr.transform(frame); auto error = hwcLayer->setDisplayFrame(transformedFrame); - ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set display frame " - "[%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left, - transformedFrame.top, transformedFrame.right, - transformedFrame.bottom, to_string(error).c_str(), - static_cast<int32_t>(error)); + if (error != HWC2::Error::None) { + ALOGE("[%s] Failed to set display frame [%d, %d, %d, %d]: %s (%d)", + mName.string(), transformedFrame.left, transformedFrame.top, + transformedFrame.right, transformedFrame.bottom, + to_string(error).c_str(), static_cast<int32_t>(error)); + } else { + hwcInfo.displayFrame = transformedFrame; + } FloatRect sourceCrop = computeCrop(displayDevice); error = hwcLayer->setSourceCrop(sourceCrop); - ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set source crop " - "[%.3f, %.3f, %.3f, %.3f]: %s (%d)", mName.string(), - sourceCrop.left, sourceCrop.top, sourceCrop.right, - sourceCrop.bottom, to_string(error).c_str(), - static_cast<int32_t>(error)); + if (error != HWC2::Error::None) { + ALOGE("[%s] Failed to set source crop [%.3f, %.3f, %.3f, %.3f]: " + "%s (%d)", mName.string(), sourceCrop.left, sourceCrop.top, + sourceCrop.right, sourceCrop.bottom, to_string(error).c_str(), + static_cast<int32_t>(error)); + } else { + hwcInfo.sourceCrop = sourceCrop; + } error = hwcLayer->setPlaneAlpha(s.alpha); ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " @@ -2235,6 +2241,54 @@ void Layer::dump(String8& result, Colorizer& colorizer) const } } +#ifdef USE_HWC2 +void Layer::miniDumpHeader(String8& result) { + result.append("----------------------------------------"); + result.append("---------------------------------------\n"); + result.append(" Layer name\n"); + result.append(" Z | "); + result.append(" Comp Type | "); + result.append(" Disp Frame (LTRB) | "); + result.append(" Source Crop (LTRB)\n"); + result.append("----------------------------------------"); + result.append("---------------------------------------\n"); +} + +void Layer::miniDump(String8& result, int32_t hwcId) const { + if (mHwcLayers.count(hwcId) == 0) { + return; + } + + String8 name; + if (mName.length() > 77) { + std::string shortened; + shortened.append(mName.string(), 36); + shortened.append("[...]"); + shortened.append(mName.string() + (mName.length() - 36), 36); + name = shortened.c_str(); + } else { + name = mName; + } + + result.appendFormat(" %s\n", name.string()); + + const Layer::State& layerState(getDrawingState()); + const HWCInfo& hwcInfo = mHwcLayers.at(hwcId); + result.appendFormat(" %10u | ", layerState.z); + result.appendFormat("%10s | ", + to_string(getCompositionType(hwcId)).c_str()); + const Rect& frame = hwcInfo.displayFrame; + result.appendFormat("%4d %4d %4d %4d | ", frame.left, frame.top, + frame.right, frame.bottom); + const FloatRect& crop = hwcInfo.sourceCrop; + result.appendFormat("%6.1f %6.1f %6.1f %6.1f\n", crop.left, crop.top, + crop.right, crop.bottom); + + result.append("- - - - - - - - - - - - - - - - - - - - "); + result.append("- - - - - - - - - - - - - - - - - - - -\n"); +} +#endif + void Layer::dumpFrameStats(String8& result) const { mFrameTracker.dumpStats(result); } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 65339530b4..2ce1340a23 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -402,6 +402,10 @@ public: /* always call base class first */ void dump(String8& result, Colorizer& colorizer) const; +#ifdef USE_HWC2 + static void miniDumpHeader(String8& result); + void miniDump(String8& result, int32_t hwcId) const; +#endif void dumpFrameStats(String8& result) const; void clearFrameStats(); void logFrameStats(); @@ -588,6 +592,8 @@ private: bool forceClientComposition; HWC2::Composition compositionType; bool clearClientTarget; + Rect displayFrame; + FloatRect sourceCrop; }; std::unordered_map<int32_t, HWCInfo> mHwcLayers; #else diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 2a67f4c1fb..8db071ed2f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -471,7 +471,7 @@ void SurfaceFlinger::init() { // set SFEventThread to SCHED_FIFO to minimize jitter struct sched_param param = {0}; - param.sched_priority = 1; + param.sched_priority = 2; if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { ALOGE("Couldn't set SCHED_FIFO for SFEventThread"); } @@ -3057,6 +3057,26 @@ void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index, * VSYNC state */ mEventThread->dump(result); + result.append("\n"); + + /* + * HWC layer minidump + */ + for (size_t d = 0; d < mDisplays.size(); d++) { + const sp<const DisplayDevice>& displayDevice(mDisplays[d]); + int32_t hwcId = displayDevice->getHwcDisplayId(); + if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) { + continue; + } + + result.appendFormat("Display %d HWC layers:\n", hwcId); + Layer::miniDumpHeader(result); + for (size_t l = 0; l < count; l++) { + const sp<Layer>& layer(currentLayers[l]); + layer->miniDump(result, hwcId); + } + result.append("\n"); + } /* * Dump HWComposer state diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp index 650d6b4dd7..b0f418c4fe 100644 --- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp +++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp @@ -467,7 +467,7 @@ void SurfaceFlinger::init() { // set SFEventThread to SCHED_FIFO to minimize jitter struct sched_param param = {0}; - param.sched_priority = 1; + param.sched_priority = 2; if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) { ALOGE("Couldn't set SCHED_FIFO for SFEventThread"); } |