blob: c1c959636bea933e43b6d8d78ec3d8afac3b074a [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/*
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#include <stdio.h>
18#include <stdint.h>
19#include <sys/types.h>
20
21#include <utils/Parcel.h>
22#include <utils/IMemory.h>
23
24#include <ui/ISurface.h>
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080025#include <ui/Overlay.h>
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070026
27
28namespace android {
29
30enum {
31 REGISTER_BUFFERS = IBinder::FIRST_CALL_TRANSACTION,
32 UNREGISTER_BUFFERS,
33 POST_BUFFER, // one-way transaction
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080034 CREATE_OVERLAY,
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070035};
36
37class BpSurface : public BpInterface<ISurface>
38{
39public:
40 BpSurface(const sp<IBinder>& impl)
41 : BpInterface<ISurface>(impl)
42 {
43 }
44
45 virtual status_t registerBuffers(int w, int h, int hstride, int vstride,
46 PixelFormat format, const sp<IMemoryHeap>& heap)
47 {
48 Parcel data, reply;
49 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
50 data.writeInt32(w);
51 data.writeInt32(h);
52 data.writeInt32(hstride);
53 data.writeInt32(vstride);
54 data.writeInt32(format);
55 data.writeStrongBinder(heap->asBinder());
56 remote()->transact(REGISTER_BUFFERS, data, &reply);
57 status_t result = reply.readInt32();
58 return result;
59 }
60
61 virtual void postBuffer(ssize_t offset)
62 {
63 Parcel data, reply;
64 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
65 data.writeInt32(offset);
66 remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
67 }
68
69 virtual void unregisterBuffers()
70 {
71 Parcel data, reply;
72 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
73 remote()->transact(UNREGISTER_BUFFERS, data, &reply);
74 }
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -080075
76 virtual sp<Overlay> createOverlay(
77 uint32_t w, uint32_t h, int32_t format)
78 {
79 Parcel data, reply;
80 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
81 data.writeInt32(w);
82 data.writeInt32(h);
83 data.writeInt32(format);
84 remote()->transact(CREATE_OVERLAY, data, &reply);
85 return Overlay::readFromParcel(reply);
86 }
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -070087};
88
89IMPLEMENT_META_INTERFACE(Surface, "android.ui.ISurface");
90
91// ----------------------------------------------------------------------
92
93#define CHECK_INTERFACE(interface, data, reply) \
94 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
95 LOGW("Call incorrectly routed to " #interface); \
96 return PERMISSION_DENIED; \
97 } } while (0)
98
99status_t BnSurface::onTransact(
100 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
101{
102 switch(code) {
103 case REGISTER_BUFFERS: {
104 CHECK_INTERFACE(ISurface, data, reply);
105 int w = data.readInt32();
106 int h = data.readInt32();
107 int hs= data.readInt32();
108 int vs= data.readInt32();
109 PixelFormat f = data.readInt32();
110 sp<IMemoryHeap> heap(interface_cast<IMemoryHeap>(data.readStrongBinder()));
111 status_t err = registerBuffers(w,h,hs,vs,f,heap);
112 reply->writeInt32(err);
113 return NO_ERROR;
114 } break;
115 case UNREGISTER_BUFFERS: {
116 CHECK_INTERFACE(ISurface, data, reply);
117 unregisterBuffers();
118 return NO_ERROR;
119 } break;
120 case POST_BUFFER: {
121 CHECK_INTERFACE(ISurface, data, reply);
122 ssize_t offset = data.readInt32();
123 postBuffer(offset);
124 return NO_ERROR;
125 } break;
The Android Open Source Projecte09fd9e2008-12-17 18:05:43 -0800126 case CREATE_OVERLAY: {
127 CHECK_INTERFACE(ISurface, data, reply);
128 int w = data.readInt32();
129 int h = data.readInt32();
130 int f = data.readInt32();
131 sp<Overlay> o = createOverlay(w, h, w);
132 return Overlay::writeToParcel(reply, o);
133 } break;
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -0700134 default:
135 return BBinder::onTransact(code, data, reply, flags);
136 }
137}
138
139}; // namespace android