ISurface.cpp revision 000479f9e325b4e426a67033abd92d47da412725
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#define LOG_TAG "ISurface"
18
19#include <stdio.h>
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <binder/Parcel.h>
24#include <binder/IMemory.h>
25
26#include <ui/Overlay.h>
27#include <ui/GraphicBuffer.h>
28
29#include <surfaceflinger/Surface.h>
30#include <surfaceflinger/ISurface.h>
31
32namespace android {
33
34// ----------------------------------------------------------------------
35
36ISurface::BufferHeap::BufferHeap()
37    : w(0), h(0), hor_stride(0), ver_stride(0), format(0),
38    transform(0), flags(0)
39{
40}
41
42ISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
43        int32_t hor_stride, int32_t ver_stride,
44        PixelFormat format, const sp<IMemoryHeap>& heap)
45    : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
46      format(format), transform(0), flags(0), heap(heap)
47{
48}
49
50ISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
51        int32_t hor_stride, int32_t ver_stride,
52        PixelFormat format, uint32_t transform, uint32_t flags,
53        const sp<IMemoryHeap>& heap)
54        : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
55          format(format), transform(transform), flags(flags), heap(heap)
56{
57}
58
59
60ISurface::BufferHeap::~BufferHeap()
61{
62}
63
64// ----------------------------------------------------------------------
65
66class BpSurface : public BpInterface<ISurface>
67{
68public:
69    BpSurface(const sp<IBinder>& impl)
70        : BpInterface<ISurface>(impl)
71    {
72    }
73
74    virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage)
75    {
76        Parcel data, reply;
77        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
78        data.writeInt32(bufferIdx);
79        data.writeInt32(usage);
80        remote()->transact(REQUEST_BUFFER, data, &reply);
81        sp<GraphicBuffer> buffer = new GraphicBuffer(reply);
82        return buffer;
83    }
84
85    virtual status_t registerBuffers(const BufferHeap& buffers)
86    {
87        Parcel data, reply;
88        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
89        data.writeInt32(buffers.w);
90        data.writeInt32(buffers.h);
91        data.writeInt32(buffers.hor_stride);
92        data.writeInt32(buffers.ver_stride);
93        data.writeInt32(buffers.format);
94        data.writeInt32(buffers.transform);
95        data.writeInt32(buffers.flags);
96        data.writeStrongBinder(buffers.heap->asBinder());
97        remote()->transact(REGISTER_BUFFERS, data, &reply);
98        status_t result = reply.readInt32();
99        return result;
100    }
101
102    virtual void postBuffer(ssize_t offset)
103    {
104        Parcel data, reply;
105        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
106        data.writeInt32(offset);
107        remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
108    }
109
110    virtual void unregisterBuffers()
111    {
112        Parcel data, reply;
113        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
114        remote()->transact(UNREGISTER_BUFFERS, data, &reply);
115    }
116
117    virtual sp<OverlayRef> createOverlay(
118             uint32_t w, uint32_t h, int32_t format, int32_t orientation)
119    {
120        Parcel data, reply;
121        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
122        data.writeInt32(w);
123        data.writeInt32(h);
124        data.writeInt32(format);
125        data.writeInt32(orientation);
126        remote()->transact(CREATE_OVERLAY, data, &reply);
127        return OverlayRef::readFromParcel(reply);
128    }
129};
130
131IMPLEMENT_META_INTERFACE(Surface, "android.ui.ISurface");
132
133// ----------------------------------------------------------------------
134
135status_t BnSurface::onTransact(
136    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
137{
138    switch(code) {
139        case REQUEST_BUFFER: {
140            CHECK_INTERFACE(ISurface, data, reply);
141            int bufferIdx = data.readInt32();
142            int usage = data.readInt32();
143            sp<GraphicBuffer> buffer(requestBuffer(bufferIdx, usage));
144            return GraphicBuffer::writeToParcel(reply, buffer.get());
145        }
146        case REGISTER_BUFFERS: {
147            CHECK_INTERFACE(ISurface, data, reply);
148            BufferHeap buffer;
149            buffer.w = data.readInt32();
150            buffer.h = data.readInt32();
151            buffer.hor_stride = data.readInt32();
152            buffer.ver_stride= data.readInt32();
153            buffer.format = data.readInt32();
154            buffer.transform = data.readInt32();
155            buffer.flags = data.readInt32();
156            buffer.heap = interface_cast<IMemoryHeap>(data.readStrongBinder());
157            status_t err = registerBuffers(buffer);
158            reply->writeInt32(err);
159            return NO_ERROR;
160        } break;
161        case UNREGISTER_BUFFERS: {
162            CHECK_INTERFACE(ISurface, data, reply);
163            unregisterBuffers();
164            return NO_ERROR;
165        } break;
166        case POST_BUFFER: {
167            CHECK_INTERFACE(ISurface, data, reply);
168            ssize_t offset = data.readInt32();
169            postBuffer(offset);
170            return NO_ERROR;
171        } break;
172        case CREATE_OVERLAY: {
173            CHECK_INTERFACE(ISurface, data, reply);
174            int w = data.readInt32();
175            int h = data.readInt32();
176            int f = data.readInt32();
177            int orientation = data.readInt32();
178            sp<OverlayRef> o = createOverlay(w, h, f, orientation);
179            return OverlayRef::writeToParcel(reply, o);
180        } break;
181        default:
182            return BBinder::onTransact(code, data, reply, flags);
183    }
184}
185
186}; // namespace android
187