diff options
Diffstat (limited to 'services/surfaceflinger/Client.cpp')
-rw-r--r-- | services/surfaceflinger/Client.cpp | 131 |
1 files changed, 64 insertions, 67 deletions
diff --git a/services/surfaceflinger/Client.cpp b/services/surfaceflinger/Client.cpp index 6d7b732b36..bdbc79b8e1 100644 --- a/services/surfaceflinger/Client.cpp +++ b/services/surfaceflinger/Client.cpp @@ -21,12 +21,18 @@ #include <private/android_filesystem_config.h> +#include <gui/AidlStatusUtil.h> + #include "Client.h" +#include "FrontEnd/LayerCreationArgs.h" +#include "FrontEnd/LayerHandle.h" #include "Layer.h" #include "SurfaceFlinger.h" namespace android { +using gui::aidl_utils::binderStatusFromStatusT; + // --------------------------------------------------------------------------- const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER"); @@ -42,82 +48,73 @@ status_t Client::initCheck() const { return NO_ERROR; } -void Client::attachLayer(const sp<IBinder>& handle, const sp<Layer>& layer) -{ - Mutex::Autolock _l(mLock); - mLayers.add(handle, layer); -} - -void Client::detachLayer(const Layer* layer) -{ - Mutex::Autolock _l(mLock); - // we do a linear search here, because this doesn't happen often - const size_t count = mLayers.size(); - for (size_t i=0 ; i<count ; i++) { - if (mLayers.valueAt(i) == layer) { - mLayers.removeItemsAt(i, 1); - break; - } - } -} -sp<Layer> Client::getLayerUser(const sp<IBinder>& handle) const -{ - Mutex::Autolock _l(mLock); - sp<Layer> lbc; - wp<Layer> layer(mLayers.valueFor(handle)); - if (layer != 0) { - lbc = layer.promote(); - ALOGE_IF(lbc==0, "getLayerUser(name=%p) is dead", handle.get()); - } - return lbc; -} - -status_t Client::createSurface(const String8& name, uint32_t /* w */, uint32_t /* h */, - PixelFormat /* format */, uint32_t flags, - const sp<IBinder>& parentHandle, LayerMetadata metadata, - sp<IBinder>* outHandle, sp<IGraphicBufferProducer>* /* gbp */, - int32_t* outLayerId, uint32_t* outTransformHint) { +binder::Status Client::createSurface(const std::string& name, int32_t flags, + const sp<IBinder>& parent, const gui::LayerMetadata& metadata, + gui::CreateSurfaceResult* outResult) { // We rely on createLayer to check permissions. - LayerCreationArgs args(mFlinger.get(), this, name.c_str(), flags, std::move(metadata)); - return mFlinger->createLayer(args, outHandle, parentHandle, outLayerId, nullptr, - outTransformHint); + sp<IBinder> handle; + LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this), name.c_str(), + static_cast<uint32_t>(flags), std::move(metadata)); + args.parentHandle = parent; + const status_t status = mFlinger->createLayer(args, *outResult); + return binderStatusFromStatusT(status); } -status_t Client::createWithSurfaceParent(const String8& /* name */, uint32_t /* w */, - uint32_t /* h */, PixelFormat /* format */, - uint32_t /* flags */, - const sp<IGraphicBufferProducer>& /* parent */, - LayerMetadata /* metadata */, sp<IBinder>* /* handle */, - sp<IGraphicBufferProducer>* /* gbp */, - int32_t* /* outLayerId */, - uint32_t* /* outTransformHint */) { - // This api does not make sense with blast since SF no longer tracks IGBP. This api should be - // removed. - return BAD_VALUE; -} - -status_t Client::mirrorSurface(const sp<IBinder>& mirrorFromHandle, sp<IBinder>* outHandle, - int32_t* outLayerId) { - LayerCreationArgs args(mFlinger.get(), this, "MirrorRoot", 0 /* flags */, LayerMetadata()); - return mFlinger->mirrorLayer(args, mirrorFromHandle, outHandle, outLayerId); -} - -status_t Client::clearLayerFrameStats(const sp<IBinder>& handle) const { - sp<Layer> layer = getLayerUser(handle); +binder::Status Client::clearLayerFrameStats(const sp<IBinder>& handle) { + status_t status; + sp<Layer> layer = LayerHandle::getLayer(handle); if (layer == nullptr) { - return NAME_NOT_FOUND; + status = NAME_NOT_FOUND; + } else { + layer->clearFrameStats(); + status = NO_ERROR; } - layer->clearFrameStats(); - return NO_ERROR; + return binderStatusFromStatusT(status); } -status_t Client::getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const { - sp<Layer> layer = getLayerUser(handle); +binder::Status Client::getLayerFrameStats(const sp<IBinder>& handle, gui::FrameStats* outStats) { + status_t status; + sp<Layer> layer = LayerHandle::getLayer(handle); if (layer == nullptr) { - return NAME_NOT_FOUND; + status = NAME_NOT_FOUND; + } else { + FrameStats stats; + layer->getFrameStats(&stats); + outStats->refreshPeriodNano = stats.refreshPeriodNano; + outStats->desiredPresentTimesNano.reserve(stats.desiredPresentTimesNano.size()); + for (const auto& t : stats.desiredPresentTimesNano) { + outStats->desiredPresentTimesNano.push_back(t); + } + outStats->actualPresentTimesNano.reserve(stats.actualPresentTimesNano.size()); + for (const auto& t : stats.actualPresentTimesNano) { + outStats->actualPresentTimesNano.push_back(t); + } + outStats->frameReadyTimesNano.reserve(stats.frameReadyTimesNano.size()); + for (const auto& t : stats.frameReadyTimesNano) { + outStats->frameReadyTimesNano.push_back(t); + } + status = NO_ERROR; } - layer->getFrameStats(outStats); - return NO_ERROR; + return binderStatusFromStatusT(status); +} + +binder::Status Client::mirrorSurface(const sp<IBinder>& mirrorFromHandle, + gui::CreateSurfaceResult* outResult) { + sp<IBinder> handle; + LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this), "MirrorRoot", + 0 /* flags */, gui::LayerMetadata()); + status_t status = mFlinger->mirrorLayer(args, mirrorFromHandle, *outResult); + return binderStatusFromStatusT(status); +} + +binder::Status Client::mirrorDisplay(int64_t displayId, gui::CreateSurfaceResult* outResult) { + sp<IBinder> handle; + LayerCreationArgs args(mFlinger.get(), sp<Client>::fromExisting(this), + "MirrorRoot-" + std::to_string(displayId), 0 /* flags */, + gui::LayerMetadata()); + std::optional<DisplayId> id = DisplayId::fromValue(static_cast<uint64_t>(displayId)); + status_t status = mFlinger->mirrorDisplay(*id, args, *outResult); + return binderStatusFromStatusT(status); } // --------------------------------------------------------------------------- |