split-up Client.h out of SurfaceFlinger.h
Change-Id: I1993bf23e417163749d886283563a93d50b361b4
This commit is contained in:
parent
d50fdb0209
commit
db403e8ff0
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <utils/String16.h>
|
#include <utils/String16.h>
|
||||||
#include <utils/Singleton.h>
|
#include <utils/Singleton.h>
|
||||||
|
#include <utils/SortedVector.h>
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -2,6 +2,7 @@ LOCAL_PATH:= $(call my-dir)
|
|||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_SRC_FILES:= \
|
LOCAL_SRC_FILES:= \
|
||||||
|
Client.cpp \
|
||||||
EventThread.cpp \
|
EventThread.cpp \
|
||||||
Layer.cpp \
|
Layer.cpp \
|
||||||
LayerBase.cpp \
|
LayerBase.cpp \
|
||||||
|
159
services/surfaceflinger/Client.cpp
Normal file
159
services/surfaceflinger/Client.cpp
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <binder/PermissionCache.h>
|
||||||
|
|
||||||
|
#include <private/android_filesystem_config.h>
|
||||||
|
|
||||||
|
#include "Client.h"
|
||||||
|
#include "LayerBase.h"
|
||||||
|
#include "SurfaceFlinger.h"
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Client::Client(const sp<SurfaceFlinger>& flinger)
|
||||||
|
: mFlinger(flinger), mNameGenerator(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Client::~Client()
|
||||||
|
{
|
||||||
|
const size_t count = mLayers.size();
|
||||||
|
for (size_t i=0 ; i<count ; i++) {
|
||||||
|
sp<LayerBaseClient> layer(mLayers.valueAt(i).promote());
|
||||||
|
if (layer != 0) {
|
||||||
|
mFlinger->removeLayer(layer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t Client::initCheck() const {
|
||||||
|
return NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Client::attachLayer(const sp<LayerBaseClient>& layer)
|
||||||
|
{
|
||||||
|
Mutex::Autolock _l(mLock);
|
||||||
|
size_t name = mNameGenerator++;
|
||||||
|
mLayers.add(name, layer);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::detachLayer(const LayerBaseClient* 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<LayerBaseClient> Client::getLayerUser(int32_t i) const
|
||||||
|
{
|
||||||
|
Mutex::Autolock _l(mLock);
|
||||||
|
sp<LayerBaseClient> lbc;
|
||||||
|
wp<LayerBaseClient> layer(mLayers.valueFor(i));
|
||||||
|
if (layer != 0) {
|
||||||
|
lbc = layer.promote();
|
||||||
|
ALOGE_IF(lbc==0, "getLayerUser(name=%d) is dead", int(i));
|
||||||
|
}
|
||||||
|
return lbc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t Client::onTransact(
|
||||||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
||||||
|
{
|
||||||
|
// these must be checked
|
||||||
|
IPCThreadState* ipc = IPCThreadState::self();
|
||||||
|
const int pid = ipc->getCallingPid();
|
||||||
|
const int uid = ipc->getCallingUid();
|
||||||
|
const int self_pid = getpid();
|
||||||
|
if (CC_UNLIKELY(pid != self_pid && uid != AID_GRAPHICS && uid != 0)) {
|
||||||
|
// we're called from a different process, do the real check
|
||||||
|
if (!PermissionCache::checkCallingPermission(sAccessSurfaceFlinger))
|
||||||
|
{
|
||||||
|
ALOGE("Permission Denial: "
|
||||||
|
"can't openGlobalTransaction pid=%d, uid=%d", pid, uid);
|
||||||
|
return PERMISSION_DENIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return BnSurfaceComposerClient::onTransact(code, data, reply, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sp<ISurface> Client::createSurface(
|
||||||
|
ISurfaceComposerClient::surface_data_t* params,
|
||||||
|
const String8& name,
|
||||||
|
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
|
||||||
|
uint32_t flags)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* createSurface must be called from the GL thread so that it can
|
||||||
|
* have access to the GL context.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class MessageCreateSurface : public MessageBase {
|
||||||
|
sp<ISurface> result;
|
||||||
|
SurfaceFlinger* flinger;
|
||||||
|
ISurfaceComposerClient::surface_data_t* params;
|
||||||
|
Client* client;
|
||||||
|
const String8& name;
|
||||||
|
DisplayID display;
|
||||||
|
uint32_t w, h;
|
||||||
|
PixelFormat format;
|
||||||
|
uint32_t flags;
|
||||||
|
public:
|
||||||
|
MessageCreateSurface(SurfaceFlinger* flinger,
|
||||||
|
ISurfaceComposerClient::surface_data_t* params,
|
||||||
|
const String8& name, Client* client,
|
||||||
|
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
|
||||||
|
uint32_t flags)
|
||||||
|
: flinger(flinger), params(params), client(client), name(name),
|
||||||
|
display(display), w(w), h(h), format(format), flags(flags)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
sp<ISurface> getResult() const { return result; }
|
||||||
|
virtual bool handler() {
|
||||||
|
result = flinger->createSurface(params, name, client,
|
||||||
|
display, w, h, format, flags);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sp<MessageBase> msg = new MessageCreateSurface(mFlinger.get(),
|
||||||
|
params, name, this, display, w, h, format, flags);
|
||||||
|
mFlinger->postMessageSync(msg);
|
||||||
|
return static_cast<MessageCreateSurface*>( msg.get() )->getResult();
|
||||||
|
}
|
||||||
|
status_t Client::destroySurface(SurfaceID sid) {
|
||||||
|
return mFlinger->removeSurface(this, sid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
}; // namespace android
|
79
services/surfaceflinger/Client.h
Normal file
79
services/surfaceflinger/Client.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ANDROID_SF_CLIENT_H
|
||||||
|
#define ANDROID_SF_CLIENT_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <utils/Errors.h>
|
||||||
|
#include <utils/KeyedVector.h>
|
||||||
|
#include <utils/Mutex.h>
|
||||||
|
|
||||||
|
#include <gui/ISurfaceComposerClient.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class LayerBaseClient;
|
||||||
|
class SurfaceFlinger;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class Client : public BnSurfaceComposerClient
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Client(const sp<SurfaceFlinger>& flinger);
|
||||||
|
~Client();
|
||||||
|
|
||||||
|
status_t initCheck() const;
|
||||||
|
|
||||||
|
// protected by SurfaceFlinger::mStateLock
|
||||||
|
size_t attachLayer(const sp<LayerBaseClient>& layer);
|
||||||
|
|
||||||
|
void detachLayer(const LayerBaseClient* layer);
|
||||||
|
|
||||||
|
sp<LayerBaseClient> getLayerUser(int32_t i) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ISurfaceComposerClient interface
|
||||||
|
virtual sp<ISurface> createSurface(
|
||||||
|
surface_data_t* params, const String8& name,
|
||||||
|
DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
|
||||||
|
uint32_t flags);
|
||||||
|
|
||||||
|
virtual status_t destroySurface(SurfaceID surfaceId);
|
||||||
|
|
||||||
|
virtual status_t onTransact(
|
||||||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
|
||||||
|
|
||||||
|
// constant
|
||||||
|
sp<SurfaceFlinger> mFlinger;
|
||||||
|
|
||||||
|
// protected by mLock
|
||||||
|
DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
|
||||||
|
size_t mNameGenerator;
|
||||||
|
|
||||||
|
// thread-safe
|
||||||
|
mutable Mutex mLock;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
}; // namespace android
|
||||||
|
|
||||||
|
#endif // ANDROID_SF_CLIENT_H
|
@ -29,6 +29,7 @@
|
|||||||
#include <hardware/hardware.h>
|
#include <hardware/hardware.h>
|
||||||
|
|
||||||
#include "clz.h"
|
#include "clz.h"
|
||||||
|
#include "Client.h"
|
||||||
#include "LayerBase.h"
|
#include "LayerBase.h"
|
||||||
#include "SurfaceFlinger.h"
|
#include "SurfaceFlinger.h"
|
||||||
#include "DisplayHardware/DisplayHardware.h"
|
#include "DisplayHardware/DisplayHardware.h"
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
#include "clz.h"
|
#include "clz.h"
|
||||||
#include "DdmConnection.h"
|
#include "DdmConnection.h"
|
||||||
|
#include "Client.h"
|
||||||
#include "EventThread.h"
|
#include "EventThread.h"
|
||||||
#include "GLExtensions.h"
|
#include "GLExtensions.h"
|
||||||
#include "Layer.h"
|
#include "Layer.h"
|
||||||
@ -2509,130 +2510,6 @@ sp<Layer> SurfaceFlinger::getLayer(const sp<ISurface>& sur) const
|
|||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
Client::Client(const sp<SurfaceFlinger>& flinger)
|
|
||||||
: mFlinger(flinger), mNameGenerator(1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Client::~Client()
|
|
||||||
{
|
|
||||||
const size_t count = mLayers.size();
|
|
||||||
for (size_t i=0 ; i<count ; i++) {
|
|
||||||
sp<LayerBaseClient> layer(mLayers.valueAt(i).promote());
|
|
||||||
if (layer != 0) {
|
|
||||||
mFlinger->removeLayer(layer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t Client::initCheck() const {
|
|
||||||
return NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Client::attachLayer(const sp<LayerBaseClient>& layer)
|
|
||||||
{
|
|
||||||
Mutex::Autolock _l(mLock);
|
|
||||||
size_t name = mNameGenerator++;
|
|
||||||
mLayers.add(name, layer);
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::detachLayer(const LayerBaseClient* 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<LayerBaseClient> Client::getLayerUser(int32_t i) const
|
|
||||||
{
|
|
||||||
Mutex::Autolock _l(mLock);
|
|
||||||
sp<LayerBaseClient> lbc;
|
|
||||||
wp<LayerBaseClient> layer(mLayers.valueFor(i));
|
|
||||||
if (layer != 0) {
|
|
||||||
lbc = layer.promote();
|
|
||||||
ALOGE_IF(lbc==0, "getLayerUser(name=%d) is dead", int(i));
|
|
||||||
}
|
|
||||||
return lbc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t Client::onTransact(
|
|
||||||
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
|
|
||||||
{
|
|
||||||
// these must be checked
|
|
||||||
IPCThreadState* ipc = IPCThreadState::self();
|
|
||||||
const int pid = ipc->getCallingPid();
|
|
||||||
const int uid = ipc->getCallingUid();
|
|
||||||
const int self_pid = getpid();
|
|
||||||
if (CC_UNLIKELY(pid != self_pid && uid != AID_GRAPHICS && uid != 0)) {
|
|
||||||
// we're called from a different process, do the real check
|
|
||||||
if (!PermissionCache::checkCallingPermission(sAccessSurfaceFlinger))
|
|
||||||
{
|
|
||||||
ALOGE("Permission Denial: "
|
|
||||||
"can't openGlobalTransaction pid=%d, uid=%d", pid, uid);
|
|
||||||
return PERMISSION_DENIED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return BnSurfaceComposerClient::onTransact(code, data, reply, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sp<ISurface> Client::createSurface(
|
|
||||||
ISurfaceComposerClient::surface_data_t* params,
|
|
||||||
const String8& name,
|
|
||||||
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
|
|
||||||
uint32_t flags)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* createSurface must be called from the GL thread so that it can
|
|
||||||
* have access to the GL context.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class MessageCreateSurface : public MessageBase {
|
|
||||||
sp<ISurface> result;
|
|
||||||
SurfaceFlinger* flinger;
|
|
||||||
ISurfaceComposerClient::surface_data_t* params;
|
|
||||||
Client* client;
|
|
||||||
const String8& name;
|
|
||||||
DisplayID display;
|
|
||||||
uint32_t w, h;
|
|
||||||
PixelFormat format;
|
|
||||||
uint32_t flags;
|
|
||||||
public:
|
|
||||||
MessageCreateSurface(SurfaceFlinger* flinger,
|
|
||||||
ISurfaceComposerClient::surface_data_t* params,
|
|
||||||
const String8& name, Client* client,
|
|
||||||
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
|
|
||||||
uint32_t flags)
|
|
||||||
: flinger(flinger), params(params), client(client), name(name),
|
|
||||||
display(display), w(w), h(h), format(format), flags(flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
sp<ISurface> getResult() const { return result; }
|
|
||||||
virtual bool handler() {
|
|
||||||
result = flinger->createSurface(params, name, client,
|
|
||||||
display, w, h, format, flags);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
sp<MessageBase> msg = new MessageCreateSurface(mFlinger.get(),
|
|
||||||
params, name, this, display, w, h, format, flags);
|
|
||||||
mFlinger->postMessageSync(msg);
|
|
||||||
return static_cast<MessageCreateSurface*>( msg.get() )->getResult();
|
|
||||||
}
|
|
||||||
status_t Client::destroySurface(SurfaceID sid) {
|
|
||||||
return mFlinger->removeSurface(this, sid);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
GraphicBufferAlloc::GraphicBufferAlloc() {}
|
GraphicBufferAlloc::GraphicBufferAlloc() {}
|
||||||
|
|
||||||
GraphicBufferAlloc::~GraphicBufferAlloc() {}
|
GraphicBufferAlloc::~GraphicBufferAlloc() {}
|
||||||
|
@ -57,40 +57,6 @@ struct surface_flinger_cblk_t;
|
|||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
class Client : public BnSurfaceComposerClient
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Client(const sp<SurfaceFlinger>& flinger);
|
|
||||||
~Client();
|
|
||||||
|
|
||||||
status_t initCheck() const;
|
|
||||||
|
|
||||||
// protected by SurfaceFlinger::mStateLock
|
|
||||||
size_t attachLayer(const sp<LayerBaseClient>& layer);
|
|
||||||
void detachLayer(const LayerBaseClient* layer);
|
|
||||||
sp<LayerBaseClient> getLayerUser(int32_t i) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// ISurfaceComposerClient interface
|
|
||||||
virtual sp<ISurface> createSurface(
|
|
||||||
surface_data_t* params, const String8& name,
|
|
||||||
DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
|
|
||||||
uint32_t flags);
|
|
||||||
virtual status_t destroySurface(SurfaceID surfaceId);
|
|
||||||
virtual status_t onTransact(
|
|
||||||
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
|
|
||||||
|
|
||||||
// constant
|
|
||||||
sp<SurfaceFlinger> mFlinger;
|
|
||||||
|
|
||||||
// protected by mLock
|
|
||||||
DefaultKeyedVector< size_t, wp<LayerBaseClient> > mLayers;
|
|
||||||
size_t mNameGenerator;
|
|
||||||
|
|
||||||
// thread-safe
|
|
||||||
mutable Mutex mLock;
|
|
||||||
};
|
|
||||||
|
|
||||||
class GraphicBufferAlloc : public BnGraphicBufferAlloc
|
class GraphicBufferAlloc : public BnGraphicBufferAlloc
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
Reference in New Issue
Block a user