status_t Client::getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const { sp<Layer> layer = getLayerUser(handle); if (layer == NULL) { return NAME_NOT_FOUND; } layer->getFrameStats(outStats); return NO_ERROR; }
status_t Client::clearLayerFrameStats(const sp<IBinder>& handle) const { sp<Layer> layer = getLayerUser(handle); if (layer == NULL) { return NAME_NOT_FOUND; } layer->clearFrameStats(); return NO_ERROR; }
status_t Client::getTransformToDisplayInverse(const sp<IBinder>& handle, bool* outTransformToDisplayInverse) const { sp<Layer> layer = getLayerUser(handle); if (layer == NULL) { return NAME_NOT_FOUND; } *outTransformToDisplayInverse = layer->getTransformToDisplayInverse(); return NO_ERROR; }
status_t Client::createSurface( const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, const sp<IBinder>& parentHandle, uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp) { sp<Layer> parent = nullptr; if (parentHandle != nullptr) { parent = getLayerUser(parentHandle); if (parent == nullptr) { return NAME_NOT_FOUND; } } if (parent == nullptr) { bool parentDied; parent = getParentLayer(&parentDied); // If we had a parent, but it died, we've lost all // our capabilities. if (parentDied) { return NAME_NOT_FOUND; } } /* * createSurface must be called from the GL thread so that it can * have access to the GL context. */ class MessageCreateLayer : public MessageBase { SurfaceFlinger* flinger; Client* client; sp<IBinder>* handle; sp<IGraphicBufferProducer>* gbp; status_t result; const String8& name; uint32_t w, h; PixelFormat format; uint32_t flags; sp<Layer>* parent; uint32_t windowType; uint32_t ownerUid; public: MessageCreateLayer(SurfaceFlinger* flinger, const String8& name, Client* client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, sp<IBinder>* handle, uint32_t windowType, uint32_t ownerUid, sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent) : flinger(flinger), client(client), handle(handle), gbp(gbp), result(NO_ERROR), name(name), w(w), h(h), format(format), flags(flags), parent(parent), windowType(windowType), ownerUid(ownerUid) { } status_t getResult() const { return result; } virtual bool handler() { result = flinger->createLayer(name, client, w, h, format, flags, windowType, ownerUid, handle, gbp, parent); return true; } }; sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(), name, this, w, h, format, flags, handle, windowType, ownerUid, gbp, &parent); mFlinger->postMessageSync(msg); return static_cast<MessageCreateLayer*>( msg.get() )->getResult(); }