1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17// tag as surfaceflinger 18#define LOG_TAG "SurfaceFlinger" 19 20#include <stdio.h> 21#include <stdint.h> 22#include <sys/types.h> 23 24#include <binder/Parcel.h> 25#include <binder/IMemory.h> 26#include <binder/IPCThreadState.h> 27#include <binder/IServiceManager.h> 28 29#include <ui/Point.h> 30#include <ui/Rect.h> 31 32#include <gui/IGraphicBufferProducer.h> 33#include <gui/ISurfaceComposerClient.h> 34#include <private/gui/LayerState.h> 35 36// --------------------------------------------------------------------------- 37 38namespace android { 39 40enum { 41 CREATE_SURFACE = IBinder::FIRST_CALL_TRANSACTION, 42 DESTROY_SURFACE, 43 CLEAR_LAYER_FRAME_STATS, 44 GET_LAYER_FRAME_STATS 45}; 46 47class BpSurfaceComposerClient : public BpInterface<ISurfaceComposerClient> 48{ 49public: 50 BpSurfaceComposerClient(const sp<IBinder>& impl) 51 : BpInterface<ISurfaceComposerClient>(impl) { 52 } 53 54 virtual ~BpSurfaceComposerClient(); 55 56 virtual status_t createSurface(const String8& name, uint32_t width, 57 uint32_t height, PixelFormat format, uint32_t flags, 58 sp<IBinder>* handle, 59 sp<IGraphicBufferProducer>* gbp) { 60 Parcel data, reply; 61 data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 62 data.writeString8(name); 63 data.writeUint32(width); 64 data.writeUint32(height); 65 data.writeInt32(static_cast<int32_t>(format)); 66 data.writeUint32(flags); 67 remote()->transact(CREATE_SURFACE, data, &reply); 68 *handle = reply.readStrongBinder(); 69 *gbp = interface_cast<IGraphicBufferProducer>(reply.readStrongBinder()); 70 return reply.readInt32(); 71 } 72 73 virtual status_t destroySurface(const sp<IBinder>& handle) { 74 Parcel data, reply; 75 data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 76 data.writeStrongBinder(handle); 77 remote()->transact(DESTROY_SURFACE, data, &reply); 78 return reply.readInt32(); 79 } 80 81 virtual status_t clearLayerFrameStats(const sp<IBinder>& handle) const { 82 Parcel data, reply; 83 data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 84 data.writeStrongBinder(handle); 85 remote()->transact(CLEAR_LAYER_FRAME_STATS, data, &reply); 86 return reply.readInt32(); 87 } 88 89 virtual status_t getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const { 90 Parcel data, reply; 91 data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); 92 data.writeStrongBinder(handle); 93 remote()->transact(GET_LAYER_FRAME_STATS, data, &reply); 94 reply.read(*outStats); 95 return reply.readInt32(); 96 } 97}; 98 99// Out-of-line virtual method definition to trigger vtable emission in this 100// translation unit (see clang warning -Wweak-vtables) 101BpSurfaceComposerClient::~BpSurfaceComposerClient() {} 102 103IMPLEMENT_META_INTERFACE(SurfaceComposerClient, "android.ui.ISurfaceComposerClient"); 104 105// ---------------------------------------------------------------------- 106 107status_t BnSurfaceComposerClient::onTransact( 108 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 109{ 110 switch(code) { 111 case CREATE_SURFACE: { 112 CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 113 String8 name = data.readString8(); 114 uint32_t width = data.readUint32(); 115 uint32_t height = data.readUint32(); 116 PixelFormat format = static_cast<PixelFormat>(data.readInt32()); 117 uint32_t createFlags = data.readUint32(); 118 sp<IBinder> handle; 119 sp<IGraphicBufferProducer> gbp; 120 status_t result = createSurface(name, width, height, format, 121 createFlags, &handle, &gbp); 122 reply->writeStrongBinder(handle); 123 reply->writeStrongBinder(IInterface::asBinder(gbp)); 124 reply->writeInt32(result); 125 return NO_ERROR; 126 } 127 case DESTROY_SURFACE: { 128 CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 129 reply->writeInt32(destroySurface( data.readStrongBinder() ) ); 130 return NO_ERROR; 131 } 132 case CLEAR_LAYER_FRAME_STATS: { 133 CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 134 sp<IBinder> handle = data.readStrongBinder(); 135 status_t result = clearLayerFrameStats(handle); 136 reply->writeInt32(result); 137 return NO_ERROR; 138 } 139 case GET_LAYER_FRAME_STATS: { 140 CHECK_INTERFACE(ISurfaceComposerClient, data, reply); 141 sp<IBinder> handle = data.readStrongBinder(); 142 FrameStats stats; 143 status_t result = getLayerFrameStats(handle, &stats); 144 reply->write(stats); 145 reply->writeInt32(result); 146 return NO_ERROR; 147 } 148 default: 149 return BBinder::onTransact(code, data, reply, flags); 150 } 151} 152 153}; // namespace android 154