| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 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 |  | 
| Mathias Agopian | c5b2c0b | 2009-05-19 19:08:10 -0700 | [diff] [blame] | 24 | #include <binder/Parcel.h> | 
 | 25 | #include <binder/IMemory.h> | 
 | 26 | #include <binder/IPCThreadState.h> | 
 | 27 | #include <binder/IServiceManager.h> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 28 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 29 | #include <ui/Point.h> | 
 | 30 | #include <ui/Rect.h> | 
 | 31 |  | 
| Mathias Agopian | 9cce325 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 32 | #include <surfaceflinger/ISurface.h> | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 33 | #include <surfaceflinger/ISurfaceComposerClient.h> | 
| Mathias Agopian | 9cce325 | 2010-02-09 17:46:37 -0800 | [diff] [blame] | 34 | #include <private/surfaceflinger/LayerState.h> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 35 |  | 
 | 36 | // --------------------------------------------------------------------------- | 
 | 37 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 38 | namespace android { | 
 | 39 |  | 
 | 40 | enum { | 
| Mathias Agopian | a67932f | 2011-04-20 14:20:59 -0700 | [diff] [blame] | 41 |     CREATE_SURFACE = IBinder::FIRST_CALL_TRANSACTION, | 
| Mathias Agopian | 698c087 | 2011-06-28 19:09:31 -0700 | [diff] [blame] | 42 |     DESTROY_SURFACE | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 43 | }; | 
 | 44 |  | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 45 | class BpSurfaceComposerClient : public BpInterface<ISurfaceComposerClient> | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 46 | { | 
 | 47 | public: | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 48 |     BpSurfaceComposerClient(const sp<IBinder>& impl) | 
 | 49 |         : BpInterface<ISurfaceComposerClient>(impl) | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 50 |     { | 
 | 51 |     } | 
 | 52 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 53 |     virtual sp<ISurface> createSurface( surface_data_t* params, | 
| Mathias Agopian | 285dbde | 2010-03-01 16:09:43 -0800 | [diff] [blame] | 54 |                                         const String8& name, | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 55 |                                         DisplayID display, | 
 | 56 |                                         uint32_t w, | 
 | 57 |                                         uint32_t h, | 
 | 58 |                                         PixelFormat format, | 
 | 59 |                                         uint32_t flags) | 
 | 60 |     { | 
 | 61 |         Parcel data, reply; | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 62 |         data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); | 
| Mathias Agopian | 285dbde | 2010-03-01 16:09:43 -0800 | [diff] [blame] | 63 |         data.writeString8(name); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 64 |         data.writeInt32(display); | 
 | 65 |         data.writeInt32(w); | 
 | 66 |         data.writeInt32(h); | 
 | 67 |         data.writeInt32(format); | 
 | 68 |         data.writeInt32(flags); | 
 | 69 |         remote()->transact(CREATE_SURFACE, data, &reply); | 
 | 70 |         params->readFromParcel(reply); | 
 | 71 |         return interface_cast<ISurface>(reply.readStrongBinder()); | 
 | 72 |     } | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 73 |  | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 74 |     virtual status_t destroySurface(SurfaceID sid) | 
 | 75 |     { | 
 | 76 |         Parcel data, reply; | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 77 |         data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor()); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 78 |         data.writeInt32(sid); | 
 | 79 |         remote()->transact(DESTROY_SURFACE, data, &reply); | 
 | 80 |         return reply.readInt32(); | 
 | 81 |     } | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 82 | }; | 
 | 83 |  | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 84 | IMPLEMENT_META_INTERFACE(SurfaceComposerClient, "android.ui.ISurfaceComposerClient"); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 85 |  | 
 | 86 | // ---------------------------------------------------------------------- | 
 | 87 |  | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 88 | status_t BnSurfaceComposerClient::onTransact( | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 89 |     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) | 
 | 90 | { | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 91 |      switch(code) { | 
 | 92 |         case CREATE_SURFACE: { | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 93 |             CHECK_INTERFACE(ISurfaceComposerClient, data, reply); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 94 |             surface_data_t params; | 
| Mathias Agopian | 285dbde | 2010-03-01 16:09:43 -0800 | [diff] [blame] | 95 |             String8 name = data.readString8(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 96 |             DisplayID display = data.readInt32(); | 
 | 97 |             uint32_t w = data.readInt32(); | 
 | 98 |             uint32_t h = data.readInt32(); | 
 | 99 |             PixelFormat format = data.readInt32(); | 
 | 100 |             uint32_t flags = data.readInt32(); | 
| Mathias Agopian | 0ef4e15 | 2011-04-20 14:19:32 -0700 | [diff] [blame] | 101 |             sp<ISurface> s = createSurface(¶ms, name, display, w, h, | 
| Mathias Agopian | 285dbde | 2010-03-01 16:09:43 -0800 | [diff] [blame] | 102 |                     format, flags); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 103 |             params.writeToParcel(reply); | 
 | 104 |             reply->writeStrongBinder(s->asBinder()); | 
 | 105 |             return NO_ERROR; | 
 | 106 |         } break; | 
 | 107 |         case DESTROY_SURFACE: { | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 108 |             CHECK_INTERFACE(ISurfaceComposerClient, data, reply); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 109 |             reply->writeInt32( destroySurface( data.readInt32() ) ); | 
 | 110 |             return NO_ERROR; | 
 | 111 |         } break; | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 112 |         default: | 
 | 113 |             return BBinder::onTransact(code, data, reply, flags); | 
 | 114 |     } | 
 | 115 | } | 
 | 116 |  | 
 | 117 | // ---------------------------------------------------------------------- | 
 | 118 |  | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 119 | status_t ISurfaceComposerClient::surface_data_t::readFromParcel(const Parcel& parcel) | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 120 | { | 
| Mathias Agopian | 1c97d2e | 2009-08-19 17:46:26 -0700 | [diff] [blame] | 121 |     token    = parcel.readInt32(); | 
 | 122 |     identity = parcel.readInt32(); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 123 |     return NO_ERROR; | 
 | 124 | } | 
 | 125 |  | 
| Mathias Agopian | 7e27f05 | 2010-05-28 14:22:23 -0700 | [diff] [blame] | 126 | status_t ISurfaceComposerClient::surface_data_t::writeToParcel(Parcel* parcel) const | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 127 | { | 
 | 128 |     parcel->writeInt32(token); | 
 | 129 |     parcel->writeInt32(identity); | 
| The Android Open Source Project | edbf3b6 | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 130 |     return NO_ERROR; | 
 | 131 | } | 
 | 132 |  | 
 | 133 | }; // namespace android |