• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <stdint.h>
21 #include <sys/types.h>
22 
23 #include <binder/Parcel.h>
24 #include <binder/IMemory.h>
25 #include <binder/IPCThreadState.h>
26 #include <binder/IServiceManager.h>
27 
28 #include <gui/BitTube.h>
29 #include <gui/IDisplayEventConnection.h>
30 #include <gui/ISurfaceComposer.h>
31 #include <gui/ISurfaceTexture.h>
32 
33 #include <private/gui/LayerState.h>
34 
35 #include <ui/DisplayInfo.h>
36 
37 #include <utils/Log.h>
38 
39 // ---------------------------------------------------------------------------
40 
41 namespace android {
42 
43 class IDisplayEventConnection;
44 
45 class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
46 {
47 public:
BpSurfaceComposer(const sp<IBinder> & impl)48     BpSurfaceComposer(const sp<IBinder>& impl)
49         : BpInterface<ISurfaceComposer>(impl)
50     {
51     }
52 
createConnection()53     virtual sp<ISurfaceComposerClient> createConnection()
54     {
55         uint32_t n;
56         Parcel data, reply;
57         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
58         remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
59         return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
60     }
61 
createGraphicBufferAlloc()62     virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
63     {
64         uint32_t n;
65         Parcel data, reply;
66         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
67         remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
68         return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
69     }
70 
getCblk() const71     virtual sp<IMemoryHeap> getCblk() const
72     {
73         Parcel data, reply;
74         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
75         remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply);
76         return interface_cast<IMemoryHeap>(reply.readStrongBinder());
77     }
78 
setTransactionState(const Vector<ComposerState> & state,int orientation,uint32_t flags)79     virtual void setTransactionState(const Vector<ComposerState>& state,
80             int orientation, uint32_t flags)
81     {
82         Parcel data, reply;
83         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
84         Vector<ComposerState>::const_iterator b(state.begin());
85         Vector<ComposerState>::const_iterator e(state.end());
86         data.writeInt32(state.size());
87         for ( ; b != e ; ++b ) {
88             b->write(data);
89         }
90         data.writeInt32(orientation);
91         data.writeInt32(flags);
92         remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
93     }
94 
bootFinished()95     virtual void bootFinished()
96     {
97         Parcel data, reply;
98         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
99         remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
100     }
101 
captureScreen(DisplayID dpy,sp<IMemoryHeap> * heap,uint32_t * width,uint32_t * height,PixelFormat * format,uint32_t reqWidth,uint32_t reqHeight,uint32_t minLayerZ,uint32_t maxLayerZ)102     virtual status_t captureScreen(DisplayID dpy,
103             sp<IMemoryHeap>* heap,
104             uint32_t* width, uint32_t* height, PixelFormat* format,
105             uint32_t reqWidth, uint32_t reqHeight,
106             uint32_t minLayerZ, uint32_t maxLayerZ)
107     {
108         Parcel data, reply;
109         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
110         data.writeInt32(dpy);
111         data.writeInt32(reqWidth);
112         data.writeInt32(reqHeight);
113         data.writeInt32(minLayerZ);
114         data.writeInt32(maxLayerZ);
115         remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
116         *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder());
117         *width = reply.readInt32();
118         *height = reply.readInt32();
119         *format = reply.readInt32();
120         return reply.readInt32();
121     }
122 
turnElectronBeamOff(int32_t mode)123     virtual status_t turnElectronBeamOff(int32_t mode)
124     {
125         Parcel data, reply;
126         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
127         data.writeInt32(mode);
128         remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply);
129         return reply.readInt32();
130     }
131 
turnElectronBeamOn(int32_t mode)132     virtual status_t turnElectronBeamOn(int32_t mode)
133     {
134         Parcel data, reply;
135         data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
136         data.writeInt32(mode);
137         remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply);
138         return reply.readInt32();
139     }
140 
authenticateSurfaceTexture(const sp<ISurfaceTexture> & surfaceTexture) const141     virtual bool authenticateSurfaceTexture(
142             const sp<ISurfaceTexture>& surfaceTexture) const
143     {
144         Parcel data, reply;
145         int err = NO_ERROR;
146         err = data.writeInterfaceToken(
147                 ISurfaceComposer::getInterfaceDescriptor());
148         if (err != NO_ERROR) {
149             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
150                     "interface descriptor: %s (%d)", strerror(-err), -err);
151             return false;
152         }
153         err = data.writeStrongBinder(surfaceTexture->asBinder());
154         if (err != NO_ERROR) {
155             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
156                     "strong binder to parcel: %s (%d)", strerror(-err), -err);
157             return false;
158         }
159         err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
160                 &reply);
161         if (err != NO_ERROR) {
162             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
163                     "performing transaction: %s (%d)", strerror(-err), -err);
164             return false;
165         }
166         int32_t result = 0;
167         err = reply.readInt32(&result);
168         if (err != NO_ERROR) {
169             ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
170                     "retrieving result: %s (%d)", strerror(-err), -err);
171             return false;
172         }
173         return result != 0;
174     }
175 
createDisplayEventConnection()176     virtual sp<IDisplayEventConnection> createDisplayEventConnection()
177     {
178         Parcel data, reply;
179         sp<IDisplayEventConnection> result;
180         int err = data.writeInterfaceToken(
181                 ISurfaceComposer::getInterfaceDescriptor());
182         if (err != NO_ERROR) {
183             return result;
184         }
185         err = remote()->transact(
186                 BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
187                 data, &reply);
188         if (err != NO_ERROR) {
189             ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
190                     "transaction: %s (%d)", strerror(-err), -err);
191             return result;
192         }
193         result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
194         return result;
195     }
196 };
197 
198 IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
199 
200 // ----------------------------------------------------------------------
201 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)202 status_t BnSurfaceComposer::onTransact(
203     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
204 {
205     switch(code) {
206         case CREATE_CONNECTION: {
207             CHECK_INTERFACE(ISurfaceComposer, data, reply);
208             sp<IBinder> b = createConnection()->asBinder();
209             reply->writeStrongBinder(b);
210         } break;
211         case CREATE_GRAPHIC_BUFFER_ALLOC: {
212             CHECK_INTERFACE(ISurfaceComposer, data, reply);
213             sp<IBinder> b = createGraphicBufferAlloc()->asBinder();
214             reply->writeStrongBinder(b);
215         } break;
216         case SET_TRANSACTION_STATE: {
217             CHECK_INTERFACE(ISurfaceComposer, data, reply);
218             size_t count = data.readInt32();
219             ComposerState s;
220             Vector<ComposerState> state;
221             state.setCapacity(count);
222             for (size_t i=0 ; i<count ; i++) {
223                 s.read(data);
224                 state.add(s);
225             }
226             int orientation = data.readInt32();
227             uint32_t flags = data.readInt32();
228             setTransactionState(state, orientation, flags);
229         } break;
230         case BOOT_FINISHED: {
231             CHECK_INTERFACE(ISurfaceComposer, data, reply);
232             bootFinished();
233         } break;
234         case GET_CBLK: {
235             CHECK_INTERFACE(ISurfaceComposer, data, reply);
236             sp<IBinder> b = getCblk()->asBinder();
237             reply->writeStrongBinder(b);
238         } break;
239         case CAPTURE_SCREEN: {
240             CHECK_INTERFACE(ISurfaceComposer, data, reply);
241             DisplayID dpy = data.readInt32();
242             uint32_t reqWidth = data.readInt32();
243             uint32_t reqHeight = data.readInt32();
244             uint32_t minLayerZ = data.readInt32();
245             uint32_t maxLayerZ = data.readInt32();
246             sp<IMemoryHeap> heap;
247             uint32_t w, h;
248             PixelFormat f;
249             status_t res = captureScreen(dpy, &heap, &w, &h, &f,
250                     reqWidth, reqHeight, minLayerZ, maxLayerZ);
251             reply->writeStrongBinder(heap->asBinder());
252             reply->writeInt32(w);
253             reply->writeInt32(h);
254             reply->writeInt32(f);
255             reply->writeInt32(res);
256         } break;
257         case TURN_ELECTRON_BEAM_OFF: {
258             CHECK_INTERFACE(ISurfaceComposer, data, reply);
259             int32_t mode = data.readInt32();
260             status_t res = turnElectronBeamOff(mode);
261             reply->writeInt32(res);
262         } break;
263         case TURN_ELECTRON_BEAM_ON: {
264             CHECK_INTERFACE(ISurfaceComposer, data, reply);
265             int32_t mode = data.readInt32();
266             status_t res = turnElectronBeamOn(mode);
267             reply->writeInt32(res);
268         } break;
269         case AUTHENTICATE_SURFACE: {
270             CHECK_INTERFACE(ISurfaceComposer, data, reply);
271             sp<ISurfaceTexture> surfaceTexture =
272                     interface_cast<ISurfaceTexture>(data.readStrongBinder());
273             int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0;
274             reply->writeInt32(result);
275         } break;
276         case CREATE_DISPLAY_EVENT_CONNECTION: {
277             CHECK_INTERFACE(ISurfaceComposer, data, reply);
278             sp<IDisplayEventConnection> connection(createDisplayEventConnection());
279             reply->writeStrongBinder(connection->asBinder());
280             return NO_ERROR;
281         } break;
282         default:
283             return BBinder::onTransact(code, data, reply, flags);
284     }
285     return NO_ERROR;
286 }
287 
288 // ----------------------------------------------------------------------------
289 
290 };
291