diff options
46 files changed, 427 insertions, 358 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index 5836f11745..7ac0eb7d69 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -62,7 +62,7 @@ using hardware::atrace::V1_0::toString; using std::string; -#define MAX_SYS_FILES 10 +#define MAX_SYS_FILES 11 const char* k_traceTagsProperty = "debug.atrace.tags.enableflags"; const char* k_userInitiatedTraceProperty = "debug.atrace.user_initiated"; @@ -133,7 +133,11 @@ static const TracingCategory k_categories[] = { { OPT, "events/sched/sched_blocked_reason/enable" }, { OPT, "events/sched/sched_cpu_hotplug/enable" }, { OPT, "events/sched/sched_pi_setprio/enable" }, + { OPT, "events/sched/sched_process_exit/enable" }, { OPT, "events/cgroup/enable" }, + { OPT, "events/oom/oom_score_adj_update/enable" }, + { OPT, "events/task/task_rename/enable" }, + { OPT, "events/task/task_newtask/enable" }, } }, { "irq", "IRQ Events", 0, { { REQ, "events/irq/enable" }, @@ -231,10 +235,6 @@ static const TracingCategory k_categories[] = { { OPT, "events/kmem/rss_stat/enable" }, { OPT, "events/kmem/ion_heap_grow/enable" }, { OPT, "events/kmem/ion_heap_shrink/enable" }, - { OPT, "events/oom/oom_score_adj_update/enable" }, - { OPT, "events/sched/sched_process_exit/enable" }, - { OPT, "events/task/task_rename/enable" }, - { OPT, "events/task/task_newtask/enable" }, } }, }; diff --git a/cmds/atrace/atrace.rc b/cmds/atrace/atrace.rc index 7c58a85832..032d0726e0 100644 --- a/cmds/atrace/atrace.rc +++ b/cmds/atrace/atrace.rc @@ -33,6 +33,8 @@ on late-init chmod 0666 /sys/kernel/tracing/events/sched/sched_cpu_hotplug/enable chmod 0666 /sys/kernel/debug/tracing/events/sched/sched_pi_setprio/enable chmod 0666 /sys/kernel/tracing/events/sched/sched_pi_setprio/enable + chmod 0666 /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable + chmod 0666 /sys/kernel/tracing/events/sched/sched_process_exit/enable chmod 0666 /sys/kernel/debug/tracing/events/sched/sched_waking/enable chmod 0666 /sys/kernel/tracing/events/sched/sched_waking/enable chmod 0666 /sys/kernel/debug/tracing/events/cgroup/enable diff --git a/headers/media_plugin/media/drm/DrmAPI.h b/headers/media_plugin/media/drm/DrmAPI.h index 59bd292255..17b9993fa6 100644 --- a/headers/media_plugin/media/drm/DrmAPI.h +++ b/headers/media_plugin/media/drm/DrmAPI.h @@ -115,7 +115,8 @@ namespace android { kKeyStatusType_Expired, kKeyStatusType_OutputNotAllowed, kKeyStatusType_StatusPending, - kKeyStatusType_InternalError + kKeyStatusType_InternalError, + kKeyStatusType_UsableInFuture }; // Used by sendKeysChange to report the usability status of each diff --git a/libs/binder/aidl/android/content/pm/IPackageManagerNative.aidl b/libs/binder/aidl/android/content/pm/IPackageManagerNative.aidl index 70ed80df85..90980b8e62 100644 --- a/libs/binder/aidl/android/content/pm/IPackageManagerNative.aidl +++ b/libs/binder/aidl/android/content/pm/IPackageManagerNative.aidl @@ -74,4 +74,11 @@ interface IPackageManagerNative { * LOCATION_PRODUCT: getApplicationInfo(packageName).isProduct() */ int getLocationFlags(in @utf8InCpp String packageName); + + /** + * Returns the target SDK version for the given package. + * Unknown packages will cause the call to fail. The caller must check the + * returned Status before using the result of this function. + */ + int getTargetSdkVersionForPackage(in String packageName); } diff --git a/libs/graphicsenv/GpuStatsInfo.cpp b/libs/graphicsenv/GpuStatsInfo.cpp index 0fa0d9e32c..f89b4c16f2 100644 --- a/libs/graphicsenv/GpuStatsInfo.cpp +++ b/libs/graphicsenv/GpuStatsInfo.cpp @@ -34,6 +34,9 @@ status_t GpuStatsGlobalInfo::writeToParcel(Parcel* parcel) const { if ((status = parcel->writeInt32(glLoadingFailureCount)) != OK) return status; if ((status = parcel->writeInt32(vkLoadingCount)) != OK) return status; if ((status = parcel->writeInt32(vkLoadingFailureCount)) != OK) return status; + if ((status = parcel->writeInt32(vulkanVersion)) != OK) return status; + if ((status = parcel->writeInt32(cpuVulkanVersion)) != OK) return status; + if ((status = parcel->writeInt32(glesVersion)) != OK) return status; return OK; } @@ -47,6 +50,9 @@ status_t GpuStatsGlobalInfo::readFromParcel(const Parcel* parcel) { if ((status = parcel->readInt32(&glLoadingFailureCount)) != OK) return status; if ((status = parcel->readInt32(&vkLoadingCount)) != OK) return status; if ((status = parcel->readInt32(&vkLoadingFailureCount)) != OK) return status; + if ((status = parcel->readInt32(&vulkanVersion)) != OK) return status; + if ((status = parcel->readInt32(&cpuVulkanVersion)) != OK) return status; + if ((status = parcel->readInt32(&glesVersion)) != OK) return status; return OK; } @@ -60,6 +66,9 @@ std::string GpuStatsGlobalInfo::toString() const { StringAppendF(&result, "glLoadingFailureCount = %d\n", glLoadingFailureCount); StringAppendF(&result, "vkLoadingCount = %d\n", vkLoadingCount); StringAppendF(&result, "vkLoadingFailureCount = %d\n", vkLoadingFailureCount); + StringAppendF(&result, "vulkanVersion = %d\n", vulkanVersion); + StringAppendF(&result, "cpuVulkanVersion = %d\n", cpuVulkanVersion); + StringAppendF(&result, "glesVersion = %d\n", glesVersion); return result; } diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp index 13c0d876c0..8728f03f0c 100644 --- a/libs/graphicsenv/GraphicsEnv.cpp +++ b/libs/graphicsenv/GraphicsEnv.cpp @@ -162,7 +162,8 @@ void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string path, void GraphicsEnv::setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, - int64_t driverBuildTime, const std::string& appPackageName) { + int64_t driverBuildTime, const std::string& appPackageName, + const int vulkanVersion) { ATRACE_CALL(); std::lock_guard<std::mutex> lock(mStatsLock); @@ -171,15 +172,17 @@ void GraphicsEnv::setGpuStats(const std::string& driverPackageName, "\tdriverVersionName[%s]\n" "\tdriverVersionCode[%" PRIu64 "]\n" "\tdriverBuildTime[%" PRId64 "]\n" - "\tappPackageName[%s]\n", + "\tappPackageName[%s]\n" + "\tvulkanVersion[%d]\n", driverPackageName.c_str(), driverVersionName.c_str(), driverVersionCode, driverBuildTime, - appPackageName.c_str()); + appPackageName.c_str(), vulkanVersion); mGpuStats.driverPackageName = driverPackageName; mGpuStats.driverVersionName = driverVersionName; mGpuStats.driverVersionCode = driverVersionCode; mGpuStats.driverBuildTime = driverBuildTime; mGpuStats.appPackageName = appPackageName; + mGpuStats.vulkanVersion = vulkanVersion; } void GraphicsEnv::setDriverToLoad(GraphicsEnv::Driver driver) { @@ -270,19 +273,20 @@ void GraphicsEnv::sendGpuStatsLocked(GraphicsEnv::Driver driver, bool isDriverLo "\tdriverVersionCode[%" PRIu64 "]\n" "\tdriverBuildTime[%" PRId64 "]\n" "\tappPackageName[%s]\n" + "\tvulkanVersion[%d]\n" "\tdriver[%d]\n" "\tisDriverLoaded[%d]\n" "\tdriverLoadingTime[%" PRId64 "]", mGpuStats.driverPackageName.c_str(), mGpuStats.driverVersionName.c_str(), mGpuStats.driverVersionCode, mGpuStats.driverBuildTime, mGpuStats.appPackageName.c_str(), - static_cast<int32_t>(driver), isDriverLoaded, driverLoadingTime); + mGpuStats.vulkanVersion, static_cast<int32_t>(driver), isDriverLoaded, driverLoadingTime); const sp<IGpuService> gpuService = getGpuService(); if (gpuService) { gpuService->setGpuStats(mGpuStats.driverPackageName, mGpuStats.driverVersionName, mGpuStats.driverVersionCode, mGpuStats.driverBuildTime, - mGpuStats.appPackageName, driver, isDriverLoaded, - driverLoadingTime); + mGpuStats.appPackageName, mGpuStats.vulkanVersion, driver, + isDriverLoaded, driverLoadingTime); } } diff --git a/libs/graphicsenv/IGpuService.cpp b/libs/graphicsenv/IGpuService.cpp index 1dc1c0e4e9..100dca598b 100644 --- a/libs/graphicsenv/IGpuService.cpp +++ b/libs/graphicsenv/IGpuService.cpp @@ -30,8 +30,8 @@ public: virtual void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, const std::string& appPackageName, - GraphicsEnv::Driver driver, bool isDriverLoaded, - int64_t driverLoadingTime) { + const int32_t vulkanVersion, GraphicsEnv::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime) { Parcel data, reply; data.writeInterfaceToken(IGpuService::getInterfaceDescriptor()); @@ -40,6 +40,7 @@ public: data.writeUint64(driverVersionCode); data.writeInt64(driverBuildTime); data.writeUtf8AsUtf16(appPackageName); + data.writeInt32(vulkanVersion); data.writeInt32(static_cast<int32_t>(driver)); data.writeBool(isDriverLoaded); data.writeInt64(driverLoadingTime); @@ -118,6 +119,9 @@ status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* rep std::string appPackageName; if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status; + int32_t vulkanVersion; + if ((status = data.readInt32(&vulkanVersion)) != OK) return status; + int32_t driver; if ((status = data.readInt32(&driver)) != OK) return status; @@ -128,8 +132,8 @@ status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* rep if ((status = data.readInt64(&driverLoadingTime)) != OK) return status; setGpuStats(driverPackageName, driverVersionName, driverVersionCode, driverBuildTime, - appPackageName, static_cast<GraphicsEnv::Driver>(driver), isDriverLoaded, - driverLoadingTime); + appPackageName, vulkanVersion, static_cast<GraphicsEnv::Driver>(driver), + isDriverLoaded, driverLoadingTime); return OK; } diff --git a/libs/graphicsenv/include/graphicsenv/GpuStatsInfo.h b/libs/graphicsenv/include/graphicsenv/GpuStatsInfo.h index a92ca70493..98ab02b3e9 100644 --- a/libs/graphicsenv/include/graphicsenv/GpuStatsInfo.h +++ b/libs/graphicsenv/include/graphicsenv/GpuStatsInfo.h @@ -44,6 +44,9 @@ public: int32_t glLoadingFailureCount = 0; int32_t vkLoadingCount = 0; int32_t vkLoadingFailureCount = 0; + int32_t vulkanVersion = 0; + int32_t cpuVulkanVersion = 0; + int32_t glesVersion = 0; }; /* diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h index cb4239f775..b10cab7e3f 100644 --- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h +++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h @@ -50,6 +50,7 @@ private: uint64_t driverVersionCode; int64_t driverBuildTime; std::string appPackageName; + int32_t vulkanVersion; Driver glDriverToLoad; Driver glDriverFallback; Driver vkDriverToLoad; @@ -61,6 +62,7 @@ private: driverVersionCode(0), driverBuildTime(0), appPackageName(""), + vulkanVersion(0), glDriverToLoad(Driver::NONE), glDriverFallback(Driver::NONE), vkDriverToLoad(Driver::NONE), @@ -84,7 +86,7 @@ public: android_namespace_t* getDriverNamespace(); void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t versionCode, int64_t driverBuildTime, - const std::string& appPackageName); + const std::string& appPackageName, const int32_t vulkanVersion); void setDriverToLoad(Driver driver); void setDriverLoaded(Api api, bool isDriverLoaded, int64_t driverLoadingTime); void clearDriverLoadingInfo(Api api); diff --git a/libs/graphicsenv/include/graphicsenv/IGpuService.h b/libs/graphicsenv/include/graphicsenv/IGpuService.h index ac022b5d65..5bf0269430 100644 --- a/libs/graphicsenv/include/graphicsenv/IGpuService.h +++ b/libs/graphicsenv/include/graphicsenv/IGpuService.h @@ -37,8 +37,8 @@ public: virtual void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, const std::string& appPackageName, - GraphicsEnv::Driver driver, bool isDriverLoaded, - int64_t driverLoadingTime) = 0; + const int32_t vulkanVersion, GraphicsEnv::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime) = 0; // get GPU global stats from GpuStats module. virtual status_t getGpuStatsGlobalInfo(std::vector<GpuStatsGlobalInfo>* outStats) const = 0; diff --git a/libs/gui/Android.bp b/libs/gui/Android.bp index f435d98756..34575f5d47 100644 --- a/libs/gui/Android.bp +++ b/libs/gui/Android.bp @@ -25,50 +25,19 @@ cc_library_shared { }, double_loadable: true, - clang: true, - cflags: [ - "-Wall", - "-Werror", - ], - cppflags: [ - "-Wextra", - "-DDEBUG_ONLY_CODE=0", - ], - - product_variables: { - eng: { - cppflags: [ - "-UDEBUG_ONLY_CODE", - "-DDEBUG_ONLY_CODE=1", - ], - }, - }, + defaults: ["libgui_bufferqueue-defaults"], srcs: [ "BitTube.cpp", "BufferHubConsumer.cpp", "BufferHubProducer.cpp", - "BufferItem.cpp", "BufferItemConsumer.cpp", - "BufferQueue.cpp", - "BufferQueueConsumer.cpp", - "BufferQueueCore.cpp", - "BufferQueueProducer.cpp", - "BufferQueueThreadState.cpp", - "BufferSlot.cpp", "ConsumerBase.cpp", "CpuConsumer.cpp", "DisplayEventReceiver.cpp", - "FrameTimestamps.cpp", "GLConsumer.cpp", - "GLConsumerUtils.cpp", "GuiConfig.cpp", - "HdrMetadata.cpp", "IDisplayEventConnection.cpp", - "IConsumerListener.cpp", - "IGraphicBufferConsumer.cpp", - "IGraphicBufferProducer.cpp", - "IProducerListener.cpp", "IRegionSamplingListener.cpp", "ISurfaceComposer.cpp", "ISurfaceComposerClient.cpp", @@ -76,50 +45,20 @@ cc_library_shared { "LayerDebugInfo.cpp", "LayerMetadata.cpp", "LayerState.cpp", - "OccupancyTracker.cpp", "StreamSplitter.cpp", "Surface.cpp", "SurfaceControl.cpp", "SurfaceComposerClient.cpp", "SyncFeatures.cpp", "view/Surface.cpp", - "bufferqueue/1.0/B2HProducerListener.cpp", - "bufferqueue/1.0/Conversion.cpp", - "bufferqueue/1.0/H2BGraphicBufferProducer.cpp", - "bufferqueue/1.0/H2BProducerListener.cpp", - "bufferqueue/1.0/WProducerListener.cpp", - "bufferqueue/2.0/B2HGraphicBufferProducer.cpp", - "bufferqueue/2.0/B2HProducerListener.cpp", - "bufferqueue/2.0/H2BGraphicBufferProducer.cpp", - "bufferqueue/2.0/H2BProducerListener.cpp", - "bufferqueue/2.0/types.cpp", ], shared_libs: [ "android.frameworks.bufferhub@1.0", - "android.hardware.graphics.bufferqueue@1.0", - "android.hardware.graphics.bufferqueue@2.0", - "android.hardware.graphics.common@1.1", - "android.hardware.graphics.common@1.2", - "android.hidl.token@1.0-utils", - "libbase", - "libbinder", "libbufferhub", "libbufferhubqueue", // TODO(b/70046255): Remove this once BufferHub is integrated into libgui. - "libcutils", - "libEGL", - "libGLESv2", - "libhidlbase", - "libhidltransport", - "libhwbinder", "libinput", - "liblog", - "libnativewindow", "libpdx_default_transport", - "libsync", - "libui", - "libutils", - "libvndksupport", ], // bufferhub is not used when building libgui for vendors @@ -145,43 +84,31 @@ cc_library_shared { header_libs: [ "libdvr_headers", - "libgui_headers", - "libnativebase_headers", "libpdx_headers", ], - - export_shared_lib_headers: [ - "libbinder", - "libEGL", - "libnativewindow", - "libui", - "android.hardware.graphics.bufferqueue@1.0", - "android.hardware.graphics.bufferqueue@2.0", - "android.hardware.graphics.common@1.1", - "android.hardware.graphics.common@1.2", - "android.hidl.token@1.0-utils", - ], - - export_header_lib_headers: [ - "libgui_headers", - ], - - export_include_dirs: [ - "include", - ], } // Used by media codec services exclusively as a static lib for -// core bufferqueuesupport only. +// core bufferqueue support only. cc_library_static { name: "libgui_bufferqueue_static", vendor_available: true, + cflags: [ + "-DNO_BUFFERHUB", + ], + + defaults: ["libgui_bufferqueue-defaults"], +} + +// Common build config shared by libgui and libgui_bufferqueue_static. +cc_defaults { + name: "libgui_bufferqueue-defaults", + clang: true, cflags: [ "-Wall", "-Werror", - "-DNO_BUFFERHUB", ], cppflags: [ diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp index d87228fbbd..5fb3f0b80f 100644 --- a/libs/gui/BufferQueue.cpp +++ b/libs/gui/BufferQueue.cpp @@ -59,13 +59,6 @@ void BufferQueue::ProxyConsumerListener::onFrameReplaced( } } -void BufferQueue::ProxyConsumerListener::onBufferAllocated(const BufferItem& item) { - sp<ConsumerListener> listener(mConsumerListener.promote()); - if (listener != nullptr) { - listener->onBufferAllocated(item); - } -} - void BufferQueue::ProxyConsumerListener::onBuffersReleased() { sp<ConsumerListener> listener(mConsumerListener.promote()); if (listener != nullptr) { diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index c94c6b31c6..3928bb9e40 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -539,13 +539,6 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* ou return NO_INIT; } - if (mCore->mConsumerListener != nullptr) { - BufferItem item; - item.mGraphicBuffer = graphicBuffer; - item.mSlot = *outSlot; - mCore->mConsumerListener->onBufferAllocated(item); - } - VALIDATE_CONSISTENCY(); } // Autolock scope } @@ -975,9 +968,6 @@ status_t BufferQueueProducer::queueBuffer(int slot, item.mGraphicBuffer.clear(); } - // Don't send the slot number through the callback since the consumer shouldn't need it - item.mSlot = BufferItem::INVALID_BUFFER_SLOT; - // Call back without the main BufferQueue lock held, but with the callback // lock held so we can ensure that callbacks occur in order @@ -1433,13 +1423,6 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height, BQ_LOGV("allocateBuffers: allocated a new buffer in slot %d", *slot); - if (mCore->mConsumerListener != nullptr) { - BufferItem item; - item.mGraphicBuffer = buffers[i]; - item.mSlot = *slot; - mCore->mConsumerListener->onBufferAllocated(item); - } - // Make sure the erase is done after all uses of the slot // iterator since it will be invalid after this point. mCore->mFreeSlots.erase(slot); diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index 1e94cc13cd..abd9921fa9 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -131,8 +131,6 @@ void ConsumerBase::onFrameReplaced(const BufferItem &item) { } } -void ConsumerBase::onBufferAllocated(const BufferItem& /*item*/) {} - void ConsumerBase::onBuffersReleased() { Mutex::Autolock lock(mMutex); diff --git a/libs/gui/IConsumerListener.cpp b/libs/gui/IConsumerListener.cpp index ea9045cad9..85ac304ab8 100644 --- a/libs/gui/IConsumerListener.cpp +++ b/libs/gui/IConsumerListener.cpp @@ -28,8 +28,7 @@ enum class Tag : uint32_t { ON_FRAME_REPLACED, ON_BUFFERS_RELEASED, ON_SIDEBAND_STREAM_CHANGED, - ON_BUFFER_ALLOCATED, - LAST = ON_BUFFER_ALLOCATED, + LAST = ON_SIDEBAND_STREAM_CHANGED, }; } // Anonymous namespace @@ -55,11 +54,6 @@ public: item); } - void onBufferAllocated(const BufferItem& item) override { - callRemoteAsync<decltype(&IConsumerListener::onBufferAllocated)>(Tag::ON_BUFFER_ALLOCATED, - item); - } - void onBuffersReleased() override { callRemoteAsync<decltype(&IConsumerListener::onBuffersReleased)>(Tag::ON_BUFFERS_RELEASED); } @@ -95,8 +89,6 @@ status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parce return callLocalAsync(data, reply, &IConsumerListener::onFrameAvailable); case Tag::ON_FRAME_REPLACED: return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced); - case Tag::ON_BUFFER_ALLOCATED: - return callLocalAsync(data, reply, &IConsumerListener::onBufferAllocated); case Tag::ON_BUFFERS_RELEASED: return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased); case Tag::ON_SIDEBAND_STREAM_CHANGED: diff --git a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp index e64ba9bcdd..cee1b811a4 100644 --- a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp @@ -1061,7 +1061,7 @@ status_t H2BGraphicBufferProducer::detachNextBuffer( status_t H2BGraphicBufferProducer::attachBuffer( int* outSlot, const sp<GraphicBuffer>& buffer) { - AnwBuffer tBuffer; + AnwBuffer tBuffer{}; wrapAs(&tBuffer, *buffer); status_t fnStatus; status_t transStatus = toStatusT(mBase->attachBuffer(tBuffer, @@ -1076,7 +1076,7 @@ status_t H2BGraphicBufferProducer::queueBuffer( int slot, const QueueBufferInput& input, QueueBufferOutput* output) { - HGraphicBufferProducer::QueueBufferInput tInput; + HGraphicBufferProducer::QueueBufferInput tInput{}; native_handle_t* nh; if (!wrapAs(&tInput, &nh, input)) { ALOGE("H2BGraphicBufferProducer::queueBuffer - " diff --git a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp index e0395939e9..e891ec581e 100644 --- a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp @@ -15,7 +15,7 @@ */ //#define LOG_NDEBUG 0 -#define LOG_TAG "H2BGraphicBufferProducer@2.0" +#define LOG_TAG "B2HGraphicBufferProducer@2.0" #include <android-base/logging.h> @@ -30,13 +30,38 @@ #include <vndk/hardware_buffer.h> namespace android { - namespace hardware { namespace graphics { namespace bufferqueue { namespace V2_0 { namespace utils { +namespace /* unnamed */ { + +using BQueueBufferInput = ::android:: + IGraphicBufferProducer::QueueBufferInput; +using HQueueBufferInput = ::android::hardware::graphics::bufferqueue::V2_0:: + IGraphicBufferProducer::QueueBufferInput; +using BQueueBufferOutput = ::android:: + IGraphicBufferProducer::QueueBufferOutput; +using HQueueBufferOutput = ::android::hardware::graphics::bufferqueue::V2_0:: + IGraphicBufferProducer::QueueBufferOutput; + +using ::android::hardware::graphics::bufferqueue::V2_0::utils::b2h; +using ::android::hardware::graphics::bufferqueue::V2_0::utils::h2b; + +bool b2h(BQueueBufferOutput const& from, HQueueBufferOutput* to) { + to->width = from.width; + to->height = from.height; + to->transformHint = static_cast<int32_t>(from.transformHint); + to->numPendingBuffers = from.numPendingBuffers; + to->nextFrameNumber = from.nextFrameNumber; + to->bufferReplaced = from.bufferReplaced; + return true; +} + +} // unnamed namespace + // B2HGraphicBufferProducer // ======================== @@ -161,11 +186,7 @@ Return<void> B2HGraphicBufferProducer::queueBuffer( int32_t slot, QueueBufferInput const& hInput, queueBuffer_cb _hidl_cb) { - using HOutput = QueueBufferOutput; - using BInput = BGraphicBufferProducer::QueueBufferInput; - using BOutput = BGraphicBufferProducer::QueueBufferOutput; - - BInput bInput{ + BQueueBufferInput bInput{ hInput.timestamp, hInput.isAutoTimestamp, static_cast<android_dataspace>(hInput.dataSpace), @@ -178,35 +199,32 @@ Return<void> B2HGraphicBufferProducer::queueBuffer( // Convert crop. if (!h2b(hInput.crop, &bInput.crop)) { - _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{}); + _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{}); return {}; } // Convert surfaceDamage. if (!h2b(hInput.surfaceDamage, &bInput.surfaceDamage)) { - _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{}); + _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{}); return {}; } // Convert fence. if (!h2b(hInput.fence, &bInput.fence)) { - _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{}); + _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{}); return {}; } - BOutput bOutput{}; + BQueueBufferOutput bOutput{}; HStatus hStatus{}; - bool converted = b2h( - mBase->queueBuffer(static_cast<int>(slot), bInput, &bOutput), - &hStatus); + QueueBufferOutput hOutput{}; + bool converted = + b2h( + mBase->queueBuffer(static_cast<int>(slot), bInput, &bOutput), + &hStatus) && + b2h(bOutput, &hOutput); - _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, - HOutput{bOutput.width, - bOutput.height, - static_cast<int32_t>(bOutput.transformHint), - bOutput.numPendingBuffers, - bOutput.nextFrameNumber, - bOutput.bufferReplaced}); + _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, hOutput); return {}; } @@ -236,33 +254,23 @@ Return<void> B2HGraphicBufferProducer::connect( HConnectionType hConnectionType, bool producerControlledByApp, connect_cb _hidl_cb) { - using BOutput = BGraphicBufferProducer::QueueBufferOutput; - using HOutput = HGraphicBufferProducer::QueueBufferOutput; sp<BProducerListener> bListener = new H2BProducerListener(hListener); - if (!bListener) { - _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{}); + int bConnectionType{}; + if (!bListener || !h2b(hConnectionType, &bConnectionType)) { + _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{}); return {}; } - int bConnectionType; - if (!h2b(hConnectionType, &bConnectionType)) { - _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{}); - return {}; - } - BOutput bOutput{}; + BQueueBufferOutput bOutput{}; HStatus hStatus{}; - bool converted = b2h( - mBase->connect(bListener, - bConnectionType, - producerControlledByApp, - &bOutput), - &hStatus); - _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, - HOutput{bOutput.width, - bOutput.height, - static_cast<int32_t>(bOutput.transformHint), - bOutput.numPendingBuffers, - bOutput.nextFrameNumber, - bOutput.bufferReplaced}); + QueueBufferOutput hOutput{}; + bool converted = + b2h(mBase->connect(bListener, + bConnectionType, + producerControlledByApp, + &bOutput), + &hStatus) && + b2h(bOutput, &hOutput); + _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, hOutput); return {}; } diff --git a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp index 1023ef108a..2f5b73ccbb 100644 --- a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp +++ b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp @@ -29,13 +29,54 @@ #include <vndk/hardware_buffer.h> namespace android { - namespace hardware { namespace graphics { namespace bufferqueue { namespace V2_0 { namespace utils { +namespace /* unnamed */ { + +using BQueueBufferInput = ::android:: + IGraphicBufferProducer::QueueBufferInput; +using HQueueBufferInput = ::android::hardware::graphics::bufferqueue::V2_0:: + IGraphicBufferProducer::QueueBufferInput; +using BQueueBufferOutput = ::android:: + IGraphicBufferProducer::QueueBufferOutput; +using HQueueBufferOutput = ::android::hardware::graphics::bufferqueue::V2_0:: + IGraphicBufferProducer::QueueBufferOutput; + +using ::android::hardware::graphics::bufferqueue::V2_0::utils::b2h; +using ::android::hardware::graphics::bufferqueue::V2_0::utils::h2b; + +bool b2h(BQueueBufferInput const& from, HQueueBufferInput* to, + HFenceWrapper* hFenceWrapper) { + to->timestamp = from.timestamp; + to->isAutoTimestamp = static_cast<bool>(from.isAutoTimestamp); + to->dataSpace = static_cast<int32_t>(from.dataSpace); + to->transform = static_cast<int32_t>(from.transform); + to->stickyTransform = static_cast<int32_t>(from.stickyTransform); + if (!b2h(from.crop, &to->crop) || + !b2h(from.surfaceDamage, &to->surfaceDamage) || + !b2h(from.fence, hFenceWrapper)) { + return false; + } + to->fence = hFenceWrapper->getHandle(); + return true; +} + +bool h2b(HQueueBufferOutput const& from, BQueueBufferOutput* to) { + to->width = from.width; + to->height = from.height; + to->transformHint = static_cast<uint32_t>(from.transformHint); + to->numPendingBuffers = from.numPendingBuffers; + to->nextFrameNumber = from.nextFrameNumber; + to->bufferReplaced = from.bufferReplaced; + return true; +} + +} // unnamed namespace + // H2BGraphicBufferProducer // ======================== @@ -209,47 +250,13 @@ status_t H2BGraphicBufferProducer::queueBuffer( int slot, QueueBufferInput const& input, QueueBufferOutput* output) { - HRect hCrop{}; - (void)b2h(input.crop, &hCrop); - - using HInput = HGraphicBufferProducer::QueueBufferInput; - HInput hInput{ - input.timestamp, - static_cast<bool>(input.isAutoTimestamp), - static_cast<int32_t>(input.dataSpace), - {}, // crop - static_cast<int32_t>(input.transform), - static_cast<int32_t>(input.stickyTransform), - {}, // fence - {} // surfaceDamage - }; - - // Convert crop. - if (!b2h(input.crop, &hInput.crop)) { - LOG(ERROR) << "queueBuffer: corrupted input crop rectangle."; - return UNKNOWN_ERROR; - } - - // Convert surfaceDamage. - size_t numRects; - Rect const* rectArray = input.surfaceDamage.getArray(&numRects); - hInput.surfaceDamage.resize(numRects); - for (size_t i = 0; i < numRects; ++i) { - if (!b2h(rectArray[i], &hInput.surfaceDamage[i])) { - LOG(ERROR) << "queueBuffer: corrupted input surface damage."; - return UNKNOWN_ERROR; - } - } - - // Convert fence. + HQueueBufferInput hInput{}; HFenceWrapper hFenceWrapper; - if (!b2h(input.fence, &hFenceWrapper)) { - LOG(ERROR) << "queueBuffer: corrupted input fence."; + if (!b2h(input, &hInput, &hFenceWrapper)) { + LOG(ERROR) << "queueBuffer: corrupted input."; return UNKNOWN_ERROR; } - hInput.fence = hFenceWrapper.getHandle(); - using HOutput = HGraphicBufferProducer::QueueBufferOutput; bool converted{}; status_t bStatus{}; Return<void> transResult = mBase->queueBuffer( @@ -257,15 +264,8 @@ status_t H2BGraphicBufferProducer::queueBuffer( hInput, [&converted, &bStatus, output]( HStatus hStatus, - HOutput const& hOutput) { - converted = h2b(hStatus, &bStatus); - output->width = hOutput.width; - output->height = hOutput.height; - output->transformHint = - static_cast<uint32_t>(hOutput.transformHint); - output->numPendingBuffers = hOutput.numPendingBuffers; - output->nextFrameNumber = hOutput.nextFrameNumber; - output->bufferReplaced = hOutput.bufferReplaced; + HQueueBufferOutput const& hOutput) { + converted = h2b(hStatus, &bStatus) && h2b(hOutput, output); }); if (!transResult.isOk()) { @@ -332,7 +332,6 @@ status_t H2BGraphicBufferProducer::connect( } } - using HOutput = HGraphicBufferProducer::QueueBufferOutput; bool converted{}; status_t bStatus{}; Return<void> transResult = mBase->connect( @@ -341,15 +340,8 @@ status_t H2BGraphicBufferProducer::connect( producerControlledByApp, [&converted, &bStatus, output]( HStatus hStatus, - HOutput hOutput) { - converted = h2b(hStatus, &bStatus); - output->width = hOutput.width; - output->height = hOutput.height; - output->transformHint = - static_cast<uint32_t>(hOutput.transformHint); - output->numPendingBuffers = hOutput.numPendingBuffers; - output->nextFrameNumber = hOutput.nextFrameNumber; - output->bufferReplaced = hOutput.bufferReplaced; + HQueueBufferOutput const& hOutput) { + converted = h2b(hStatus, &bStatus) && h2b(hOutput, output); }); if (!transResult.isOk()) { LOG(ERROR) << "connect: transaction failed."; diff --git a/libs/gui/include/gui/BufferQueue.h b/libs/gui/include/gui/BufferQueue.h index 721427be7b..da952744f3 100644 --- a/libs/gui/include/gui/BufferQueue.h +++ b/libs/gui/include/gui/BufferQueue.h @@ -61,7 +61,6 @@ public: void onDisconnect() override; void onFrameAvailable(const BufferItem& item) override; void onFrameReplaced(const BufferItem& item) override; - void onBufferAllocated(const BufferItem& item) override; void onBuffersReleased() override; void onSidebandStreamChanged() override; void addAndGetFrameTimestamps( diff --git a/libs/gui/include/gui/ConsumerBase.h b/libs/gui/include/gui/ConsumerBase.h index 7c26482509..366ced380b 100644 --- a/libs/gui/include/gui/ConsumerBase.h +++ b/libs/gui/include/gui/ConsumerBase.h @@ -141,7 +141,6 @@ protected: // classes if they want the notification. virtual void onFrameAvailable(const BufferItem& item) override; virtual void onFrameReplaced(const BufferItem& item) override; - virtual void onBufferAllocated(const BufferItem& item) override; virtual void onBuffersReleased() override; virtual void onSidebandStreamChanged() override; diff --git a/libs/gui/include/gui/IConsumerListener.h b/libs/gui/include/gui/IConsumerListener.h index 03fefbe90c..c0828820e3 100644 --- a/libs/gui/include/gui/IConsumerListener.h +++ b/libs/gui/include/gui/IConsumerListener.h @@ -61,13 +61,6 @@ public: // This is called without any lock held and can be called concurrently by multiple threads. virtual void onFrameReplaced(const BufferItem& /* item */) {} /* Asynchronous */ - // onBufferAllocated is called to notify the buffer consumer that the BufferQueue has allocated - // a GraphicBuffer for a particular slot. Only the GraphicBuffer pointer and the slot ID will - // be populated. - // - // This is called without any lock held and can be called concurrently by multiple threads. - virtual void onBufferAllocated(const BufferItem& /* item */) {} /* Asynchronous */ - // onBuffersReleased is called to notify the buffer consumer that the BufferQueue has released // its references to one or more GraphicBuffers contained in its slots. The buffer consumer // should then call BufferQueue::getReleasedBuffers to retrieve the list of buffers. diff --git a/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h b/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h index 0e57f208f8..029dcc047f 100644 --- a/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h +++ b/libs/gui/include/gui/bufferqueue/1.0/WGraphicBufferProducer.h @@ -68,7 +68,7 @@ struct TWGraphicBufferProducer : public BASE { Return<void> requestBuffer(int32_t slot, HGraphicBufferProducer::requestBuffer_cb _hidl_cb) override { sp<GraphicBuffer> buf; status_t status = mBase->requestBuffer(slot, &buf); - AnwBuffer anwBuffer; + AnwBuffer anwBuffer{}; if (buf != nullptr) { ::android::conversion::wrapAs(&anwBuffer, *buf); } @@ -89,15 +89,15 @@ struct TWGraphicBufferProducer : public BASE { uint32_t width, uint32_t height, ::android::hardware::graphics::common::V1_0::PixelFormat format, uint32_t usage, bool getFrameTimestamps, HGraphicBufferProducer::dequeueBuffer_cb _hidl_cb) override { - int slot; + int slot{}; sp<Fence> fence; ::android::FrameEventHistoryDelta outTimestamps; status_t status = mBase->dequeueBuffer( &slot, &fence, width, height, static_cast<::android::PixelFormat>(format), usage, nullptr, getFrameTimestamps ? &outTimestamps : nullptr); - hidl_handle tFence; - HGraphicBufferProducer::FrameEventHistoryDelta tOutTimestamps; + hidl_handle tFence{}; + HGraphicBufferProducer::FrameEventHistoryDelta tOutTimestamps{}; native_handle_t* nh = nullptr; if ((fence == nullptr) || !::android::conversion::wrapAs(&tFence, &nh, *fence)) { @@ -144,8 +144,8 @@ struct TWGraphicBufferProducer : public BASE { sp<GraphicBuffer> outBuffer; sp<Fence> outFence; status_t status = mBase->detachNextBuffer(&outBuffer, &outFence); - AnwBuffer tBuffer; - hidl_handle tFence; + AnwBuffer tBuffer{}; + hidl_handle tFence{}; if (outBuffer == nullptr) { LOG(ERROR) << "TWGraphicBufferProducer::detachNextBuffer - " @@ -185,7 +185,7 @@ struct TWGraphicBufferProducer : public BASE { Return<void> queueBuffer( int32_t slot, const HGraphicBufferProducer::QueueBufferInput& input, HGraphicBufferProducer::queueBuffer_cb _hidl_cb) override { - HGraphicBufferProducer::QueueBufferOutput tOutput; + HGraphicBufferProducer::QueueBufferOutput tOutput{}; BGraphicBufferProducer::QueueBufferInput lInput( 0, false, HAL_DATASPACE_UNKNOWN, ::android::Rect(0, 0, 1, 1), @@ -246,7 +246,7 @@ struct TWGraphicBufferProducer : public BASE { producerControlledByApp, &lOutput); - HGraphicBufferProducer::QueueBufferOutput tOutput; + HGraphicBufferProducer::QueueBufferOutput tOutput{}; std::vector<std::vector<native_handle_t*> > nhAA; if (!::android::conversion::wrapAs(&tOutput, &nhAA, lOutput)) { LOG(ERROR) << "TWGraphicBufferProducer::connect - " @@ -320,11 +320,11 @@ struct TWGraphicBufferProducer : public BASE { status_t status = mBase->getLastQueuedBuffer( &lOutBuffer, &lOutFence, lOutTransformMatrix); - AnwBuffer tOutBuffer; + AnwBuffer tOutBuffer{}; if (lOutBuffer != nullptr) { ::android::conversion::wrapAs(&tOutBuffer, *lOutBuffer); } - hidl_handle tOutFence; + hidl_handle tOutFence{}; native_handle_t* nh = nullptr; if ((lOutFence == nullptr) || !::android::conversion::wrapAs(&tOutFence, &nh, *lOutFence)) { LOG(ERROR) << "TWGraphicBufferProducer::getLastQueuedBuffer - " @@ -346,7 +346,7 @@ struct TWGraphicBufferProducer : public BASE { ::android::FrameEventHistoryDelta lDelta; mBase->getFrameTimestamps(&lDelta); - HGraphicBufferProducer::FrameEventHistoryDelta tDelta; + HGraphicBufferProducer::FrameEventHistoryDelta tDelta{}; std::vector<std::vector<native_handle_t*> > nhAA; if (!::android::conversion::wrapAs(&tDelta, &nhAA, lDelta)) { LOG(ERROR) << "TWGraphicBufferProducer::getFrameTimestamps - " @@ -365,7 +365,7 @@ struct TWGraphicBufferProducer : public BASE { } Return<void> getUniqueId(HGraphicBufferProducer::getUniqueId_cb _hidl_cb) override { - uint64_t outId; + uint64_t outId{}; status_t status = mBase->getUniqueId(&outId); _hidl_cb(static_cast<int32_t>(status), outId); return Void(); diff --git a/libs/renderengine/gl/GLESRenderEngine.cpp b/libs/renderengine/gl/GLESRenderEngine.cpp index efe4bdfe28..46a8e9eecf 100644 --- a/libs/renderengine/gl/GLESRenderEngine.cpp +++ b/libs/renderengine/gl/GLESRenderEngine.cpp @@ -271,13 +271,6 @@ std::unique_ptr<GLESRenderEngine> GLESRenderEngine::create(int hwcFormat, uint32 extensions.initWithGLStrings(glGetString(GL_VENDOR), glGetString(GL_RENDERER), glGetString(GL_VERSION), glGetString(GL_EXTENSIONS)); - // In order to have protected contents in GPU composition, the OpenGL ES extension - // GL_EXT_protected_textures must be supported. If it's not supported, reset - // protected context to EGL_NO_CONTEXT to indicate that protected contents is not supported. - if (!extensions.hasProtectedTexture()) { - protectedContext = EGL_NO_CONTEXT; - } - EGLSurface protectedDummy = EGL_NO_SURFACE; if (protectedContext != EGL_NO_CONTEXT && !extensions.hasSurfacelessContext()) { protectedDummy = @@ -616,10 +609,6 @@ void GLESRenderEngine::bindExternalTextureImage(uint32_t texName, const Image& i const GLenum target = GL_TEXTURE_EXTERNAL_OES; glBindTexture(target, texName); - if (supportsProtectedContent()) { - glTexParameteri(target, GL_TEXTURE_PROTECTED_EXT, - glImage.isProtected() ? GL_TRUE : GL_FALSE); - } if (glImage.getEGLImage() != EGL_NO_IMAGE_KHR) { glEGLImageTargetTexture2DOES(target, static_cast<GLeglImageOES>(glImage.getEGLImage())); } @@ -799,10 +788,6 @@ status_t GLESRenderEngine::bindFrameBuffer(Framebuffer* framebuffer) { // Bind the texture and turn our EGLImage into a texture glBindTexture(GL_TEXTURE_2D, textureName); - if (supportsProtectedContent()) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_PROTECTED_EXT, - mInProtectedContext ? GL_TRUE : GL_FALSE); - } glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)eglImage); // Bind the Framebuffer to render into diff --git a/libs/sensor/Sensor.cpp b/libs/sensor/Sensor.cpp index d9a986ed00..139987e6a9 100644 --- a/libs/sensor/Sensor.cpp +++ b/libs/sensor/Sensor.cpp @@ -22,6 +22,13 @@ #include <binder/IPermissionController.h> #include <binder/IServiceManager.h> +/* + * The permission to use for activity recognition sensors (like step counter). + * See sensor types for more details on what sensors should require this + * permission. + */ +#define SENSOR_PERMISSION_ACTIVITY_RECOGNITION "android.permission.ACTIVITY_RECOGNITION" + // ---------------------------------------------------------------------------- namespace android { // ---------------------------------------------------------------------------- @@ -116,7 +123,7 @@ Sensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersi mStringType = SENSOR_STRING_TYPE_HEART_RATE; mRequiredPermission = SENSOR_PERMISSION_BODY_SENSORS; AppOpsManager appOps; - mRequiredAppOp = appOps.permissionToOpCode(String16(SENSOR_PERMISSION_BODY_SENSORS)); + mRequiredAppOp = appOps.permissionToOpCode(String16(mRequiredPermission)); mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; } break; case SENSOR_TYPE_LIGHT: @@ -165,14 +172,22 @@ Sensor::Sensor(struct sensor_t const& hwSensor, const uuid_t& uuid, int halVersi mFlags |= SENSOR_FLAG_WAKE_UP; } break; - case SENSOR_TYPE_STEP_COUNTER: + case SENSOR_TYPE_STEP_COUNTER: { mStringType = SENSOR_STRING_TYPE_STEP_COUNTER; + mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION; + AppOpsManager appOps; + mRequiredAppOp = + appOps.permissionToOpCode(String16(mRequiredPermission)); mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; - break; - case SENSOR_TYPE_STEP_DETECTOR: + } break; + case SENSOR_TYPE_STEP_DETECTOR: { mStringType = SENSOR_STRING_TYPE_STEP_DETECTOR; + mRequiredPermission = SENSOR_PERMISSION_ACTIVITY_RECOGNITION; + AppOpsManager appOps; + mRequiredAppOp = + appOps.permissionToOpCode(String16(mRequiredPermission)); mFlags |= SENSOR_FLAG_SPECIAL_REPORTING_MODE; - break; + } break; case SENSOR_TYPE_TEMPERATURE: mStringType = SENSOR_STRING_TYPE_TEMPERATURE; mFlags |= SENSOR_FLAG_ON_CHANGE_MODE; diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index 59fa1c0c33..b42884e139 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -51,12 +51,12 @@ GpuService::GpuService() : mGpuStats(std::make_unique<GpuStats>()){}; void GpuService::setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, const std::string& appPackageName, - GraphicsEnv::Driver driver, bool isDriverLoaded, - int64_t driverLoadingTime) { + const int32_t vulkanVersion, GraphicsEnv::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime) { ATRACE_CALL(); mGpuStats->insert(driverPackageName, driverVersionName, driverVersionCode, driverBuildTime, - appPackageName, driver, isDriverLoaded, driverLoadingTime); + appPackageName, vulkanVersion, driver, isDriverLoaded, driverLoadingTime); } status_t GpuService::getGpuStatsGlobalInfo(std::vector<GpuStatsGlobalInfo>* outStats) const { diff --git a/services/gpuservice/GpuService.h b/services/gpuservice/GpuService.h index 7a9b2d4dbf..3e02b4a073 100644 --- a/services/gpuservice/GpuService.h +++ b/services/gpuservice/GpuService.h @@ -45,8 +45,9 @@ private: */ void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, - const std::string& appPackageName, GraphicsEnv::Driver driver, - bool isDriverLoaded, int64_t driverLoadingTime) override; + const std::string& appPackageName, const int32_t vulkanVersion, + GraphicsEnv::Driver driver, bool isDriverLoaded, + int64_t driverLoadingTime) override; status_t getGpuStatsGlobalInfo(std::vector<GpuStatsGlobalInfo>* outStats) const override; status_t getGpuStatsAppInfo(std::vector<GpuStatsAppInfo>* outStats) const override; diff --git a/services/gpuservice/gpustats/GpuStats.cpp b/services/gpuservice/gpustats/GpuStats.cpp index 618530523a..5174c86171 100644 --- a/services/gpuservice/gpustats/GpuStats.cpp +++ b/services/gpuservice/gpustats/GpuStats.cpp @@ -19,11 +19,12 @@ #include "GpuStats.h" -#include <unordered_set> - +#include <cutils/properties.h> #include <log/log.h> #include <utils/Trace.h> +#include <unordered_set> + namespace android { static bool addLoadingCount(GraphicsEnv::Driver driver, bool isDriverLoaded, @@ -68,8 +69,8 @@ static void addLoadingTime(GraphicsEnv::Driver driver, int64_t driverLoadingTime void GpuStats::insert(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, - const std::string& appPackageName, GraphicsEnv::Driver driver, - bool isDriverLoaded, int64_t driverLoadingTime) { + const std::string& appPackageName, const int32_t vulkanVersion, + GraphicsEnv::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime) { ATRACE_CALL(); std::lock_guard<std::mutex> lock(mLock); @@ -79,11 +80,13 @@ void GpuStats::insert(const std::string& driverPackageName, const std::string& d "\tdriverVersionCode[%" PRIu64 "]\n" "\tdriverBuildTime[%" PRId64 "]\n" "\tappPackageName[%s]\n" + "\tvulkanVersion[%d]\n" "\tdriver[%d]\n" "\tisDriverLoaded[%d]\n" "\tdriverLoadingTime[%" PRId64 "]", driverPackageName.c_str(), driverVersionName.c_str(), driverVersionCode, driverBuildTime, - appPackageName.c_str(), static_cast<int32_t>(driver), isDriverLoaded, driverLoadingTime); + appPackageName.c_str(), vulkanVersion, static_cast<int32_t>(driver), isDriverLoaded, + driverLoadingTime); if (!mGlobalStats.count(driverVersionCode)) { GpuStatsGlobalInfo globalInfo; @@ -94,6 +97,7 @@ void GpuStats::insert(const std::string& driverPackageName, const std::string& d globalInfo.driverVersionName = driverVersionName; globalInfo.driverVersionCode = driverVersionCode; globalInfo.driverBuildTime = driverBuildTime; + globalInfo.vulkanVersion = vulkanVersion; mGlobalStats.insert({driverVersionCode, globalInfo}); } else if (!addLoadingCount(driver, isDriverLoaded, &mGlobalStats[driverVersionCode])) { return; @@ -117,6 +121,16 @@ void GpuStats::insert(const std::string& driverPackageName, const std::string& d addLoadingTime(driver, driverLoadingTime, &mAppStats[appStatsKey]); } +void GpuStats::interceptSystemDriverStatsLocked() { + // Append cpuVulkanVersion and glesVersion to system driver stats + if (!mGlobalStats.count(0) || mGlobalStats[0].glesVersion) { + return; + } + + mGlobalStats[0].cpuVulkanVersion = property_get_int32("ro.cpuvulkan.version", 0); + mGlobalStats[0].glesVersion = property_get_int32("ro.opengles.version", 0); +} + void GpuStats::dump(const Vector<String16>& args, std::string* result) { ATRACE_CALL(); @@ -173,6 +187,8 @@ void GpuStats::dump(const Vector<String16>& args, std::string* result) { } void GpuStats::dumpGlobalLocked(std::string* result) { + interceptSystemDriverStatsLocked(); + for (const auto& ele : mGlobalStats) { result->append(ele.second.toString()); result->append("\n"); @@ -193,6 +209,8 @@ void GpuStats::pullGlobalStats(std::vector<GpuStatsGlobalInfo>* outStats) { outStats->clear(); outStats->reserve(mGlobalStats.size()); + interceptSystemDriverStatsLocked(); + for (const auto& ele : mGlobalStats) { outStats->emplace_back(ele.second); } diff --git a/services/gpuservice/gpustats/GpuStats.h b/services/gpuservice/gpustats/GpuStats.h index d942154cbb..49699ee813 100644 --- a/services/gpuservice/gpustats/GpuStats.h +++ b/services/gpuservice/gpustats/GpuStats.h @@ -35,8 +35,8 @@ public: // Insert new gpu stats into global stats and app stats. void insert(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, int64_t driverBuildTime, - const std::string& appPackageName, GraphicsEnv::Driver driver, bool isDriverLoaded, - int64_t driverLoadingTime); + const std::string& appPackageName, const int32_t vulkanVersion, + GraphicsEnv::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime); // dumpsys interface void dump(const Vector<String16>& args, std::string* result); // Pull gpu global stats @@ -52,6 +52,8 @@ private: void dumpGlobalLocked(std::string* result); // Dump app stats void dumpAppLocked(std::string* result); + // Append cpuVulkanVersion and glesVersion to system driver stats + void interceptSystemDriverStatsLocked(); // Below limits the memory usage of GpuStats to be less than 10KB. This is // the preferred number for statsd while maintaining nice data quality. diff --git a/services/inputflinger/InputDispatcher.cpp b/services/inputflinger/InputDispatcher.cpp index b874411d91..31a2dab6c5 100644 --- a/services/inputflinger/InputDispatcher.cpp +++ b/services/inputflinger/InputDispatcher.cpp @@ -3611,8 +3611,9 @@ void InputDispatcher::logDispatchStateLocked() { } void InputDispatcher::dumpDispatchStateLocked(std::string& dump) { - dump += StringPrintf(INDENT "DispatchEnabled: %d\n", mDispatchEnabled); - dump += StringPrintf(INDENT "DispatchFrozen: %d\n", mDispatchFrozen); + dump += StringPrintf(INDENT "DispatchEnabled: %s\n", toString(mDispatchEnabled)); + dump += StringPrintf(INDENT "DispatchFrozen: %s\n", toString(mDispatchFrozen)); + dump += StringPrintf(INDENT "InputFilterEnabled: %s\n", toString(mInputFilterEnabled)); dump += StringPrintf(INDENT "FocusedDisplayId: %" PRId32 "\n", mFocusedDisplayId); if (!mFocusedApplicationHandlesByDisplay.empty()) { diff --git a/services/sensorservice/SensorEventConnection.cpp b/services/sensorservice/SensorEventConnection.cpp index c4cfdc63bf..0e409409f2 100644 --- a/services/sensorservice/SensorEventConnection.cpp +++ b/services/sensorservice/SensorEventConnection.cpp @@ -285,8 +285,9 @@ status_t SensorService::SensorEventConnection::sendEvents( scratch[count++] = buffer[i]; } } else { - // Regular sensor event, just copy it to the scratch buffer. - if (hasSensorAccess()) { + // Regular sensor event, just copy it to the scratch buffer after checking + // the AppOp. + if (hasSensorAccess() && noteOpIfRequired(buffer[i])) { scratch[count++] = buffer[i]; } } @@ -386,6 +387,16 @@ bool SensorService::SensorEventConnection::hasSensorAccess() { return mHasSensorAccess && !mService->mSensorPrivacyPolicy->isSensorPrivacyEnabled(); } +bool SensorService::SensorEventConnection::noteOpIfRequired(const sensors_event_t& event) { + bool success = true; + const auto iter = mHandleToAppOp.find(event.sensor); + if (iter != mHandleToAppOp.end()) { + int32_t appOpMode = mService->sAppOpsManager.noteOp((*iter).second, mUid, mOpPackageName); + success = (appOpMode == AppOpsManager::MODE_ALLOWED); + } + return success; +} + void SensorService::SensorEventConnection::reAllocateCacheLocked(sensors_event_t const* scratch, int count) { sensors_event_t *eventCache_new; diff --git a/services/sensorservice/SensorEventConnection.h b/services/sensorservice/SensorEventConnection.h index 70778806ce..fd881cbc0b 100644 --- a/services/sensorservice/SensorEventConnection.h +++ b/services/sensorservice/SensorEventConnection.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <sys/types.h> +#include <unordered_map> #include <utils/Vector.h> #include <utils/SortedVector.h> @@ -134,6 +135,9 @@ private: // privacy not being enabled. bool hasSensorAccess(); + // Call noteOp for the sensor if the sensor requires a permission + bool noteOpIfRequired(const sensors_event_t& event); + sp<SensorService> const mService; sp<BitTube> mChannel; uid_t mUid; @@ -181,6 +185,10 @@ private: mutable Mutex mDestroyLock; bool mDestroyed; bool mHasSensorAccess; + + // Store a mapping of sensor handles to required AppOp for a sensor. This map only contains a + // valid mapping for sensors that require a permission in order to reduce the lookup time. + std::unordered_map<int32_t, int32_t> mHandleToAppOp; }; } // namepsace android diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 02699906ed..639ce78ed3 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include <android/content/pm/IPackageManagerNative.h> #include <binder/ActivityManager.h> -#include <binder/AppOpsManager.h> #include <binder/BinderService.h> #include <binder/IServiceManager.h> #include <binder/PermissionCache.h> @@ -75,6 +75,9 @@ namespace android { const char* SensorService::WAKE_LOCK_NAME = "SensorService_wakelock"; uint8_t SensorService::sHmacGlobalKey[128] = {}; bool SensorService::sHmacGlobalKeyIsValid = false; +std::map<String16, int> SensorService::sPackageTargetVersion; +Mutex SensorService::sPackageTargetVersionLock; +AppOpsManager SensorService::sAppOpsManager; #define SENSOR_SERVICE_DIR "/data/system/sensor_service" #define SENSOR_SERVICE_HMAC_KEY_FILE SENSOR_SERVICE_DIR "/hmac_key" @@ -1394,6 +1397,14 @@ void SensorService::cleanupConnection(SensorEventConnection* c) { checkWakeLockStateLocked(); } + { + Mutex::Autolock packageLock(sPackageTargetVersionLock); + auto iter = sPackageTargetVersion.find(c->mOpPackageName); + if (iter != sPackageTargetVersion.end()) { + sPackageTargetVersion.erase(iter); + } + } + SensorDevice& dev(SensorDevice::getInstance()); dev.notifyConnectionDestroyed(c); } @@ -1539,6 +1550,10 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection, if (err == NO_ERROR) { connection->updateLooperRegistration(mLooper); + if (sensor->getSensor().getRequiredPermission().size() > 0) { + connection->mHandleToAppOp[handle] = sensor->getSensor().getRequiredAppOp(); + } + mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex) = SensorRegistrationInfo(handle, connection->getPackageName(), samplingPeriodNs, maxBatchReportLatencyNs, true); @@ -1663,13 +1678,50 @@ status_t SensorService::flushSensor(const sp<SensorEventConnection>& connection, bool SensorService::canAccessSensor(const Sensor& sensor, const char* operation, const String16& opPackageName) { - const String8& requiredPermission = sensor.getRequiredPermission(); - - if (requiredPermission.length() <= 0) { + // Check if a permission is required for this sensor + if (sensor.getRequiredPermission().length() <= 0) { return true; } + const int32_t opCode = sensor.getRequiredAppOp(); + const int32_t appOpMode = sAppOpsManager.checkOp(opCode, + IPCThreadState::self()->getCallingUid(), opPackageName); + + // Ensure that the AppOp is allowed + // + // This check is also required to ensure that the user hasn't revoked the necessary permissions + // to access the Step Detector and Step Counter when the application targets pre-Q. Without this + // check, if the user revokes the pre-Q install-time GMS Core AR permission, the app would + // still be able to receive Step Counter and Step Detector events. + bool canAccess = false; + if (opCode >= 0 && appOpMode == AppOpsManager::MODE_ALLOWED) { + if (hasPermissionForSensor(sensor)) { + canAccess = true; + } else if (sensor.getType() == SENSOR_TYPE_STEP_COUNTER || + sensor.getType() == SENSOR_TYPE_STEP_DETECTOR) { + int targetSdkVersion = getTargetSdkVersion(opPackageName); + // Allow access to the sensor if the application targets pre-Q, which is before the + // requirement to hold the AR permission to access Step Counter and Step Detector events + // was introduced. + if (targetSdkVersion > 0 && targetSdkVersion <= __ANDROID_API_P__) { + canAccess = true; + } + } + } + + if (canAccess) { + sAppOpsManager.noteOp(opCode, IPCThreadState::self()->getCallingUid(), opPackageName); + } else { + ALOGE("%s a sensor (%s) without holding its required permission: %s", + operation, sensor.getName().string(), sensor.getRequiredPermission().string()); + } + + return canAccess; +} + +bool SensorService::hasPermissionForSensor(const Sensor& sensor) { bool hasPermission = false; + const String8& requiredPermission = sensor.getRequiredPermission(); // Runtime permissions can't use the cache as they may change. if (sensor.isRequiredPermissionRuntime()) { @@ -1678,25 +1730,31 @@ bool SensorService::canAccessSensor(const Sensor& sensor, const char* operation, } else { hasPermission = PermissionCache::checkCallingPermission(String16(requiredPermission)); } + return hasPermission; +} - if (!hasPermission) { - ALOGE("%s a sensor (%s) without holding its required permission: %s", - operation, sensor.getName().string(), sensor.getRequiredPermission().string()); - return false; - } - - const int32_t opCode = sensor.getRequiredAppOp(); - if (opCode >= 0) { - AppOpsManager appOps; - if (appOps.noteOp(opCode, IPCThreadState::self()->getCallingUid(), opPackageName) - != AppOpsManager::MODE_ALLOWED) { - ALOGE("%s a sensor (%s) without enabled required app op: %d", - operation, sensor.getName().string(), opCode); - return false; +int SensorService::getTargetSdkVersion(const String16& opPackageName) { + Mutex::Autolock packageLock(sPackageTargetVersionLock); + int targetSdkVersion = -1; + auto entry = sPackageTargetVersion.find(opPackageName); + if (entry != sPackageTargetVersion.end()) { + targetSdkVersion = entry->second; + } else { + sp<IBinder> binder = defaultServiceManager()->getService(String16("package_native")); + if (binder != nullptr) { + sp<content::pm::IPackageManagerNative> packageManager = + interface_cast<content::pm::IPackageManagerNative>(binder); + if (packageManager != nullptr) { + binder::Status status = packageManager->getTargetSdkVersionForPackage( + opPackageName, &targetSdkVersion); + if (!status.isOk()) { + targetSdkVersion = -1; + } + } } + sPackageTargetVersion[opPackageName] = targetSdkVersion; } - - return true; + return targetSdkVersion; } void SensorService::checkWakeLockState() { diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index 50769678b7..e6ec96dd0a 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -20,6 +20,7 @@ #include "SensorList.h" #include "RecentEventLogger.h" +#include <binder/AppOpsManager.h> #include <binder/BinderService.h> #include <binder/IUidObserver.h> #include <cutils/compiler.h> @@ -243,6 +244,8 @@ private: sensors_event_t const* buffer, const int count); static bool canAccessSensor(const Sensor& sensor, const char* operation, const String16& opPackageName); + static bool hasPermissionForSensor(const Sensor& sensor); + static int getTargetSdkVersion(const String16& opPackageName); // SensorService acquires a partial wakelock for delivering events from wake up sensors. This // method checks whether all the events from these wake up sensors have been delivered to the // corresponding applications, if yes the wakelock is released. @@ -343,6 +346,10 @@ private: sp<UidPolicy> mUidPolicy; sp<SensorPrivacyPolicy> mSensorPrivacyPolicy; + + static AppOpsManager sAppOpsManager; + static std::map<String16, int> sPackageTargetVersion; + static Mutex sPackageTargetVersionLock; }; } // namespace android diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp index fc98dc836a..6709fb4b48 100644 --- a/services/surfaceflinger/BufferLayerConsumer.cpp +++ b/services/surfaceflinger/BufferLayerConsumer.cpp @@ -478,20 +478,15 @@ void BufferLayerConsumer::onSidebandStreamChanged() { } } -void BufferLayerConsumer::onBufferAllocated(const BufferItem& item) { - if (item.mGraphicBuffer != nullptr) { - std::shared_ptr<Image> image = std::make_shared<Image>(item.mGraphicBuffer, mRE); - std::shared_ptr<Image> oldImage; - { - std::lock_guard<std::mutex> lock(mImagesMutex); - oldImage = mImages[item.mSlot]; - if (oldImage == nullptr || oldImage->graphicBuffer() == nullptr || - oldImage->graphicBuffer()->getId() != item.mGraphicBuffer->getId()) { - mImages[item.mSlot] = std::make_shared<Image>(item.mGraphicBuffer, mRE); - } - image = mImages[item.mSlot]; +void BufferLayerConsumer::onBufferAvailable(const BufferItem& item) { + if (item.mGraphicBuffer != nullptr && item.mSlot != BufferQueue::INVALID_BUFFER_SLOT) { + std::lock_guard<std::mutex> lock(mImagesMutex); + const std::shared_ptr<Image>& oldImage = mImages[item.mSlot]; + if (oldImage == nullptr || oldImage->graphicBuffer() == nullptr || + oldImage->graphicBuffer()->getId() != item.mGraphicBuffer->getId()) { + mImages[item.mSlot] = std::make_shared<Image>(item.mGraphicBuffer, mRE); + mRE.cacheExternalTextureBuffer(item.mGraphicBuffer); } - mRE.cacheExternalTextureBuffer(image->graphicBuffer()); } } @@ -533,5 +528,4 @@ BufferLayerConsumer::Image::~Image() { mRE.unbindExternalTextureBuffer(mGraphicBuffer->getId()); } } - }; // namespace android diff --git a/services/surfaceflinger/BufferLayerConsumer.h b/services/surfaceflinger/BufferLayerConsumer.h index 0f0655d705..e3f6100c35 100644 --- a/services/surfaceflinger/BufferLayerConsumer.h +++ b/services/surfaceflinger/BufferLayerConsumer.h @@ -176,6 +176,7 @@ public: // setConsumerUsageBits overrides the ConsumerBase method to OR // DEFAULT_USAGE_FLAGS to usage. status_t setConsumerUsageBits(uint64_t usage); + void onBufferAvailable(const BufferItem& item) EXCLUDES(mImagesMutex); protected: // abandonLocked overrides the ConsumerBase method to clear @@ -241,7 +242,6 @@ private: // IConsumerListener interface void onDisconnect() override; - void onBufferAllocated(const BufferItem& item) override EXCLUDES(mImagesMutex); void onSidebandStreamChanged() override; void addAndGetFrameTimestamps(const NewFrameEventsEntry* newTimestamps, FrameEventHistoryDelta* outDelta) override; diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp index 5d729f5b4f..3d51ec33b2 100644 --- a/services/surfaceflinger/BufferQueueLayer.cpp +++ b/services/surfaceflinger/BufferQueueLayer.cpp @@ -14,6 +14,9 @@ * limitations under the License. */ +#undef LOG_TAG +#define LOG_TAG "BufferQueueLayer" +#define ATRACE_TAG ATRACE_TAG_GRAPHICS #include <compositionengine/Display.h> #include <compositionengine/Layer.h> #include <compositionengine/OutputLayer.h> @@ -435,6 +438,7 @@ void BufferQueueLayer::fakeVsync() { } void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { + ATRACE_CALL(); // Add this buffer from our internal queue tracker { // Autolock scope if (mFlinger->mUseSmart90ForVideo) { @@ -475,9 +479,11 @@ void BufferQueueLayer::onFrameAvailable(const BufferItem& item) { } else { mFlinger->signalLayerUpdate(); } + mConsumer->onBufferAvailable(item); } void BufferQueueLayer::onFrameReplaced(const BufferItem& item) { + ATRACE_CALL(); { // Autolock scope Mutex::Autolock lock(mQueueItemLock); @@ -499,6 +505,7 @@ void BufferQueueLayer::onFrameReplaced(const BufferItem& item) { mLastFrameNumberReceived = item.mFrameNumber; mQueueItemCondition.broadcast(); } + mConsumer->onBufferAvailable(item); } void BufferQueueLayer::onSidebandStreamChanged() { diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h index e69b99f0f5..e21128ca81 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/RenderSurface.h @@ -50,6 +50,9 @@ public: // Returns the bounds of the surface virtual const ui::Size& getSize() const = 0; + // Returns whether the surface is protected. + virtual bool isProtected() const = 0; + // Gets the latest fence to pass to the HWC to signal that the surface // buffer is done rendering virtual const sp<Fence>& getClientTargetAcquireFence() const = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h index 3c79084073..0f57315eb6 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/RenderSurface.h @@ -45,6 +45,7 @@ public: bool isValid() const override; void initialize() override; const ui::Size& getSize() const override; + bool isProtected() const override { return mProtected; } const sp<Fence>& getClientTargetAcquireFence() const override; void setBufferDataspace(ui::Dataspace) override; @@ -78,6 +79,7 @@ private: sp<GraphicBuffer> mGraphicBuffer; const sp<DisplaySurface> mDisplaySurface; ui::Size mSize; + bool mProtected{false}; std::uint32_t mPageFlipCount{0}; }; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h index 1562f58709..ca2299aa26 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/RenderSurface.h @@ -31,6 +31,7 @@ public: MOCK_CONST_METHOD0(isValid, bool()); MOCK_METHOD0(initialize, void()); MOCK_CONST_METHOD0(getSize, const ui::Size&()); + MOCK_CONST_METHOD0(isProtected, bool()); MOCK_CONST_METHOD0(getClientTargetAcquireFence, const sp<Fence>&()); MOCK_METHOD1(setDisplaySize, void(const ui::Size&)); MOCK_METHOD1(setProtected, void(bool)); diff --git a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp index b5a66788e6..3fcd9d155d 100644 --- a/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp +++ b/services/surfaceflinger/CompositionEngine/src/RenderSurface.cpp @@ -101,6 +101,9 @@ void RenderSurface::setProtected(bool useProtected) { } const int status = native_window_set_usage(mNativeWindow.get(), usageFlags); ALOGE_IF(status != NO_ERROR, "Unable to set BQ usage bits for protected content: %d", status); + if (status == NO_ERROR) { + mProtected = useProtected; + } } status_t RenderSurface::beginFrame(bool mustRecompose) { diff --git a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp index 996047898a..f75a4dcb85 100644 --- a/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/RenderSurfaceTest.cpp @@ -143,16 +143,40 @@ TEST_F(RenderSurfaceTest, setBufferDataspaceAppliesChange) { */ TEST_F(RenderSurfaceTest, setProtectedTrueEnablesProtection) { + EXPECT_FALSE(mSurface.isProtected()); EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED)) .WillOnce(Return(NO_ERROR)); mSurface.setProtected(true); + EXPECT_TRUE(mSurface.isProtected()); } TEST_F(RenderSurfaceTest, setProtectedFalseDisablesProtection) { + EXPECT_FALSE(mSurface.isProtected()); EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER)).WillOnce(Return(NO_ERROR)); mSurface.setProtected(false); + EXPECT_FALSE(mSurface.isProtected()); +} + +TEST_F(RenderSurfaceTest, setProtectedEnableAndDisable) { + EXPECT_FALSE(mSurface.isProtected()); + EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED)) + .WillOnce(Return(NO_ERROR)); + EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER)).WillOnce(Return(NO_ERROR)); + + mSurface.setProtected(true); + EXPECT_TRUE(mSurface.isProtected()); + mSurface.setProtected(false); + EXPECT_FALSE(mSurface.isProtected()); +} + +TEST_F(RenderSurfaceTest, setProtectedEnableWithError) { + EXPECT_FALSE(mSurface.isProtected()); + EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED)) + .WillOnce(Return(INVALID_OPERATION)); + mSurface.setProtected(true); + EXPECT_FALSE(mSurface.isProtected()); } /* ------------------------------------------------------------------------ diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index fcde8da9d6..1e5c25fb93 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -38,7 +38,7 @@ bool RefreshRateOverlay::createLayer() { } mLayer = mClient->getLayerUser(mIBinder); - mLayer->setCrop_legacy(Rect(0, 0, 200, 100), true); + mLayer->setCrop_legacy(Rect(50, 70, 200, 100), true); mLayer->setLayer(INT32_MAX - 2); return true; diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 252ff0d611..0d142675db 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -377,10 +377,15 @@ void RegionSamplingThread::captureSample() { mFlinger.traverseLayersInDisplay(device, filterVisitor); }; - const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; - sp<GraphicBuffer> buffer = - new GraphicBuffer(sampledArea.getWidth(), sampledArea.getHeight(), - PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); + sp<GraphicBuffer> buffer = nullptr; + if (mCachedBuffer && mCachedBuffer->getWidth() == sampledArea.getWidth() && + mCachedBuffer->getHeight() == sampledArea.getHeight()) { + buffer = mCachedBuffer; + } else { + const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; + buffer = new GraphicBuffer(sampledArea.getWidth(), sampledArea.getHeight(), + PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); + } // When calling into SF, we post a message into the SF message queue (so the // screen capture runs on the main thread). This message blocks until the @@ -415,6 +420,12 @@ void RegionSamplingThread::captureSample() { for (size_t d = 0; d < activeDescriptors.size(); ++d) { activeDescriptors[d].listener->onSampleCollected(lumas[d]); } + + // Extend the lifetime of mCachedBuffer from the previous frame to here to ensure that: + // 1) The region sampling thread is the last owner of the buffer, and the freeing of the buffer + // happens in this thread, as opposed to the main thread. + // 2) The listener(s) receive their notifications prior to freeing the buffer. + mCachedBuffer = buffer; ATRACE_INT(lumaSamplingStepTag, static_cast<int>(samplingStep::noWorkNeeded)); } diff --git a/services/surfaceflinger/RegionSamplingThread.h b/services/surfaceflinger/RegionSamplingThread.h index 979642912b..72b20420ef 100644 --- a/services/surfaceflinger/RegionSamplingThread.h +++ b/services/surfaceflinger/RegionSamplingThread.h @@ -24,13 +24,13 @@ #include <android-base/thread_annotations.h> #include <binder/IBinder.h> +#include <ui/GraphicBuffer.h> #include <ui/Rect.h> #include <utils/StrongPointer.h> #include "Scheduler/IdleTimer.h" namespace android { -class GraphicBuffer; class IRegionSamplingListener; class Layer; class Scheduler; @@ -121,6 +121,8 @@ private: std::unordered_map<wp<IBinder>, Descriptor, WpHash> mDescriptors GUARDED_BY(mMutex); std::chrono::nanoseconds lastSampleTime GUARDED_BY(mMutex); bool mDiscardedFrames GUARDED_BY(mMutex) = false; + + sp<GraphicBuffer> mCachedBuffer GUARDED_BY(mMutex) = nullptr; }; } // namespace android diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp index 871f556988..abf7b71006 100644 --- a/services/surfaceflinger/Scheduler/DispSync.cpp +++ b/services/surfaceflinger/Scheduler/DispSync.cpp @@ -210,17 +210,14 @@ public: const nsecs_t baseTime = now - mReferenceTime; const nsecs_t numPeriodsSinceReference = baseTime / mPeriod; const nsecs_t predictedReference = mReferenceTime + numPeriodsSinceReference * mPeriod; - listener.mLastEventTime = predictedReference + mPhase + listener.mPhase; - // If we're very close in time to the predicted last event time, - // and we're not very close to the next predicted last event time - // then we need to back up the last event time so that we can - // attempt to fire an event immediately. - // - // Otherwise, keep the last event time that we predicted so that - // we don't wake up early. - if (isShorterThanPeriod(now - listener.mLastEventTime) && - !isShorterThanPeriod(listener.mLastEventTime + mPeriod - now)) { - listener.mLastEventTime -= mPeriod; + const nsecs_t phaseCorrection = mPhase + listener.mPhase; + const nsecs_t predictedLastEventTime = predictedReference + phaseCorrection; + if (predictedLastEventTime >= now) { + // Make sure that the last event time does not exceed the current time. + // If it would, then back the last event time by a period. + listener.mLastEventTime = predictedLastEventTime - mPeriod; + } else { + listener.mLastEventTime = predictedLastEventTime; } } else { listener.mLastEventTime = now + mPhase - mWakeupLatency; @@ -316,7 +313,7 @@ private: // Sanity check that the duration is close enough in length to a period without // falling into double-rate vsyncs. - bool isShorterThanPeriod(nsecs_t duration) { + bool isCloseToPeriod(nsecs_t duration) { // Ratio of 3/5 is arbitrary, but it must be greater than 1/2. return duration < (3 * mPeriod) / 5; } @@ -332,7 +329,7 @@ private: nsecs_t t = computeListenerNextEventTimeLocked(eventListener, onePeriodAgo); if (t < now) { - if (isShorterThanPeriod(now - eventListener.mLastCallbackTime)) { + if (isCloseToPeriod(now - eventListener.mLastCallbackTime)) { eventListener.mLastEventTime = t; ALOGV("[%s] [%s] Skipping event due to model error", mName, eventListener.mName); @@ -392,7 +389,7 @@ private: // Check that it's been slightly more than half a period since the last // event so that we don't accidentally fall into double-rate vsyncs - if (isShorterThanPeriod(t - listener.mLastEventTime)) { + if (isCloseToPeriod(t - listener.mLastEventTime)) { t += mPeriod; ALOGV("[%s] Modifying t -> %" PRId64, mName, ns2us(t)); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 8be24b515f..8f7420fe2d 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1632,7 +1632,7 @@ void SurfaceFlinger::onMessageReceived(int32_t what) NO_THREAD_SAFETY_ANALYSIS { } // For now, only propagate backpressure when missing a hwc frame. - if (hwcFrameMissed) { + if (hwcFrameMissed && !gpuFrameMissed) { if (mPropagateBackpressure) { signalLayerUpdate(); break; @@ -3301,8 +3301,11 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& displayDevice, break; } } - if (needsProtected != renderEngine.isProtected() && - renderEngine.useProtectedContext(needsProtected)) { + if (needsProtected != renderEngine.isProtected()) { + renderEngine.useProtectedContext(needsProtected); + } + if (needsProtected != display->getRenderSurface()->isProtected() && + needsProtected == renderEngine.isProtected()) { display->getRenderSurface()->setProtected(needsProtected); } } |